1、C口的高四位做输出,低四位做输入,分别控制4行4列的键盘。同样可以写出初始化程序来选择第一行的2个键有效,以此控制两种箭头的切换。然后设置8255A的工作方式控制字,各口工作方式均为0,确定为1000001B,写入其控制端口。完善程序后,再加入时间延时程序,每个初始化都调用该程序,选择合适的时间,并在每次子程序(如向上 的箭头)结尾加上循环跳转到程序开头,不断地重复每一个初始化过程,这样,不停地运行,看起来就是连接起来的似乎是不变的静态的两种箭头(2)动态箭头显示原理 接下来考虑实现动态两种箭头显示。本环节主要是改变程序,应用程序控制来实现动态。在子程序中加入循环,使每一行或列的同样的初始字在
2、不同的循环次数时显示在不同的行或列,并保证所有的同步循环,以保持箭头的形状,再一次加入延时程序,使完成每次移动的时间适中,不要太快也不要太慢。这样就实现了各行各列同步移动的现象,也就是动态显示的过程。(3)键控功能实现原理 最后要实现键控功能。同样是修改汇编程序,首先写入初始字,是第一行的两个键有效,不断地扫描两个键的电平,并从端口中读入信息,由于每次仅有一个键按下去,因此读入的两位码中只有一个是高电平,如是1000的时候,我们将其分别于1,2,4,8进行比较,当相等时则转到相应的箭头程序,判断后等于8,可确定是3键按下,因此转去执行向上的箭头程序,直到下一次的比较成立,则转去相应的程序,以此
3、实现了键控的功能。三、设计调试总结(包括对设计的目的和意义的认识、本人完成情况、设计中的主要收获和不足)通过本次微机原理与接口技术的课程设计,进行程序设计编程和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和方法,通过动手能力的培养,进一步熟练汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。但是,在课程设计过程中也遇到了很多问题,充分了解了自己对课程掌握的不足,不过后来也通过自己的进一步学习和老师同学的帮助解决了问题,最后完成了动态方向箭头控制及显示接口设计,掌握了试验箱上小键盘控制点矩阵的原理,也进一步掌握了8255的工作原理。二、 程序清单(
4、注:程序清单使用5号字体,单倍行距排版) STACK1 SEGMENT STACK DB 256 DUP(?) STACK1 ENDS DATA SEGMENT DIS0 DB PRESS ANY OF THE KEYS TO QUIT!$ ;提示信息 I8255TYPE DW 0003H ;8255控制字的地址 I8255ADDA DW 0000H ;8255的A口地址 I8255ADDB DW 0001H ;8255的B口地址 I8255ADDC DW 0002H ; 8255的C口地址 KEY_SV DB 0,0,1,0,2,0,0,0,3 KEY_V_BUF DB ? SCAN_V D
5、B ? KEY_HV DB ? DIS1 DB PCI ADDRESS 0 $ DIS2 DB PCI ADDRESS 1 $ DIS3 DB PCI MEMORY ADDRESS $ DIS4 DB PCI INTERRUPT LINE $ DIS5 DB BIOS NOT SUPPER! DIS6 DB READ PCI BOARD FAIL!;-PCI Configuration Space Registers- PCI_CS_VENDOR_ID EQU 0 PCI_CS_DEVICE_ID EQU 2 PCI_CS_COMMAND EQU 4 PCI_CS_STATUS EQU 6 P
6、CI_CS_REVISION EQU 8 PCI_CS_CLASS_CODE EQU 9 PCI_CS_CACHE_LINE_SIZE EQU 0CH PCI_CS_MASTER_LATENCY EQU 0DH PCI_CS_HEADER_TYPE EQU 0EH PCI_CS_BIST EQU 0FH PCI_CS_BASE_ADDRESS_0 EQU 10H PCI_CS_BASE_ADDRESS_1 EQU 14H PCI_CS_BASE_ADDRESS_2 EQU 18H PCI_CS_BASE_ADDRESS_3 EQU 1CH PCI_CS_BASE_ADDRESS_4 EQU 2
7、0H PCI_CS_BASE_ADDRESS_5 EQU 24H PCI_CS_EXPANSION EQU 30H PCI_CS_INTERRUPT_LINE EQU 3CH PCI_CS_INTERRUPT_PIN EQU 3DH PCI_CS_MIN_GNT EQU 3EH PCI_CS_MAX_LAT EQU 3FH-END- ADDRESS_IO_0 DW ? ADDRESS_IO_1 DW ? DATA ENDS CODE SEGMENT CODE ASSUME CS:CODE,SS:STACK1,DS:DATA START: PUSH DS XOR AX,AX PUSH AX MO
8、V AX,DATA MOV DS,AX MOV AH,0B1H ;读配置资源 MOV AL,1H INT 1AH CMP AH,0 JZ STAR1 MOV DX,OFFSET DIS5 JMP M_EXIT STAR1: MOV AH,0B1H MOV AL,02H MOV CX,8376H MOV DX,10EBH MOV SI,0 JNC AA MOV DX,OFFSET DIS6 MOV AH,9 INT 21H AA: MOV AL,09H MOV DI,PCI_CS_BASE_ADDRESS_1 JZ STAR2 MOV DX,OFFSET DIS1 STAR2: AND CX,0
9、FFFCH MOV AX,CX MOV ADDRESS_IO_0,AX MOV DI,PCI_CS_BASE_ADDRESS_3 JZ STAR3 STAR3: MOV ADDRESS_IO_1,AX ADD I8255TYPE,AX ADD I8255ADDA,AX ADD I8255ADDB,AX ADD I8255ADDC,AX MOV AL,3 MOV AH,0 INT 10H MOV DX,OFFSET DIS0 ;显示提示 MOV AH,0FFH MOV DX,I8255TYPE ;初始8255的C口 pc4pc7为输出,pc03为输入 MOV AL, 81H OUT DX,AL
10、MOV KEY_V_BUF,0FFH MAIN_LP: CALL KEYSCAN CMP AL,KEY_V_BUF JZ MNLP1 CMP AL,0FFH MOV KEY_V_BUF,AL CALL DISPLAY1 MNLP1: CALL TIME CALL PCKEY JMP MAIN_LP M_EXIT: MOV AX,4C00H DISPH PROC NEAR PUSH BX PUSH CX MOV CX,4 MOV CH,4 DISPH1: ROL AX,CL AND AL,0FH AND AL,30H CMP AL,9 JBE DISPH2 ADD AL,7 DISPH2: MO
11、V AH,2 MOV DL,AL POP AX DEC CH JNZ DISPH1 POP CX POP BX RET DISPH ENDP DISPLAY1 PROC NEAR CMP AL,10H JL DSPLY1 DSPLY1: ADD AL,30H JBE DISP_H DISP_H: DISPLAY1 ENDP KEYSCAN PROC NEAR MOV KEY_HV,0 MOV SCAN_V,80H SCAN_LP: MOV AL,SCAN_V MOV DX,I8255ADDC IN AL,DX MOV BL,AL AND BL,0FH MOV AL,BL ;得c口0-3位数据
12、CMP AL,2 JZ CCP1 CMP AL,8 JZ CCP41 MOV BX,OFFSET KEY_SV MOV SI,AX MOV AL,BX+SI ADD AL,KEY_HV CCP1:CALL DISPLAY1 MOV DX,I8255ADDA MOV AL,0F7H MOV DX,I8255ADDB MOV AL,10H ; 显示个位 ROL AL,CL CALL TIME1 MOV AL,0E3H MOV AL,08H ; MOV AL,0D5H MOV AL,04H ; MOV AL,02H ; INC CL DEC AL CMP AL,0 JMP KEYSCAN CCP41
13、: JMP CCP42 CCP42: JMP CCP4 CCP4: ROR AL,CL CALL TIME3 MOV AL,20H ; MOV AL,40H ; JZ CCP4 TIME1 PROC NEAR MOV AX,0EFH T4: DEC AX MOV BX,0FFFFH T3: DEC BX JNZ T3 CMP AX,0 JNZ T4 TIME1 ENDP TIME2 PROC NEAR MOV AX,0FFFFH T6: MOV BX,01EFH T5: JNZ T5 JNZ T6 TIME2 ENDP TIME3 PROC NEAR MOV AX,01EFH T8: T7:
14、JNZ T7 JNZ T8 TIME3 ENDP TIME4 PROC NEAR T10: T9: JNZ T9 JNZ T10 TIME4 ENDP KYSC1: ADD KEY_HV,4 ROL SCAN_V,1 CMP SCAN_V,1 JNZ KYSC2 MOV AL,0FFH KYSC2: JMP SCAN_LP KEYSCAN ENDP PCKEY PROC NEAR MOV AH,6 MOV DL,0FFH JE P1 P1: PCKEY ENDP TIME PROC NEAR MOV AX,0FFH T2: MOV BX,0FFFH T1: JNZ T1 JZ T2 TIME ENDP CODE ENDS END START