找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机按键控制多位数码管增减问题求教

[复制链接]
跳转到指定楼层
楼主
想做一个电子时钟:采用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, 下载次数: 41)

QQ图片20171226184336.png

自制.rar

77.15 KB, 下载次数: 10

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

使用道具 举报

沙发
ID:164602 发表于 2017-12-27 08:17 | 只看该作者
把你程序中,主函数,主循环第一句赋初值,放到主循环外面,成为主函数第一句。
你按键调整日期时间后,主循环最后还要循环到第一句,又重新赋初值,所以会有你说的现象。
回复

使用道具 举报

板凳
ID:266627 发表于 2017-12-27 15:50 | 只看该作者
可能是去按按键抖动没有做好,导致按一次,单片机却认为按了多次。
建议先把思路整理一下,不要着急写程序,先用文字描述下按键扫描的过程。

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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:84283 发表于 2017-12-28 00:40 来自手机 | 只看该作者
  没有把你改变的值 真正改变  只是满足你按下去的if条件执行 但跳出if 你的改变量没有在while中的实际控制时间的变量
回复

使用道具 举报

5#
ID:217998 发表于 2017-12-28 22:58 | 只看该作者
HC6800-ES-V2.0 发表于 2017-12-27 08:17
把你程序中,主函数,主循环第一句赋初值,放到主循环外面,成为主函数第一句。
你按键调整日期时间后,主 ...

对的对的,谢谢大神
回复

使用道具 举报

6#
ID:217998 发表于 2017-12-28 22:59 | 只看该作者
sirf3 发表于 2017-12-27 15:50
可能是去按按键抖动没有做好,导致按一次,单片机却认为按了多次。
建议先把思路整理一下,不要着急写程序 ...

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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