1、 OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口IN EQU 08001H ; 键盘读入口LEDBUF EQU 40H ; 显示缓冲ORG 0000HLJMP STARTORG 0100HLEDMAP: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ; 八段管显示码DB 7FH, 6fH, 77H, 7CH, 39H, 5EH, 79H, 71HDB 00H, 49HDELAY:MOV R7,#00H ; 延时子程序DELAYLOOP:DJNZ R7,DELAYLOOPDJNZ R6,DELAYLOOPRE
2、TDISPLAYLED:MOV R0,#LEDBUFMOV R1,#06H ; 共 6 个八段管MOV R2,#00100000B ; 从左边开始显示LOOP:MOV DPTR,#OUTBITMOV A,#0HMOVX DPTR,A ; 关所有八段管MOV A,R0MOV DPTR,#LEDMAPMOVC A,A+DPTR ;由序码求段码MOV DPTR,#OUTSEGMOVX DPTR,AMOV DPTR,#OUTBITMOV A,R2MOVX DPTR,A ; 显示一位八段管MOV R6,#01HCALL DELAYMOV A,R2 ; 显示下一位RR AMOV R2,AINC R0DJN
3、Z R1,LOOPRETTESTKEY:MOV DPTR,#OUTBITMOV A,#00HMOVX DPTR,A ; 输出线置为 0MOV DPTR,#INMOVX A,DPTR ; 读入键状态CPL AANL A,#0FH ; 高四位不用RETKEYTABLE: DB 16H,15H,14H,0FFH ; 键码定义DB 13H,12H,11H,10HDB 0DH,0CH,0BH,0AHDB 0EH,03H,06H,09HDB 0FH,02H,05H,08HDB 00H,01H,04H,07HGETKEY:MOV DPTR, #OUTBITMOV P2, DPHMOV R0, #LOW(IN
4、)MOV R1, #00100000BMOV R2, #06HKLOOP:MOV A, R1 ; 找出键所在列CPL AMOVX DPTR, ACPL ARR AMOV R1,A ; 下一列MOVX A , R0CPL AANL A, #0FHJNZ LOOP1 ; 该列有键入DJNZ R2, KLOOPMOV R2, #0FFH ;没有键按下, 返回 0ffhSJMP EXITLOOP1: MOV R1,A ; 键值 = 列 X 4 + 行MOV A,R2DEC ARL ARL AMOV R2,A ; r2 = (r2-1)*4MOV A,R1 ; r1 中为读入的行值MOV R1,#04H
5、LOOP2:RRC A ; 移位找出所在行JC EXITINC R2 ; r2 = r2+ 行值DJNZ R1,LOOP2Exit:MOV A, R2 ; 取出键码MOV DPTR, #KEYTABLEMOVC A,A+DPTRMOV R2,AWAIT:MOV DPTR,#OUTBIT ; 等键释放CLR AMOVX DPTR, AMOV R6, #10HCALL DELAYCALL TESTKEYJNZ WAITMOV A, R2RETSTART:MOV SP, #60HMOV LEDBUF+0, #11H ; 显示 三 092MOV LEDBUF+1, #00HMOV LEDBUF+2, #09HMOV LEDBUF+3, #02HMOV LEDBUF+4, #0MOV LEDBUF+5, #0MAIN:CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JZ MAIN ; 无键入, 继续显示CALL GETKEYMOV R5,A ; 读入键码ANL A, #0F0H ; 显示键码SWAP AMOV LEDBUF+4,AMOV A,R5ANL A,#0FHMOV LEDBUF+5,ALJMP MAINEND