标题: 关于单片机按键控制多位数码管增减问题求教 [打印本页]

作者: 棒棒糖带刺    时间: 2017-12-26 19:38
标题: 关于单片机按键控制多位数码管增减问题求教
想做一个电子时钟:采用6位数码管显示当前日期,并可以利用按键修改年、月、日等信息。现在还没有考虑显示实时的日期,但是在按键控制数码管数字加减的时候,碰到一个问题,当按键按下的时候可以加一,但按键弹起就又返回原来的值了,想向大神们请教一下原因是什么,具体程序该怎么改。附件有编的源码和原理图

单片机源程序:
  1. #include<reg51.h>


  2.                                //0  1      2    3    4    5   6     7    8    9          -
  3. char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //CC共阴极数码管段码


  4. sbit key_jia=P2^0;//加键
  5. sbit key_jian=P2^1;//减键
  6. sbit key_xuan=P2^2; //校准时间键


  7. int change_time_flag=0;


  8. // bit runflag=0;//界面选择




  9. unsigned int nian,yue,ri;//实时 年月日


  10. void delay(int i)
  11. {
  12.         while(i--);//us延迟函数
  13. }


  14. void display_date()//实时时间界面显示
  15. {
  16.         int i;
  17.         for(i=0;i<6;i++)
  18.         {
  19.                 switch(i)
  20.                 {
  21.                         case 0:P0=0XFE;P1=table[nian/10];
  22.                         break;
  23.                         case 1:P0=0XFD;P1=table[nian%10]|0x80;        //显示小数点
  24.                         break;
  25.                         case 2:P0=0XFB;P1=table[yue/10];
  26.                         break;
  27.                         case 3:P0=0XF7;P1=table[yue%10]|0x80;
  28.                         break;
  29.                         case 4:P0=0XEF;P1=table[ri/10];
  30.                         break;
  31.                         case 5:P0=0XDF;P1=table[ri%10];
  32.                         break;
  33.                 }
  34.                 delay(10);
  35.                 P1=0x00;        //消影
  36.         }
  37. }

  38. void key() //按键判断{                                                        ///////////////////实时时间设置        if(key_jia==0)//加键按下        {        //        delay(10);//消抖                if(key_jia==0)                {                         //        delay(10);                        // while(!key_jia);                        if(change_time_flag==0)                        {                                                                ri++;                        }                        else if(change_time_flag==1)                        {                                yue++;                        }                        else                        nian++;                        //         while(!key_jia);//等待按键弹起                }                //while(!key_jia);//等待按键弹起        }
  39.         if(key_jian==0)//减键按下        {        //        delay(10);        //消抖                if(key_jian==0)                {                        if(change_time_flag==0)                        {                                ri--;                        }                        else if(change_time_flag==1)                        {                                yue--;                        }                        else                        nian--;                }        //        while(!key_jian);//等待按键弹起        }                if(key_xuan==0) //实时设置按键按下        {        //        delay(10);                if(key_xuan==0)                {                //        runflag=0;                        change_time_flag++;                        delay(10);                         if(change_time_flag==3)                         change_time_flag=0;                }        //        while(!key_xuan);        }
  40. }
  41. void main(){
  42.         while(1)        {                        ri=17;yue=12;nian=25;//初始时间                 //display_date();                key();//按键判断                        //界面选择//                if(runflag==0)   // key1();        display_date();                        }}
复制代码


QQ图片20171226184336.png (32.21 KB, 下载次数: 61)

QQ图片20171226184336.png

自制.rar

77.15 KB, 下载次数: 10


作者: HC6800-ES-V2.0    时间: 2017-12-27 08:17
把你程序中,主函数,主循环第一句赋初值,放到主循环外面,成为主函数第一句。
你按键调整日期时间后,主循环最后还要循环到第一句,又重新赋初值,所以会有你说的现象。
作者: sirf3    时间: 2017-12-27 15:50
可能是去按按键抖动没有做好,导致按一次,单片机却认为按了多次。
建议先把思路整理一下,不要着急写程序,先用文字描述下按键扫描的过程。

比如是希望按下的瞬间,数字加减,还是释放瞬间。还是释放后若干mS内再动作?

作者: qq1105424012    时间: 2017-12-28 00:40
  没有把你改变的值 真正改变  只是满足你按下去的if条件执行 但跳出if 你的改变量没有在while中的实际控制时间的变量
作者: 棒棒糖带刺    时间: 2017-12-28 22:58
HC6800-ES-V2.0 发表于 2017-12-27 08:17
把你程序中,主函数,主循环第一句赋初值,放到主循环外面,成为主函数第一句。
你按键调整日期时间后,主 ...

对的对的,谢谢大神
作者: 棒棒糖带刺    时间: 2017-12-28 22:59
sirf3 发表于 2017-12-27 15:50
可能是去按按键抖动没有做好,导致按一次,单片机却认为按了多次。
建议先把思路整理一下,不要着急写程序 ...

恩恩,好的,延时那边我需要再考虑一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1