C 51单片机 矩阵按键
作者&投稿:葛炭 (若有异议请与网页底部的电邮联系)
有了矩阵按键检测功能,就说明有了矩阵按键程序了,利用矩阵按键可以编很程序的,但需要有数码管显示电路,要有LCD显示屏就更好了,就可以练习编写简易计算器的程序。
组合键,需要在实物开发板才能实现,仿真就不容易操作。
组合键,至少有两个键同时按下,方法还是扫描矩阵按键,判断出什么键按下了,而且识别出两个键同时按下了,就作为组合键处理呗。至于什么功能,你自己定义啦。
GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛
要检测按键首先单片机得设为输入口,51单片机就是把IO口置1,
比如要检测P00-P03,就要设P0口为0X0F
如果此时有按键的话,IO口就会被拉低,由1变成0,通过检测IO口是不是0就能检测到按键。
这是反转法读键盘的程序。
4X4的键盘,有个电路图。
要先理解电路图,才能理解这些代码。
乾先润正: 首先记住,你的是矩阵键盘,就是说一个按键A的一端接单片机的一个脚(假设P00),另一个也接一个脚(假设P07), GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛
同安区19834048154: 51单片机 如何4*4矩阵键盘输入按键 继电器输出信号 - ?
乾先润正: ........... Inter0_process() interrupt 2 //外部中断1 { Key_scan();//你的键盘扫描程序(中断服务程序),一旦触发中断,将运行至本段. } //主程序main() {........... ........... ........... EX1=1; //开中断一 P3.3 IT1=1; //下降沿触发 ET1=1; EA=1;........... ...........} 注:图中的键盘接法都是独立按键接发,矩阵键盘没有见过能直接触发中断的.
同安区19834048154: 单片机 行列矩阵键盘 - ?
乾先润正: 这是一种常见的4*4矩阵键盘扫描按键的方法.其原理是先把4条列线设置为低电平,然后扫描行线,如有按键被按下,必定有一条行线为低电平;再把为低电平的行线设置为低电平,然后扫描列线,如有按键被按下,必定有一条列线为低电平....
同安区19834048154: 51单片机矩阵按键怎么判断其中一个是否按下 如s15 - ?
乾先润正: 用按键等待程序 ,把第二次判断有无按键按下的if语句变为 while(P1!=0xf0); //若按键一直处于按下状态,则等待按键释放 ;若按键释放,则往下执行 Key_Value = Keyscan(); SBUF=Key_Value; 这样,把主循环while(1)变为 while(1) { P1 = 0xf...
同安区19834048154: 51单片机,怎么用矩阵键盘中的两个按键控制外部中断0和1,在按按键的时候 - ?
乾先润正: 让 P3.7 始终为 0,然后就是按 S12 触发外部中断 0,按 S16 触发外部中断 1.
同安区19834048154: 51单片机4*4矩阵键盘如何同时实现单击+双击的功能? - ?
乾先润正: 一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击.何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击.那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零.这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键.
同安区19834048154: 基于51中断方式的矩阵键盘怎么弄啊? - ?
乾先润正: 这个原理是外部中断,就是需要一个外部动作(事件),才可以触发下一动作(事件)的发生. 一般是把矩阵键盘的行(列)输出信号相与以后接入单片机的外部中断口,程序里将这个外部中断设置为低电平出发就可以了. 当没有按键动作的时候,矩阵键盘的输出信号线相与结果为高,不会触发外部中断的键盘扫描程序,有键按下的时候矩阵键盘的输出信号相与输出低,触发单片机外部中断事件,从而扫面键盘. 有个要注意的地方就是按键延时去抖的问题,如果用软件延时可能会导致抖动期间电平瞬间变高,直接响应在中断里就是此次按键结束接触,或者中断递归了.可以考虑硬件延迟或者软件中在中断程序里关闭外部中断使能,一次键值处理完成后再打开外部中断使能. 我的理解是这样的.
同安区19834048154: 51单片机做矩阵键盘,定义四个键,其中一个确认键,要求按下确认键时才显示之前按下的键... - ?
乾先润正: 之前按下的按键数值保存在变量里面,当检测到按下确认键的时候再把之前的按键数值取出来显示.
同安区19834048154: 51单片机矩阵按键 - ?
乾先润正: i=keyscan(); delay(50); while(i==keyscan());
同安区19834048154: 51单片机控制矩阵键盘,谁能帮帮我?
乾先润正: 我的想法,仅供参考.可以定义“确定”键:比如,输入2345,或者123圈后,点击确认,才会执行.定义按键计数器“a”,每次按键一次自加 1 ,如果有确定键按下,根据按键计算器数值进行加权运算.例如,输入“1”“2”“3”“4”“确认”此时“a=4”那么加权就是 圈数 “j=1x10^3+2x10^2+3x10^1+4x10^0”“或者定义数组key 存放按键数字,然后用for(i=0;i<=a;i++){ j=key注:如果觉得浪费键盘资源.可以用定时器,定义不再按键2s后,自动确认什么的.撸主自己选择.仅供参考