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键盘接有缓冲器
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |