MAIN: CLR P1.4 MOV R4,#00H;初始化按键值 LOOP: MOV R0,#00H;扫描计数器 NEXT: SETB P1.5 CLR P1.6;初始化HC138输入信号,选中U4 MOV P2,#0FFH;关显示 MOV A,R4 MOV DPTR,#DISPCODE MOVC A,@A+DPTR;查找显示内容 MOV P0,A;将查到的显示内容送P0口 SETB P1.7 CLR P1.7;将P0口数据锁存到U4 MOV A,R0 MOV DPTR,#SCAN MOVC A,@A+DPTR;查找位扫描数据 MOV P2,A;位扫描数据送P2口 ACALL DELAY CLR P1.5 SETB P1.6 SETB P1.7;选通HC244(U6) MOV A,P0;读取按键状态 CPL A CLR P1.7; CJNE A,#00H,KEY;判断是否有键按下 AJMP NOKEY;无键按下则不处理键值 KEY: MOV R2,#00H;按键所在的列号清零 CLR C;清除CY MVBIT:RRC A INC R2 JNC MVBIT;循环移位,以获取按键所在的列号 MOV A,R0;当前扫描的行号 MOV B,#08H MUL AB;行号乘 ADD A,R2;行列组合,得到按键值 MOV R4,A;保存按键值 NOKEY:INC R0 CJNE R0,#06H,NEXT;判断位数码管是否扫描完一次,没扫描完则继续 AJMP LOOP;扫描完一次尽行下一次扫描
SCAN: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH;位扫描数据
DISPCODE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H;1,2,3,4,5,6,的显示码 DB 0F8H,80H,90H,88H,83H,0C6H;7,8,9,A,B,C DB 0A1H,86H,8EH,0BFH;D,E,F,-
DELAY: MOV R3,#01H;延时 LOOP2: MOV R1,#0FFH LOOP1: DJNZ R1,LOOP1 DJNZ R3,LOOP2 RET END 3、将程序修改为按键时在LED上循环显示所按键值(按第一个键时,第一个LED显示对应键值,按第二个键时,第二个LED显示对应键值,。。。,按第七个键时,第一个LED显示对应键值,按第八个键时,第二个LED显示对应键值。。。) 用了74HC13,,74HC574,8*2键盘接有缓冲器 |