关于51单片机矩阵键盘的问题。
你是不是按下下方的四个按键也会让1,2,3,4灯亮起来?
你可以不要定义在同一个引脚上连起来一个引脚的四个按键,你试试控制8个单片机不同引脚上的按键编程一下试一试。
程序上,你的独立按键程序和矩阵键盘程序要分开,独立键盘的程序高低四位判断是相反的,这个一定要注意。你可以让独立按键在那里扫描,矩阵键盘用标志位扫描一下,一旦标志位置位才扫描矩阵,就差不多了。
最好事前检查一下你电路连接方式,分析一下,看不见你的原理图,不太好说,先试试上面的方法吧。
一孔之见,希望对你有帮助吧。
…… P1=0xdf; temp=P1; temp=temp&0x0f; if(temp!=0x0f) { delay10ms(); temp=P1; P1=temp&0x0f;--错了 if(temp!=0x0f) { temp=P1;……应为: temp=temp&0x0f;
(1)P3口是准双向IO口(注意与双向IO口的区别),它 的硬件结构决定着,读取之前先写1,再读取,读取的结果才可能是正确的,你可以区域查查书。(2)4X4 矩阵键盘的8根线直接连在IO上,而独立按键有一根线固定是接地的,这就意味着必须采取扫面或者线反转的方法。比如其中一根行线赋0,相当于这一行的四个按键变成了四个独立按键,在读取列线的值就知道了究竟哪个按键被按下了。 此时P3口就出现了特定的电平组合,相当于特征码了,然后再认为映射一下功能就可以了。
大概看了下 ,你这个矩阵键盘是4x4的键盘,P3口的高四位和低四位组成的行列键盘,其实这个比较简单,P3=FE=11111110,这段是判断按键是否在第一行(假定低四位为行,高四位为列),依次类推,P3=FD=11111101,这段是判断按键是否在第二行,直到低四位扫描完,就确定了是在哪一行按下的键,接下来判断哪里列,原理还一样,这样就把哪个按键确定下来了,中间那个DELAY(5)你应该知道是防抖动的延时程序
单片机矩阵键盘,如上述是 4x4 的矩阵键盘,
P3=0xfe; //比如这里 1111 1110 这是扫描第一组 4 个键,按下 4 个键 读到的数据为
1110 1110 (0xee)、1101 1110 (0xde)、1011 1110 (0xbe)、0111 1110 (0x7e)
P3=0xfd; //比如这里 1111 1101 这是扫描第二组 4 个键,按下 4 个键 读到的数据为
1110 1101 (0xed)、1101 1101 (0xdd)、1011 1101 (0xbd)、0111 1101 (0x7d)
P3=0xfb; //比如这里 1111 1011 这是扫描第三组 4 个键,按下 4 个键 读到的数据为
1110 1011 (0xeb)、1101 1011 (0xdb)、1011 1011 (0xbb)、0111 1011 (0x7b)
P3=0xf7; //比如这里 1111 0111 这是扫描第二组 4 个键,按下 4 个键 读到的数据为
1110 0111 (0xe7)、1101 0111 (0xd7)、1011 0111 (0xb7)、0111 0111 (0x77)
这样可以得到 16 个键值。如果不用 4 次扫描 就不能得到 16 种状态。
当检测按键时用的是它的输入功率,先把按键的一端接地,另一端与单片机的某个I/0口相连,开始时先给该I/0口赋一高电平,然后让单片机不断地检测该I/0口是否变为低电平,当按键闭合时,即相当于该I/0口通过按键与地相连,变成低电平,程序一旦检测到I/0变为低电平则说明按键被按下,然后执行相应的指令。
求51单片机最简单的矩阵按键程序
uchar x[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};uchar scan() \/\/扫描键值的子程序 { P1=0xf0;scan0=P1;delay1ms(20);if(scan0!=0xf0) \/\/判键是否按下 { scan0=P1;if(scan0!=0xf0) \/\/二次判键是否按下 {...
51单片机的问题,矩阵键盘和独立键盘混乱了。。。求帮助
你好:这是郭天祥的板子的按键接口。s6、10、14、18与s2接在一起了,s7、11、15、19与s3接在一起了。。。这样使用矩阵键盘时,独立按键对矩阵的影响是非常大的。希望我的回答能帮助到你。
51单片机矩阵键盘检测,怎么5—f都显示,只有0~3按键不显示数字?
恩,如果程序没问题,那肯定是你第一排电路走线出了问题,按键坏了的可能性很小
我想用51单片机,矩阵键盘,lcd1602写个简易计算器程序
\/\/--- void W_LCD_X1_Dat(uint sec){ W_LCD_Com(0xc0 + 6);W_LCD_Dat(0x30 + sec \/ 10000);W_LCD_Dat(0x30 + (sec % 10000) \/ 1000);W_LCD_Dat(0x30 + (sec % 1000) \/ 100);W_LCD_Dat(0x30 + (sec % 100) \/ 10);W_LCD_Dat('.');W_LCD_Dat(0x30 + sec...
在51单片机中用C51编写矩阵键盘的程序。下面有我编写的,但不知道其中的...
函数返回值类型为非空的 但是在函数中有一个或者以上的分支没有返回值 例如 int test(){ if(){...return 0;} else if{ ...return 0;} else{...而这里没有返回值的话就可能会出现这种情况了} } uchar keyscan(void){ for( ..)..return ()..\/\/此处需加返回值 } ...
51单片机利用矩阵按键控制数码管显示0-9数字。。。救救我吧,我快疯...
unsigned char t=0;unsigned char i=0;void Delay(unsigned char i){ unsigned char j;for(; i>0; i--)for(j=110; j>0; j--);} void DisplayLED(unsigned char n){ P0=table[n];} void Keycan() \/\/判断 矩阵键盘是否被按下 { unsigned char tmp, key;P2=0xfe; \/\/第四列 ...
用51单片机和C语言编程.利用矩阵键盘依次显示1,2,3,4,5.……12的平方...
你的while循环写的有问题,既然要先判断行选再判断列选,应该用两级的switch语句,而不是两级wihile语句,你现在的写法只循环了第二级的第一个while循环,所以只有处于第二级while的switch的三按(其实看代码应该是四个)键个管用。。。
51单片机做矩阵键盘检测是否有按键输入的时候为什么是与0xf0做比较呢...
P3 = 0xfd; 高四位设置为输入状态,低四位输出扫描信号,扫描P3.1所在的行 temp = P3; 读入按键状态,无按键按下时为0xfd,有按键按下时高四位会有一位变0 temp = temp & 0xf0; 清楚低四位的扫描信号,保留高四位的按键状态 while (temp != 0xf0) 如果有按键按下,高四位...
51单片机4 x 4矩阵键盘P3=0xfe,temp=P3;第二步是把按下去的键P3赋给tem...
端口的电平取决于P3的内部电路电平(P3=0XFE)和外部电路。当外部电路没有按键按下时,TEMP=0XFE,当有按键按下时,就不是这个值了,具体的要看你的外围电路和具体的按键。
51单片机,矩阵按键,长按短按判断
\/* 网友反映长键结束后会送出短键值,特作更改 2019.03.29 *\/\/\/1,再写一个长短键判断函数,调用那个按键扫描函数unsigned char KEY_process(void){ static unsigned char Old_key = 0;\/\/上次按键值 static unsigned char Key_buf = 0;\/\/按键有效保存 static unsigned ch...
虫纨谱乐: 这问题问得还是可以,scan1&0xf0 就是为了防止其他因素干扰了P1的低四位,用你说的scan1!=0xf0 程序就会认为有按键按下,实际则没有.只不过在不严格要求下用 scan1!=0xf0 也是可以的.顺便提醒你一下,程序改了,实践下就知道了
分宜县17751815094: 关于51单片机矩阵键盘的问题. - ?
虫纨谱乐: 单片机矩阵键盘,如上述是 4x4 的矩阵键盘, P3=0xfe; //比如这里 1111 1110 这是扫描第一组 4 个键,按下 4 个键 读到的数据为 1110 1110 (0xee)、1101 1110 (0xde)、1011 1110 (0xbe)、0111 1110 (0x7e) P3=0xfd; //比如这里 1111 1101 ...
分宜县17751815094: 51单片机矩阵键盘检测方面的问题 - ?
虫纨谱乐: 第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了.第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是什么,都是0,只有高四位的值从1,变为0,0xf0才会发生改变.
分宜县17751815094: C 51单片机 矩阵按键 - ?
虫纨谱乐: 首先记住,你的是矩阵键盘,就是说一个按键A的一端接单片机的一个脚(假设P00),另一个也接一个脚(假设P07), GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛
分宜县17751815094: 51单片机的问题,矩阵键盘和独立键盘混乱了...求帮助 - ?
虫纨谱乐: 你好:这是郭天祥的板子的按键接口.s6、10、14、18与s2接在一起了,s7、11、15、19与s3接在一起了...这样使用矩阵键盘时,独立按键对矩阵的影响是非常大的.希望我的回答能帮助到你.
分宜县17751815094: 51单片机4*4矩阵键盘如何同时实现单击+双击的功能? - ?
虫纨谱乐: 一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击.何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击.那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零.这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键.
分宜县17751815094: 51单片机矩阵键盘程序问题求解 - ?
虫纨谱乐: 这个我知道有个类似的,你的意思就是按1下,执行函数1;按第2下,执行函数2 你在检测按键按下的时候.设置个变量sum=0;按1次就sum++ 然后就可以区分按下两次的不同了.void keyscan() { if(s==0) { delay(5); if(s==0) { while(!s); snum++; } } if(snum==1) { TR0=0; ET0=0; } if(snum==2) { TR0=1; ET0=1; snum=0; } } 比如,我写的一个暂停的函数,按1下,执行一个函数1,暂停;再按1下,执行另一函数2,开始工作.不懂的QQ358357912说吧 ,另外你发问题不给分,这个态度是不对滴^-^
分宜县17751815094: 关于51单片机的问题,独立键盘和矩阵键盘怎么同时使用?懂的来帮帮忙啊! - ?
虫纨谱乐: 你是不是按下下方的四个按键也会让1,2,3,4灯亮起来? 你可以不要定义在同一个引脚上连起来一个引脚的四个按键,你试试控制8个单片机不同引脚上的按键编程一下试一试. 程序上,你的独立按键程序和矩阵键盘程序要分开,独立键盘的程序高低四位判断是相反的,这个一定要注意.你可以让独立按键在那里扫描,矩阵键盘用标志位扫描一下,一旦标志位置位才扫描矩阵,就差不多了. 最好事前检查一下你电路连接方式,分析一下,看不见你的原理图,不太好说,先试试上面的方法吧. 一孔之见,希望对你有帮助吧.
分宜县17751815094: AT89c51系列单片机IO的疑问,我在做矩阵键盘的时候发现的问题,当我将列线都上拉10K电阻到+5V - ?
虫纨谱乐: 按你这样说,电路应该是没有问题的.还有就是你在51单片机上..除了用P0口要上啦电阻外,都可以不用接上拉电阻..除非你要用到较大的电流驱动,. 还有就是你最后一个问题..使用电位器是有可以由底变高的,单片机吸收的电流小于供给的电流的时候,,就会变为高平了...
分宜县17751815094: 51单片机做矩阵键盘,定义四个键,其中一个确认键,要求按下确认键时才显示之前按下的键... - ?
虫纨谱乐: 之前按下的按键数值保存在变量里面,当检测到按下确认键的时候再把之前的按键数值取出来显示.