51单片机做矩阵键盘检测是否有按键输入的时候为什么是与0xf0做比较呢?
矩阵键盘是通过行和列来确认具体位置的,那个与操作就是来确定行或列的(具体要看硬件电路)。
P3=0xfe; //P3=0b1111 1110,令P3.0=0,同时令高四位为高电平,作好读端口准备(51IO特点)
temp=P3; //读回P3口的状态
temp=temp&0xf0; //temp&1111 0000,0与任何数结果为0,把temp变量的低四位屏蔽了,高四位因为任何数与1等于它本身,所以把高四位对应的端口状态读进来。
while(temp!=0xf0) //上步处理后,高四为不全为1,说明有按键按下(结合矩阵键盘的电路结构才能理解,这里不方便上图)
{
delay(5);
temp=P3;
temp=temp&0xf0;//这三句跟上面重复,功能是软件消抖
while(temp!=0xf0) //延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。
{
temp=P3;
switch(temp).....
我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。
temp = P3; 读入按键状态,无按键按下时为0xfd,有按键按下时高四位会有一位变0
temp = temp & 0xf0; 清楚低四位的扫描信号,保留高四位的按键状态
while (temp != 0xf0) 如果有按键按下,高四位会有一位变0,进入循环,直到按键放开,高四位
全变为1,才跳出循环;如果没有按键按下,循环不会执行
为什么是与0xf0比较呢
由于高四位是读入按键状态的,在输入之前为了保证输入正确,必须先输出1
将端口设置为输入状态,所以高四位初始状态为全1
当有按键按下时,对应的输入会变为0,所以只要和0xf0比较就知道那个按键按下了
你先了解一下线与的关系
这是最初始比较吧,检测两个,第一有没有键按下,或者看是那个键按下
很简单,是为了去除低四位
用单片机设计一个矩阵键盘电路
尼玛,刚做好。sbit scan_H0=P0^0;sbit scan_H1=P0^2;sbit scan_H2=P0^1;sbit scan_L0=P0^3;sbit scan_L1=P5^4;sbit scan_L2=P5^5;uchar Keycan() \/\/按键扫描程序 { unsigned char rcode, ccode ;unsigned char which_key = 0;write_scan_define(0x70); \/\/ 发全0行扫描码...
单片机汇编矩阵键盘实验(扫描法)
依次的配置IO1、2、3为110,读IO4、5,若IO4为0则SW34按下,若IO5为0则SW35按下;思路二但是我们在不知道行列式按键之前我们肯定是依次将IO口接一个按键到GND或者到VCC,然后去读IO口去判断哪个按键按下,这也是最简单的方法,但是很浪费IO口,下面这种就结合了这种简单方法和行列式的思路,实...
单片机矩阵键盘
方法一;按照图在板子的一面按图连线飞线即可(麻烦.可靠性低)2,一部分焊板子上一部分焊板子下不就行了...不过要安排好...可能占用其他空间 3.梯式焊法...像很多个L平行嵌套一样...但要占用背面大量的空间...要安排好...4.自己动脑子》。。这都搞不赢还学毛啊 ...
单片机矩阵键盘如何实现一键多用
可以加个定时器实现你说的功能,首先把矩阵键盘扫描编写成一个独立的函数,比如char keyread(void)(无键按下返回0,否则返回该键的数值) 然后把定时器设置为定时1s(根据你需要按得次数确定时间),主程序直接调用keycan(),当检测到返回值不为0时启动定时器,然后进入while死循环扫描按键,在定时...
单片机矩阵键盘程序求解释和修正!
key=1;break;case 0xbe:\/\/p3^6 key=2;break;case 0x7e:\/\/p3^7 key=3;break;} while(temp!=0xf0)\/\/按键松开之后跳出循环 { temp=P3;temp=temp&0xf0;} display(key);\/\/显示 } } P3=0xfd;{...};P3=0xfb:{...};P3=0xf7;{...};void main(){ P0M1 = 0x00;\/\/推挽输出的...
【求解释】单片机最简单的矩阵键盘代码(只有三句)
这是完整的矩阵键盘代码没错,不过并不难理解,假设按下的是连接P1.1和P1.5的按键,那么各行代码的二进制结果为:第一行:P1 = 1111 0000 第二行:KH = 1101 0000 第三行:P1 = 0000 1111 第四行:KL = 0000 1101 第五行:Key = 1101 0000 | 0000 1101 = 1101 1101 高位和低位“0...
通过单片机外接一个4*4矩阵键盘,设置“0-9”启动”10个按键,进行30秒倒...
1.编码按钮分别为0,1,2,……,9十个按键:可以用矩阵键盘实现,2.用发光二极管作为输出指示灯,灯亮代表锁“开”,灯灭代表锁“不开”,用一个IO口,接上二极管,接上限流电阻,接地。密码正确,另该IO口值为1,否则为0;3.设置开锁密码,并按此密码设计电路。密码可以是0~9十位数。若按...
单片机中独立键盘和矩阵键盘如何一起使用 请用C语言写个程序说明,谢谢...
uchar kbscan(void) \/\/矩阵键扫描程序 { unsigned char sccode,recode;P3=0x0f; \/\/发0扫描,列线输入 if ((P3 & 0x0f) != 0x0f) \/\/有键按下 { delay(20); \/\/延时去抖动 if ((P3&0x0f)!= 0x0f){ sccode = 0xef; \/\/逐行扫描初值 while((sccode&0x01)!=0)...
51单片机如何用矩阵键盘输入数值,最后赋值到一个变量上
你好!!你做矩阵键盘检测的时候,会触发相关的IO口的状态,通过分析IO口,就能知道那个键按下;定义一个变量,将按下的键值赋给变量就行了
用单片机的并行口接2*3矩阵键盘,每个按键功能由4个数码管输出,初始值...
设计步骤:1,先搞明白矩阵键盘,如果有条件先焊接出来,简单编程,实现矩阵键盘功能。2,数码管的设计;可以静态可以动态,如果初学者,可以选择静态显示,对程序来说比较简单。3,结合1,2实现第一个按键功能。4,在第一个按键功能基础上,通过定时器,加入数据移位,实现第二、第三个按键功能。5,闪烁...
孟郑瑞高: P3 = 0xfd; 高四位设置为输入状态,低四位输出扫描信号,扫描P3.1所在的行 temp = P3; 读入按键状态,无按键按下时为0xfd,有按键按下时高四位会有一位变0 temp = temp & 0xf0; 清楚低四位的扫描信号,保留高四位的按键状态 while (...
滨城区18073161023: (80C51单片机)设计4*4键盘及8位数码管显示构成的电子密码锁.的C语言程序. - ?
孟郑瑞高: 4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按 键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键#include #include //头文...
滨城区18073161023: 51单片机4*4矩阵键盘如何同时实现单击+双击的功能? - ?
孟郑瑞高: 一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击.何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击.那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零.这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键.
滨城区18073161023: 单片机在扫描是否有键按下时,为什么要做这么多次的判断?有什么作用,寻找大侠~我是菜鸟~ - ?
孟郑瑞高: 是为了防止键盘抖动,键盘抖动的时间是很短的,通过延时一段时间后,如果再判断键盘是按下的,这是才真正能说明键盘按下了,相反,则是抖动,不能说明键盘按下! 所以,软件中一般都需要两次判断键盘按下! 第一次之后,加段延时,之后再判断
滨城区18073161023: C 51单片机 矩阵按键 - ?
孟郑瑞高: 首先记住,你的是矩阵键盘,就是说一个按键A的一端接单片机的一个脚(假设P00),另一个也接一个脚(假设P07), GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛
滨城区18073161023: 80c51单片机的矩阵键盘检测,按键释放代码要怎样写?谢谢. - ?
孟郑瑞高: 注意:);//!!!注意通过这个循环判断是否松开该键 进一步交流进我空间 /*------------------------------------------------按键扫描函数,返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫...
滨城区18073161023: 51单片机矩阵键盘检测是否按下为什么temp要与0xf0与 - ?
孟郑瑞高: 扫描码是0xfe,可见低四位是扫描码位,高四位是检测输入位,判定时与低四位就关系不大了,因此“与0xf0",当然你的if(temp!=0xfe)也不是不可以,但扫描是有四位的,也就是0xfe,0xfd,0xfb,0xf7,与处理后可以用一个判定语句,如果写成你的形式就需要4个语句了.显然程序可读性不好也要长很多,不利于循环语句的处理.
滨城区18073161023: 51单片机矩阵键盘扫描程序分析? - ?
孟郑瑞高: 我给你一个我自己写的吧 有注释 假设按下的是S1键进行如下检测(4*4键盘) 先在P3口输出 p3 00001111 低四位 行会有变化 cord_h =00001111&00001110 =00001110if !=00001111 延时0.1us cord_h=00001110&00001111=00001110 if !=...
滨城区18073161023: 51单片机矩阵按键怎么判断其中一个是否按下 如s15 - ?
孟郑瑞高: 用按键等待程序 ,把第二次判断有无按键按下的if语句变为 while(P1!=0xf0); //若按键一直处于按下状态,则等待按键释放 ;若按键释放,则往下执行 Key_Value = Keyscan(); SBUF=Key_Value; 这样,把主循环while(1)变为 while(1) { P1 = 0xf...
滨城区18073161023: 51单片机做矩阵键盘,定义四个键,其中一个确认键,要求按下确认键时才显示之前按下的键... - ?
孟郑瑞高: 之前按下的按键数值保存在变量里面,当检测到按下确认键的时候再把之前的按键数值取出来显示.