打印

51单片机的按键和数码管思路

[复制链接]
1242|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zqykkkk|  楼主 | 2017-8-3 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机的按键和数码管思路
听说51单片机,单片机这东东真的是要一直学,一直做项目才行,之前做按键和数码管显示的时候,实际也只是了解了一点皮毛,再次深入学习后才体会到,要搞好这东东,真的要不同的思路去扩展。先简单说一下我的开发板硬件,数码管采用两片74HC573 来实现,段选P26,位选P27,采用共阳数码管,在P0口送对应数来实现数码管的显示;
四个独立按键P32,P33,P34,P35,LED发光管有八个,P10--P17,发光管在输出低电平时点亮,

那么关于按键和数码管的显示,网上也有很多例子了。
第一类:关于延时的程序,如果采用延时消抖动,那么有可能按下后显示不灵等,那么我建议用LED的显示来抵消这个延时的做法,但一般项目的开法都不会用延时来消抖,在这里只是提供一个思路。
sbit KEY1 = P3^2;   //假定P3^2代表KEY1键,按下为0
if(!KEY1 )  //表明有键按下
{
   // Delayms(10);  一般情况下我们都用Delay  10ms 来消抖
  为了程序的效率,和显示等,我们这里可以用数码管显示的时间来抵消,
  ledscan();    //数码管一般也以10MS 100HZ无闪烁设计的。
   if(!KEY1 )   
   {
         while(!KEY1)      //释放消抖
        {
                KEY1 = 1;      //先输出高电平
                ledscan();      //在等待的这个时间来显示
        }
       // fun1();     这里是我们按键按下的功能程序
   }
}


第二类,我们直接以10MS定时器查询来实现,也可以采用定时器2MS,多读数几次,比如8次以上都是,则实现按键确认
unsigned char KeySta[1] =    //该定义属于全局变量
{
  0xff
};
//下面定义在定时器查询程序里面
static unsigned char Keybuf[1] =  //按键扫描缓冲区,保存一段时间内的扫描值
   {
          0xFF
   };
   Keybuf[0] = (Keybuf[0]<< 1) | KEY1;   //KEY1 循环8次
   if( Keybuf[0] ==0)  //连续8次都是0
  {


51单片机的按键和数码管思路.zip

11.46 KB

相关帖子

沙发
hanlie2345678| | 2017-8-3 15:59 | 只看该作者
做得很不错啊!

使用特权

评论回复
板凳
dirtwillfly| | 2017-8-3 21:14 | 只看该作者

使用特权

评论回复
地板
分享不错,但是你的思路是停留在搬砖状态的,你试试有限状态机使用,保证你键盘按下释放检测去抖、LED显示,,其它一股脑的功能都可以并列实现,使用一个定时器产生2~4毫秒的滴答做节拍器

使用特权

评论回复
5
zqykkkk|  楼主 | 2017-8-6 11:51 | 只看该作者
一事无成就是我 发表于 2017-8-4 08:42
分享不错,但是你的思路是停留在搬砖状态的,你试试有限状态机使用,保证你键盘按下释放检测去抖、LED显示 ...

定时器产生2~4毫秒的滴答做节拍器没试过 ,程序代码怎么写。请教?

使用特权

评论回复
6
先给你看个单键的大致程序,一般定义一个局部全局变量来记录键盘状态进程,这里为了你理解用个一般变量来表达
主程序中这样调用  
uint8_t  key_start;
if(key_EN) {key_start = key_scanf(key_start); key_EN = 0;}
定时器中不断循环计数,每4毫秒对key_EN置位1(一般采用位变量标志)

uint8_t key_scanf(uint8_t key_runnum)
{
      if(runnum < 5) {if(key_IO == 0) runnum ++;  else  runnum = 0;} //5次联系采集键盘是动作L进行去抖,5x4mS=20mS
     else
    {
        runnum ++;
        if(runnum == 7)
        {/*键盘执行的程序*/}
        else  
        {
            if(runnum < 20) {if(key_IO == 0) runnum = 8;}  //键盘释放去抖 4x12=48ms连续检测
            else    runnum = 0;
        }
    }
    return   runnum;
}
//显示也差不多,这种叫做有限状态机轮询,可以有很多函数进程,实时性也能得到保障,一点要记住,每次进去都不要做很多事情,把任务碎片化

使用特权

评论回复
7
zqykkkk|  楼主 | 2017-8-6 21:46 | 只看该作者
一事无成就是我 发表于 2017-8-6 20:00
先给你看个单键的大致程序,一般定义一个局部全局变量来记录键盘状态进程,这里为了你理解用个一般变量来表 ...

多谢指教!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

273

帖子

5

粉丝