KEYBUF EQU 40H ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值 MOV R0,#30H ;显示首地址 MOV R2,#0CH ;计算数据存放单元个数 CLR A QING: MOV @R0,A ;将数据存放单元清零 INC R0 DJNZ R2,QING MOV P0,#8FH ;关闭显示 MOV R1,#30H ;将显示首地址存放R1 里 ;=============================================== ;五位无符号显示子程序 DIS1: MOV R0,#30H ;把显示数据第一位放在 R0 里 MOV R2,#04H ;把显示的位码放在 R2 里 MOV R3,#05H ;把显示的长度放在 R3 里 DIS2: MOV A,@R0 ANL A,#0FH ;屏蔽显示数据的高四位 MOV B,A MOV A,R2 ANL A,#0FH ;屏蔽位码的高四位 SWAP A ORL A,B MOV P0,A ;送总显示数据到 P0 显示 LCALL DELY4ms ;调用延时 4ms INC R0 ;取下一个显示数据 DEC R2 DJNZ R3,DIS2 ;四位显示晚后重新开始显示 ;=================================================== ;键盘扫描子程序 WAIT: MOV P1,#0FFH ;P1 口送高电平 CLR P1.0 ;第一行清零 MOV A,P1 ;读 P1 口 ANL A,#0F0H ;低位屏蔽 XRL A,#0F0H ;判断低位是否有低电平 ,即判断是否有按键按下 JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描 LCALL DELY10ms ;延时 10ms去抖在进行判断是否有按键按下 MOV A,P1 ;继续读 P1 口 ANL A,#0F0H ;判断低位是否有低电平 CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H 就转到 NK1 MOV KEYBUF,#0 ;否者判断为0 号键 AJMP DK ;转 DK1 查表程序 NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H 就转到NK2 MOV KEYBUF,#1 ;否者判断为1 号键 AJMP DK ;转DK2 查表程序 NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H 就转到NK3 MOV KEYBUF,#2 ;否者判断为2 号键 AJMP DK ;转DK3 查表程序 NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H 就转到NK4 LJMP SAN_CHU NK4: NOP NOKEY1: MOV P1,#0FFH ;和上面相同 CLR P1.1 MOV A,P1 ANL A,#0F0H XRL A,#0F0H JZ NOKEY2 LCALL DELY10MS MOV A,p1 ANL A,#0F0H XRL A,#0F0H JZ NOKEY2 MOV A,P1 ANL A,#0F0H CJNE A,#0E0H,NK5 MOV KEYBUF,#3 AJMP DK NK5: CJNE A,#0D0H,NK6 MOV KEYBUF,#4 AJMP DK NK6: CJNE A,#0B0H,NK7 MOV ...