1、键盘扫描 图a 4*4键盘 图b 4*3键盘 扫描步骤: 1. P2.3=0行扫描初值; 2. P2左移检测列; 3. P2右移扫描行; 4. 计数指针到表中取码(读入键盘值由表中的数据一一对应)。 ;********************** 键盘扫描子程序 SCANKEY ********** ; 4*4键盘扫描子程序 ; 行接P2.0-P2.3,列接P2.4-P2.7 ; 调用该子程序扫描一遍键盘 ; 键盘如有按键,则标志位FLAG_KEY=1 ; 输入键盘
2、码放入键盘存储器KEYBUFF ; 面板上键盘为 1 2 3 C ; 4 5 6 D 7 8 9 E ; A 0 B F ;*************************************** SCANKEY: MOV R3,#0F7H; 扫描初值(P2.3=0) MOV R2,#00H; R2为取键盘码指针 L2: MOV A,R3; 开始扫描 MOV P2,A; 扫描值输出至P2口
3、 MOV A,P2; 读入P2值,判断是否有键按下 MOV R4,A; 存入P2值,以判断是否放开按键 SETB C; 后用带循环移位 MOV R5,#04H; 先扫描4列(如为4*3键盘此处MOV R5,#03H) L3: RLC A; 先从P2.3相接这一行P2.4-P2.7哪个键按下了 JNC KEYIN ; C=0则有键按下,跳至KEYIN INC R2; C=1表明没有键按下,取码指针加1
4、 DJNZ R5,L3; 3列扫描完毕? MOV A,R3; 扫描值载入 SETB C RRC A; 扫描下一行 MOV R3,A; 存回扫描寄存器 JC L2; 4行扫完?没有则回L2继续扫描 RET; 一遍扫描完返回 ;------------------------------------------------- KEYIN: MOV
5、 R7,#60; 30MS消抖动(晶振12MHZ) D2: MOV R6,#248 DJNZ R6,$ DJNZ R7,D2 D3: MOV A,P2; 读入P2值,判断换键是否松开 XRL A,R4; 与上次值XX比较 JZ D3; ACC=0表示未放 MOV A,R2 ; 按钮已松开,取码指针载入 MOV DPTR,#KEYSCAN_TAB MOVC A,@A+DPTR
6、 SETB FLAG_KEY; 键盘扫描一次有输入标志位置位 MOV KEYBUFF, A ;键盘码放入键盘存储器KEYBUFF RET ;=========================================== ; 键盘扫描码 KEYSCAN_TAB: DB 01H,02H,03H,0CH DB 04H,05H,06H,0DH DB 07H,08H,09H,0DH DB 0AH,00H,0BH,0FH ;---------------------
7、 ;***************键盘扫描结束**************************** ;********************** 键盘扫描子程序 SCANKEY ********** ; 4*3键盘扫描子程序 ; 行接P2.0-P2.3,列接P2.4-P2.6 ; 调用该子程序扫描一遍键盘 ; 键盘如有按键,则标志位FLAG_KEY=1 ; 输入键盘码放入键盘存储器KEYBUFF ; 面板上键盘为 1 2 3 4 ; 5 6 7 8 ; 9
8、0 A B ;*************************************** SCANKEY: MOV R3,#0F7H; 扫描初值(P2.3=0) MOV R2,#00H; R2为取键盘码指针 L2: MOV A,R3; 开始扫描 MOV P2,A; 扫描值输出至P2口 MOV A,P2; 读入P2值,判断是否有键按下 MOV R4,A; 存入P2值,以判断是否放开按键 SETB C
9、 MOV R5,#03H; 先扫描3列 RLC A ; 由于P2.7没有接,故先左移一位,让P2.6位进入Cy L3: RLC A; 先从P2.3相接这一行P2.4-P2.6哪个键按下了 JNC KEYIN ; C=0则有键按下,跳至KEYIN INC R2; C=1表明没有键按下,取码指针加1 DJNZ R5,L3; 3列扫描完毕? MOV A,R3; 扫描值载入 SET
10、B C RRC A; 扫描下一行 MOV R3,A; 存回扫描寄存器 JC L2; 4行扫完?没有则回L2继续扫描 RET; 一遍扫描完返回 ;------------------------------------------------- KEYIN: MOV R7,#60; 30MS消抖动(晶振12MHZ) D2: MOV R6,#248 DJNZ R6,$
11、 DJNZ R7,D2 D3: MOV A,P2; 读入P2值,判断换键是否松开 XRL A,R4; 与上次值XX比较 JZ D3; ACC=0表示未放 MOV A,R2 ; 按钮已松开,取码指针载入 MOV DPTR,#KEYSCAN_TAB MOVC A,@A+DPTR SETB FLAG_KEY; 键盘扫描一次有输入标志位置位 MOV KEYBUFF, A ;键盘码放入键盘存储器KEYBUFF RET ;=========================================== ; 键盘扫描码 KEYSCAN_TAB: DB 04H,08H,0BH ;A,B代表*,# DB 03H,07H,0AH DB 02H,06H,00H DB 01H,05H,09H ;----------------------------------- ;***************键盘扫描结束****************************






