⑴ 用单片机编写的键盘扫描程序怎样编写它的求键号程序
要不要我帮你写一段,你后面没扫描,当然无法获取键值
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
⑵ 求单片机4*4矩形键盘行扫描法的扫描过程和原理!
反转法键盘扫描过程:1)P3高4位为列低4位为行让高4位为1低4位为0。2)判断是否有按键按下,如果有按键按下则高4位上的有一位为低电平。3)去抖动程序。4)继续判断。5)保存高4位上的按键情况。6)判断是否有按键按下,如果有按键按下则低4位上的有一位为低电平。7)去抖动。8)继续判断。9)保存低4位上的按键情况。
⑶ 单片机矩阵键盘按键行列逐级扫描法
unsigned
char
KeyScan(void)
//键盘扫描函数,使用行列逐级扫描法{
unsigned
char
Val;
KeyPort=0xf0;//这句其实就是整体看看是否有键按下,四行全送0,有键按下,高四位肯定不为全1
if(KeyPort!=0xf0)//表示有按键按下
{
DelayMs(10);
//去抖
if(KeyPort!=0xf0)
{
//表示有按键按下
KeyPort=0xfe;
//检测第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
//相当于检测到第一行有键按下,键值=列(高四位)+行(低四位)
while(KeyPort!=0xfe);
DelayMs(10);
//去抖
while(KeyPort!=0xfe);
return
Val;
}
⑷ 单片机键盘扫描程序
2*3的键盘,太简单了,不值得用循环,特别是双重循环。
最简明、高效的程序如下:
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
char scan_key(void)
{
P13 = 0;
if (!P10) return 0;
if (!P11) return 1;
if (!P12) return 2;
P13 = 1;
P14 = 0;
if (!P10) return 3;
if (!P11) return 4;
if (!P12) return 5;
}
本程序,使用的变量最少,也不涉及其它接口。
代码最少,执行效率最高。
⑸ 单片机汇编矩阵键盘实验(扫描法)
关于扫描按键的原理,可以看下面这篇文章。
本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。
首先通常想到的可能是下面这样的设计:
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。
总结
综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:
假设有N个IO口按照思路三可以识别N*(N-1)/2个;
按照思路四可识别N*(N-1)个;
按照思路5可以识别N*(N-1)+N个。
最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?