键码 引脚
0 p1.0 p1.4
1 p1.1 p1.4
2 p1.2 p1.4
3 p1.3 p1.4
4 p1.0 p1.5
5 p1.1 p1.5
6 p1.2 p1.5
7 p1.3 p1.5
以此类推
程序为:
KEYMARK BIT 00H;键是否按下
KEY: MOV P1,#0FH ;所有输出行全为0
MOV A,P1 ;读取输入信号
ANL A,#0FH
CJNE A,#0FH,KEY1 ;输入不全为1,有键按下
JMP KEY3 ;无键按下,返回
KEY1:
CALL DELAY ;延时去抖动
MOV A,#0EFH ;输入扫描值
KEY2:
MOV P1,A ;扫描输出
MOV R1,A ;存输出值
MOV A,P1 ;读输入值
ANL A,#0FH
CJNE A,#0FH,KVALUE ;转键值计算
MOV A,R1 ;准备扫描下一行
SETB C ;C置位
RLC A ;左移一次
JC KEY2 ;如果C=1,说明尚未扫描完毕,转
KEY3:
CLR KEYMARK ;清键按下标志
RET
KVALUE:
MOV B,#0FBH ;置初值即11110111b
KEY4:
RRC A ;输出值运算
INC B ;B中的值加一
JC KEY4 ;如果C=1,则转
MOV A,R1 ;输入值运算
SWAP A
KEY5:
RRC A
INC B
INC B
INC B
INC B
JC KEY5
KEY6:
MOV A,P1 ;等待按键的释放
ANL A,#0FH
CJNE A,#0FH,KEY6
SETB KEYMARK ;本次按键有效
RET
DELAY:
……
ret
我觉得输出的扫描值应该为11101111、11011111、10111111、01111111
而本程序却用了
RLC A
这样扫描值就成了:11101111、11011110、10111100、01111000
本人觉得不对,但由于我是初学者,看的书也比较权威,所以这个问题期待大虾帮助