找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2488|回复: 19
打印 上一主题 下一主题
收起左侧

关于单片机驱动独立按键的几个问题,求分析

[复制链接]
跳转到指定楼层
楼主
ID:232366 发表于 2021-1-19 23:53 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天做独立按键  控制数码管的一个程序过程如下:
实验效果为按键按一下数码管显示键值
问题是1   因为我的按键扫描是用的延时消抖
再一个就是松手检测用的是这种while(!KEY1);
按键一直按着程序就死在循环这里导致每次按一下数码管都闪一下这个闪一下我估计应该就是程序就停在这里不走了这个会不会是一个弊端?
问题2  假如按键不松手重新一直就不走永远死在这了?    在做实验的时候试过通过标志位的办法来判断和检测   可是始终调不通无奈没办法初学者了解的也比较少!只能相论坛的师傅们请教了!
求问  有没有其他什么办法或者给一个思路可以在按键在没有松手的情况下程序也不会停止返回来继续判断按键是否松开  松开了就为下一次按下做准备。没松开就继续扫描。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-1-20 06:19 | 只看该作者
楼主所述的按键程序只是一些入门级文章介绍的方法,目的是让初学者初步了解MCU识别按键操作的过程。其具有不可克服的弊端,不可用于实战中。关于各种应用场景的按键扫描程序的写法数不胜数。给你一款可用于实战的独立按键示例。
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key=P3^4;                                //按键端口

  5. uchar key_value;                        //键值变量
  6. uint  count=0;                                //消抖计数变量
  7. bit   sign=0;                                //按键状态标志


  8. void keyscan()                                //按键扫描程序
  9. {
  10.         if(key==0)                                //检测按键按下
  11.         {
  12.                 count++;                                //消抖计数
  13.                 if(count>=100 && sign==0)//100~1000,根据主循环周期调整约10~20ms
  14.                 {                       
  15.                         sign=1;                        //按键状态标志置1
  16.                         key_value++;
  17.                 }
  18.         }
  19.         else                                                //键抬起
  20.         {
  21.                 sign=0;                                //按键状态标志清0
  22.                 count=0;                                //消抖计数清0
  23.         }
  24. }
  25. void main()                                                //主函数
  26. {
  27.         while(1)
  28.         {
  29.                 keyscan();                                //按键扫描程序
  30.                 P1=~key_value;                        //P1接LED,键值取反低电平亮显示键值
  31.         }
  32. }
复制代码
回复

使用道具 举报

板凳
ID:232366 发表于 2021-1-20 08:26 | 只看该作者
wulin 发表于 2021-1-20 06:19
楼主所述的按键程序只是一些入门级文章介绍的方法,目的是让初学者初步了解MCU识别按键操作的过程。其具有 ...

是的如您所说本人目前学习编程方法也比较入门也比较傻瓜式编程,在这里非常感谢您的回复和这历程回去后好好研究一下其运行原理十分感谢!!!!
回复

使用道具 举报

地板
ID:752974 发表于 2021-1-20 08:56 | 只看该作者
我发了一个简易按键的处理函数的帖子,可以解决你的问题,审核通过后可以去看看。
回复

使用道具 举报

5#
ID:390416 发表于 2021-1-20 10:01 | 只看该作者
本帖最后由 人人学会单片机 于 2021-1-20 18:35 编辑

下面的这个就是按键长短按的,主函数循环扫码就行,没有死等!!!!
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;
        static bit flag2=1;
        static bit key_down=0;
        static u8 count1=0;
        static u16 count2=0;
        if(key_down==1)
        {
                count2++;
                if(count2>10000)
                {
                        count2=0;
                        flag1=1;
                        if(flag2)
                        {
                                flag2=0;
                                Rotary_Read_Data_Key=ROTARY_KEY_L;
                        }
                }
                if(ROTARY_MUTE==1)
                {
                        key_down=0;
                        flag2=1;
                        count2=0;
                        if(flag1)
                        {
                                flag1=0;
                        }
                        else
                        {
                                Rotary_Read_Data_Key=ROTARY_KEY_S;        
                        }
                }
        }
        else
        {
                if(ROTARY_MUTE==0)
                {
                        count1++;
                        if(count1>100)
                        {
                                count1=0;
                                if(ROTARY_MUTE==0)
                                {
                                        key_down=1;
                                }
                        }
                }
                else
                {
                        count1=0;
                }
        }
}
我发的贴子有图片,你可以看看 加深理解 http://www.51hei.com/bbs/dpj-201806-1.html
回复

使用道具 举报

6#
ID:232366 发表于 2021-1-20 10:31 | 只看该作者
munuc_w 发表于 2021-1-20 08:56
我发了一个简易按键的处理函数的帖子,可以解决你的问题,审核通过后可以去看看。

看不见楼主能不能给个链接记录!!!!
回复

使用道具 举报

7#
ID:390416 发表于 2021-1-20 10:36 | 只看该作者
http://www.51hei.com/bbs/dpj-201806-1.html 这个是我写的贴子,审核通过后就能看到了
回复

使用道具 举报

8#
ID:752974 发表于 2021-1-20 11:04 | 只看该作者
SHANWAZI 发表于 2021-1-20 10:31
看不见楼主能不能给个链接记录!!!!

好像领到在审查。。。。
回复

使用道具 举报

9#
ID:232366 发表于 2021-1-20 11:12 | 只看该作者
munuc_w 发表于 2021-1-20 11:04
好像领到在审查。。。。

我现在还在单步运行调试楼上师傅给的思路
回复

使用道具 举报

10#
ID:213173 发表于 2021-1-20 11:25 | 只看该作者
SHANWAZI 发表于 2021-1-20 08:26
是的如您所说本人目前学习编程方法也比较入门也比较傻瓜式编程,在这里非常感谢您的回复和这历程回去后好 ...

一款简练的矩阵键盘数码管显示程序仿真.zip (109.55 KB, 下载次数: 9)
回复

使用道具 举报

11#
ID:232366 发表于 2021-1-20 11:34 | 只看该作者
wulin 发表于 2021-1-20 06:19
楼主所述的按键程序只是一些入门级文章介绍的方法,目的是让初学者初步了解MCU识别按键操作的过程。其具有 ...

您的例程我去研究一下了似乎有点巧妙   
只要按键不松开count貌似一直在自加  但是这个时候按键标志位已经被置位为1
在这里 if(count>=2 && kye_up==0)
{
         kye_up==1;
}
这标志位要检到0 两个条件才会成立  两个有一个不成立则不执行后面的语句?
只要按键不松开标志位就不清零??
以上我去单步运行得出不知道对不对。
回复

使用道具 举报

12#
ID:213173 发表于 2021-1-20 11:42 | 只看该作者
SHANWAZI 发表于 2021-1-20 11:34
您的例程我去研究一下了似乎有点巧妙   
只要按键不松开count貌似一直在自加  但是这个时候按键标志位 ...

你理解的很正确,两个条件同时成立才会执行,count也不怕溢出,松手就清0。
回复

使用道具 举报

13#
ID:607312 发表于 2021-1-20 11:47 | 只看该作者
        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
                        {
                                delay(1000);
                                。。。。。。。。。。
                        }
回复

使用道具 举报

14#
ID:232366 发表于 2021-1-20 11:56 来自手机 | 只看该作者
wulin 发表于 2021-1-20 11:42
你理解的很正确,两个条件同时成立才会执行,count也不怕溢出,松手就清0。

即使加到65535再加一会从0开始再来一遍  只要按键不松开此计数就不清0
我明白了   非常感谢您给的思路这下问题迎刃而解真的的跪谢了!   
回复

使用道具 举报

15#
ID:232366 发表于 2021-1-20 11:58 来自手机 | 只看该作者
cdiyy 发表于 2021-1-20 11:47
while((a

感谢回复   我还在研究理解楼上例程!
回复

使用道具 举报

16#
ID:390416 发表于 2021-1-20 18:34 | 只看该作者
用我回复你的代码,或者看看我的贴子 http://www.51hei.com/bbs/dpj-201806-1.html
回复

使用道具 举报

17#
ID:232366 发表于 2021-1-21 09:42 | 只看该作者
人人学会单片机 发表于 2021-1-20 10:01
下面的这个就是按键长短按的,主函数循环扫码就行,没有死等!!!!
void ROTARY_Key_Scan_Drive()
{

太复杂短按都没弄透彻  您这更加把两个结合到了一起我这种初级手不太适合
回复

使用道具 举报

18#
ID:811405 发表于 2021-1-28 12:00 | 只看该作者
独立按键比其他的按键操作更简单
回复

使用道具 举报

19#
ID:232366 发表于 2021-1-28 14:10 来自手机 | 只看该作者
学生1 发表于 2021-1-28 12:00
独立按键比其他的按键操作更简单

是的  !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表