‘壹’ 简述单片机键盘扫描工作过程
键盘由行线列线交叉而成。列线接有上拉电阻。对第一行的行线置0,然后读取列线码,如果所有列线都是1说明买有被按下的键,继续扫描下一行。直到能读到0为止,读到0时所扫描的行就是该键的行码,而0所在的位是列码。一般的键盘扫描都做成中断形式,把列线所有线相与,只要有一个0就输出0,将这个信号送给中断,就可以实现在有键被按下时开启扫描了。
‘贰’ 单片机键盘扫描。
兄弟,你好
void key()
{uchar key1,key2,key3; 这条语句后就key1=key2=key3=0了,肯定就一直在key()函数中一直不出来了撒,你的key1等是按键,怎么没有分配一个IO口呢
你如果这样的话就可以了
void key()
{uchar key1,key2,key3;
key1=key2=key3=1;这样的话就不会一直在key()中了
要想达到效果,估计你还的弄几个按键
添几句
sbit key1=P3^0;
。。。。。。
再把 uchar key1,key2,key3;这一句删了,
你试一下,祝你成功
‘叁’ 单片机矩阵键盘按键行列逐级扫描法
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; }
‘肆’ C51单片机按键扫描
1.设置一个状态变量,如flag,定义flag=0为开状态,flag=1为关状态。
2.因为是按键(不是开关),所以实际上单片机读取的应该是脉冲形式的输入。设按键接单片机P01引脚,故可采用以下程序实现按键扫描
if(P01==0)//按下按键,进入下降沿
{
delay2();//20ms延时去按键前抖动
while(P01==0);//等待上升沿到
来,即按键弹起
flag=~flag;//flag取反,实现状态切换
}
void
delay2()//20ms延时子程序
{
unsigned
char
i,k;
for(i=0;i<100;i++)
for(k=0;k<100;k++);
}
注:根据按键的具体接法,若按下按键向单片机输入低电平,则采用以上程序;若按下按键向单片机输入高电平,则将两处P01==0均改为P01==1。
‘伍’ 用单片机编写的键盘扫描程序怎样编写它的求键号程序
要不要我帮你写一段,你后面没扫描,当然无法获取键值
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键盘扫描程序时如何开启的
按照行顺序,一行一行的开启,如下图:4*4共16键,假设P0.0-P0.3为H0-H3,P0.4-P0.7为L0-L3
(列)
L0
L1
L2
L3
(行)
H0
0
1
2
3
H1
4
5
6
7
H2
8
9
A
B
H3
C
D
E
F
首先让
H0
=
0,然后依次检测L0-L3,看那个键按下了
,则对应的L0-L3为0,这样第一行检测结束。比如扫描H0
行时
第一个键按下了,则L0=0,获得的P0=0xee,你也可以返回一个值,比如就是0,来代表第一个键(0)被按下,这样依次检测就扫描满16个键就行了。
‘柒’ 单片机矩阵键盘按键行列逐级扫描法
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;
}
‘捌’ 单片机汇编矩阵键盘实验(扫描法)
关于扫描按键的原理,可以看下面这篇文章。
本文以循序渐进的思路,引导大家思考如何用最少的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个。
最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?
‘玖’ 单片机键盘扫描程序
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;
}
本程序,使用的变量最少,也不涉及其它接口。
代码最少,执行效率最高。
‘拾’ 单片机扫描电路原理
单片机行列式键盘扫描原理如下:
1、行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。
2、延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。
3、单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平。
4、此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。
(10)单片机键盘扫描操作扩展阅读
单片机学习方法
1、基础理论知识学习
基础理论知识包括模拟电路、数字电路和C语言知识。。在学习单片机之前,觉得模拟电路和数字电路基础不好的话,不要急着学习单片机,应该先回顾所学过的模拟电路和数字电路知识,为学习单片机加强基础。
2、单片机实践
准备一台电脑、一块单片机开发板、一套视频教程、一本单片机教材和一本C语言教材。电脑是用来编写和编译程序,并将程序代码下载到单片机上;开发板来运行单片机程序,验证实际效果。