1、键盘扫描P 2 . 0P 2 . 1P 2 . 2P 2 . 3P 2 . 4P 2 . 5P 2 . 6P 2 . 7行列P 2 . 0P 2 . 1P 2 . 2P 2 . 3P 2 . 5P 2 . 6P 2 . 7行列图 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_K
2、EY=1; 输入键盘码放入键盘存储器 KEYBUFF; 面板上键盘为 1 2 3 C; 4 5 6 D7 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 口MOV A,P2; 读入 P2 值,判断是否有键按下MOV R4,A; 存入 P2 值,以判断是否放开按键SETB C; 后用带循环移位 MOV R5,#04H; 先扫描 4 列(如为 4*3 键盘此处 MOV R5,#03H)L3: RLC A; 先从 P2.3 相
3、接这一行 P2.4-P2.7 哪个键按下了JNC KEYIN ; C=0 则有键按下,跳至 KEYININC R2; C=1 表明没有键按下,取码指针加 1DJNZ R5,L3; 3 列扫描完毕?MOV A,R3; 扫描值载入SETB CRRC A; 扫描下一行MOV R3,A; 存回扫描寄存器JC L2; 4 行扫完? 没有则回 L2 继续扫描RET; 一遍扫描完返回;-KEYIN:MOV R7,#60; 30MS 消抖动(晶振 12MHZ)D2: MOV R6,#248DJNZ R6,$DJNZ R7,D2D3: MOV A,P2; 读入 P2 值,判断换键是否松开XRL A,R4; 与上
4、次值 XX 比较JZ D3; ACC=0 表示未放MOV A,R2 ; 按钮已松开,取码指针载入MOV DPTR,#KEYSCAN_TABMOVC A,A+DPTRSETB FLAG_KEY; 键盘扫描一次有输入标志位置位MOV KEYBUFF, A ;键盘码放入键盘存储器 KEYBUFFRET;=; 键盘扫描码KEYSCAN_TAB:DB 01H,02H,03H,0CH DB 04H,05H,06H,0DHDB 07H,08H,09H,0DHDB 0AH,00H,0BH,0FH;-;*键盘扫描结束 *;* 键盘扫描子程序 SCANKEY *; 4*3 键盘扫描子程序; 行接 P2.0-P2.
5、3,列接 P2.4-P2.6; 调用该子程序扫描一遍键盘; 键盘如有按键,则标志位 FLAG_KEY=1; 输入键盘码放入键盘存储器 KEYBUFF; 面板上键盘为 1 2 3 4; 5 6 7 8; 9 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 CMOV R5,#03H; 先扫描 3 列RLC A ; 由于 P2.
6、7 没有接,故先左移一位,让 P2.6 位进入 CyL3: RLC A; 先从 P2.3 相接这一行 P2.4-P2.6 哪个键按下了JNC KEYIN ; C=0 则有键按下,跳至 KEYININC R2; C=1 表明没有键按下,取码指针加 1DJNZ R5,L3; 3 列扫描完毕?MOV A,R3; 扫描值载入SETB CRRC A; 扫描下一行MOV R3,A; 存回扫描寄存器JC L2; 4 行扫完? 没有则回 L2 继续扫描RET; 一遍扫描完返回;-KEYIN:MOV R7,#60; 30MS 消抖动(晶振 12MHZ)D2: MOV R6,#248DJNZ R6,$DJNZ R7,D2D3: MOV A,P2; 读入 P2 值,判断换键是否松开XRL A,R4; 与上次值 XX 比较JZ D3; ACC=0 表示未放MOV A,R2 ; 按钮已松开,取码指针载入MOV DPTR,#KEYSCAN_TABMOVC A,A+DPTRSETB FLAG_KEY; 键盘扫描一次有输入标志位置位MOV KEYBUFF, A ;键盘码放入键盘存储器 KEYBUFFRET;=; 键盘扫描码KEYSCAN_TAB:DB 04H,08H,0BH ;A,B 代表*,#DB 03H,07H,0AHDB 02H,06H,00HDB 01H,05H,09H;-;*键盘扫描结束 *