导航:首页 > 操作系统 > 单片机扫描矩形键盘

单片机扫描矩形键盘

发布时间:2022-08-14 19:39:37

1. 单片机汇编矩阵键盘实验(扫描法)

关于扫描按键的原理,可以看下面这篇文章。

本文以循序渐进的思路,引导大家思考如何用最少的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. 51单片机矩阵键盘扫描问题

#include <intrins.h> //_nop_();所需头文件

/*************键盘扫描******错误*********/
void scan()
{
unsigned int media;
P2=0x0f;

_nop_(); //在这里延时一个或几个指令周期试试

P2=P2|0xf0;
key=P2;
}

3. 单片机 矩阵键盘 怎么扫描多个数

将接键盘的端口置为读状态,例如接在P1口上的4*4键盘就写:MOV
P1,#0F0H
然后读P1口的状态,然后消除键抖动,在确定有键按下的情况下逐个判断P1.0,P1.1P,P1.2,P1.3的状态,再逐个判断P1.4,P1.5,P1.6,P1.7的状态,最后的键值等于行首号加列号。行首号从上到下依次为:0,4,8,C,列号从左到右依次为0,1,2,3,例如第二列第三个数应该为4+2=6,第三行第二个数应为8+1=9,第一个应为8+0=8.4*4键盘最后一个数应为第四行初值C+第四列值3=键码F.让我们共同进步。

4. 51单片机 矩阵键盘扫描

bit keyscan()//扫描按键函数
{
bit yes=0;
unsigned char temp;
P2=0xfe;//扫描第1行
temp=P2;//读取端口值,检测是否有按键按下
if(temp!=0xfe)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfe)//再一次判断,确实有键按下再执行
{
yes=1;

while(P2!=0xfe);
delay(15);
while(P2!=0xfe);

switch(temp)//获取键值
{
case 0x7e:NUM=14;break;
case 0xbe:NUM=0;break;
case 0xde:NUM=12;break;
case 0xee:NUM=11;break;
}
}
}

P2=0xfd;//扫描第2行
temp=P2;
if(temp!=0xfd)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfd)
{
yes=1;

while(P2!=0xfd);
delay(15);
while(P2!=0xfd);

switch(temp)
{
case 0x7d:NUM=7;break;
case 0xbd:NUM=8;break;
case 0xdd:NUM=9;break;
case 0xed:NUM=15;break;
}
}
}

P2=0xfb;//扫描第3行
temp=P2;
if(temp!=0xfb)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xfb)
{
yes=1;
while(P2!=0xfb);
delay(15);
while(P2!=0xfb);
switch(temp)
{
case 0x7b:NUM=4;break;
case 0xbb:NUM=5;break;
case 0xdb:NUM=6;break;
case 0xeb:NUM=10;break;
}

}
}

P2=0xf7;//扫描第4行
temp=P2;
if(temp!=0xf7)
{
delay(15);//按下去抖
temp=P2;
if(temp!=0xf7)
{
yes=1;
while(P2!=0xf7);
delay(15);
while(P2!=0xf7);

switch(temp)
{
case 0x77:NUM=1;break;
case 0xb7:NUM=2;break;
case 0xd7:NUM=3;break;
case 0xe7:NUM=13;break;
}

}
}
return yes;
}
其中NUM为全局变量,每次检测到有按键按下时会返回‘1’,通过读取NUM来获得键值,四个switch语句中的NUM值完全取决于你要把该按键设定为何值而定的。
本程序的键盘扫描的原理就是进行行扫描,每一行先对端口写行扫描字,然后再读取端口值,若该行有按键按下,则按键对应列线被拉为低电平。扫描完四行就可以检测一遍16个键了。

5. 单片机矩阵键盘扫描方式

首先单片机引脚默认输出高电瓶的。令控制某一行(假设第n行)键盘的引脚为0,然后按下该行的某一键,然后一列一列的检查低电平(假设检测出为第m列),由此判断出按下的为第nm键。思路就是令行为低电平,检查列(当然反之也可以)

6. 初学单片机矩阵键盘逐行扫描,问题困扰好久

P3=0x7f;//高4位作为输出,低4 位为输入,作为输入时要先将其置1
每次扫描时高4位中只有一根线是0,如果没有按键按下,高4位中的0就不会传到低4位上
那么读P3的低4位,它将仍保持原状态4个1(0x0f)
反之,若读到的不是4个1,说明有按键按下了
temp=P3;//将P3口的状态读回来
temp=temp&0x0f;//只取低4 位
if(temp!=0x0f)//如果不全为1,说明有按键按下
{
Delay1ms(5);//消抖动
temp=P3;//再次将P3口的状态读回来
temp=temp&0x0f;//仍然只取低4 位
if(temp!=0x0f)//再次判断是不是4 个1
{
temp=P3;//是 再次读回,因高4位送出的是7,读回也只能是7
switch(temp)//1 根输出线上(此处是最高位)挂有4 个按键,因此读回的数值只有4 种可能
其它3 根线上也各挂4个按键,但你此时按下也不起作用,因它们输出是1
高4位以很快的速度轮流输出低电平,且你按任何键都要持续几十到上百ms,因此你按任何键都有可被扫描到
7二进制是0111 b二进制是1011 d二进制是1011 e二进制是1110
{
case 0x7e:num=1;xianshi=table[num-1];//num是你自己定义的
break;
case 0x7d:num=2;xianshi=table[num-1];
break;
case 0x7b:num=3;xianshi=table[num-1];
break;
case 0x77:num=4;xianshi=table[num-1];
break;
}

7. 单片机简答题 以4×4矩阵键盘为例,写出该键盘按键处理扫描流程

uchar kbscan(void)
{
unsigned char sccode,recode;
P1=0x0f; //发0扫描,列线输入
if ((P2 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P1&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}

8. 单片机矩阵键盘按键行列逐级扫描法

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;
}

9. 单片机矩阵键盘扫描程序

P3=0x7f;
temp=P3;
temp的值是实时的P3口的值,还是等于0x7f?
temp 的值,是 P3 外部引脚输入的值。
具体是何值?取决于 P3 外接的电路。
如果 P3 外面,八个引脚,都接地,那么:
temp 就是 0000 0000。

阅读全文

与单片机扫描矩形键盘相关的资料

热点内容
手机怎么解压文件夹压缩包 浏览:459
起源任务咋解压 浏览:976
加密式的监督检查 浏览:549
光遇怎么分辨安卓国服和渠道服 浏览:242
ico解压教程 浏览:632
程序员偏右 浏览:17
超算上可以进行vasp编译嘛 浏览:174
北京通app怎么注册登录 浏览:820
iphone上的数据怎么转移到安卓 浏览:743
python求每个时段平均值 浏览:244
安卓手机右上出现Hg什么意思 浏览:69
程序员神经 浏览:753
dns服务器在电脑上有什么用 浏览:915
杭州大妈喜欢程序员 浏览:687
python评论树讲解 浏览:680
juniper防火墙常用命令 浏览:426
vapp怎么下载地址 浏览:11
pdf里面内容怎么修改 浏览:807
收藏网址加密的浏览器 浏览:1001
phpurl问号 浏览:899