用单片机编写的键盘扫描程序怎样编写它的求键号程序?

来源:百度知道 编辑:UC知道 时间:2024/05/16 19:37:27
p1.0~p1.3接行输入,p1.4~P1.7接列输出,没接显示

用线反转法扫描矩阵键盘示例程序:
t1:mov p1,#0fh ;p1接口高4位为0,低4位输入
mov a,p1 ;读p1
anl a,#0fh ;屏蔽高4位
cjne a,#0fh,t2 ;有键按下转t2
sjmp t1 ;无键按下转回
t2:lcall delay10;延时10ms,去抖
mov a,p1 ;重新扫描p1口
anl a,#0fh
mov b,a ;行线状态在b的低4位
cjne a,#0fh,t3 ;确认有键按下,转判哪一键按下
sjmp t1 ;是抖动,转回
t3:mov p1,#0f0h ;置p1口高4位输入,低4位为0
mov a,p1 ;读p1列状态
anl a,#0f0h ;屏蔽高4位
orl a,b ;列线状态在高4位,与行线状态合成与a
...... ;键处理

键处理必须得知道键号,所以
我想问下怎样编写键号处理的程序,要求能用<公式:键号=所在行号*键盘列数+列号>求出按键时所对应的键号
请高手指点下

要不要我帮你写一段,你后面没扫描,当然无法获取键值
t1:mov p1,#0fh ;p1接口高4位为0,低4位输入
mov a,p1 ;读p1
anl a,#0fh ;屏蔽高4位
cjne a,#0fh,t2 ;有键按下转t2
sjmp t1 ;无键按下转回
t2:lcall delay10;延时10ms,去抖
mov a,p1 ;重新扫描p1口
anl a,#0fh
cjne a,#0fh,t3
sjmp t1
t3:mov r0,#00 ;行计数值
mov r1,#00 ;列计数值
mov r3,#0efh ;扫描初值
t4:mov a,r3
mov p1,a;输出行扫描字
mov a,p1
mov r1,a
anl a,#0fh
cjne a,#0fh,t5 ;该行有键按下
inc r0 ;行计数器加1 ,扫下一行
MOV A,R3
RLC A
MOV R3,A
MOV A,R0
CJAE A,#04H,t4 ;扫到最后一行?
t6: ret ;结束
t5:mov a,r1
jnb acc.0,t7
jnb acc.1,t8
jnb acc.2,t9
jnb acc.3,t10
sjmp t6
t7: mov r2,#00 ;0列号
sjmp t11
t8:mov r2,#01 ;1列号
sjmp t11
t9:mov r2,#02 ;2列号
sjmp t11
t10:mov r2,#03 ;3列号
t11:mov a,r0
mov b,#04
mul ab ;行号乘4
add a,r2 ;键值在A中
ret