找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管的显示不正常,导入后显示8个8 求解决

[复制链接]
跳转到指定楼层
楼主
倒计时100分钟,2个共阴数码管,导入后显示8个8,想要达到图2那样,程序应该怎样改?求各位大佬帮忙

单片机源程序如下:
  1. #include<stc15.h>
  2. #include <REGX51.H>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. #define duan P1                //段选
  7. #define wei  P3                //位选
  8. sbit key1 = P2^3;   //设置
  9. sbit key2 = P2^4;   //加
  10. sbit key3 = P2^5;   //减
  11. sbit key4 = P2^6;   //启动
  12. sbit key5 = P2^7;   //手动
  13. sbit out  = P2^2;   //输出控制 ,低电平有效
  14. sbit di   = P2^0;   //蜂鸣器

  15. void Delay100ms()                //@11.0592MHz
  16. {
  17.         unsigned char i, j, k;

  18.         _nop_();
  19.         _nop_();
  20.         i = 5;
  21.         j = 52;
  22.         k = 195;
  23.         do
  24.         {
  25.                 do
  26.                 {
  27.                         while (--k);
  28.                 } while (--j);
  29.         } while (--i);
  30. }

  31. bit flag=0,flag1=0,shan=0;
  32. uchar knum,shan_cont,i;
  33. uchar shi=0,fen=0,miao=0;  //时分秒
  34. uint cont,cont1,cont2;
  35. uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴段码表
  36.                    //  0          1         2          3           5        6         7          8          9
  37. uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};           //位码        加反相器用
  38.                                    //  1   2    3    4   5     6    7    8
  39. uchar LedBuff[]={0,0,0,0,0,0,0,0};                                      //数码管显示缓冲区

  40. void init()                        //定时器初始化
  41. {
  42.         TMOD |= 0x01;             //设置定时器0为工作方式1(M1M0为01)
  43.         TH0 = (65536-1000)/256;   //1ms初值 @12MHz
  44.         TL0 = (65536-1000)%256;
  45.         EA = 1;                                          //开总中断
  46.         ET0 = 1;                                  //开定时器0中断
  47.         TR0 = 1;                          //启动定时器0
  48. }

  49. void dis()          //显示函数
  50. {
  51.         LedBuff[0] = duanma[miao%10];
  52.         LedBuff[1] = duanma[miao/10];
  53.         LedBuff[2] = 0x40;
  54.         LedBuff[3] = duanma[fen%10];
  55.         LedBuff[4] = duanma[fen/10];
  56.         LedBuff[5] = 0x40;
  57.         LedBuff[6] = duanma[shi%10];
  58.         LedBuff[7] = duanma[shi/10];
  59. }


  60. void keysan()                //按键扫描函数
  61. {
  62.         static bit  kf1=0,kf2=0,kf3=0;   //自锁标志,这里一定要加static(或者用全局变量),否则按键不灵
  63.         static uint i=0,j=0,k=0,l=0,m=0; //消抖延时变量
  64. //////////////////////////////////////启动/暂停键//////////////////////////////////////
  65.         if(knum==0)                           //只要时分秒都不等于0
  66.         {
  67.             if(key4 == 1)           //启动 暂停键
  68.             {
  69.                 m=0;                   //按键消抖计时变量清零
  70.                 kf2=0;                   //按键自锁标志清零
  71.             
  72.             }
  73.             else if(kf2 == 0 ) //有按键按下,且是第一次被按下
  74.             {
  75.                                 
  76.                                         ++m;  //消抖
  77.                 if( (m>20) && ((miao != 0) || (fen != 0) || (shi != 0)) )
  78.                 {      
  79.                            //时分秒都为0时,不能启动输出,只要其中之一不为0,就能启动输出
  80.                 m=0;                   //按键消抖计时变量清零
  81.                 kf2=1;                   //自锁按键置位,避免一直触发
  82.                 flag = !flag;  //启动、暂停计时标志
  83.                 out  = !out;   //LED状态取反
  84.                 }
  85.             }        
  86.         }         

  87. //////////////////////////////////////启动/暂停键//////////////////////////////////////               
  88.         if(out==1)            //加这句,只有在输出关闭的时候,才能设置计时时间,在倒计时的过程中是不能设置的
  89.         {
  90.             if(key1==1)   //设置   //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  91.             {
  92.                         
  93.                 i=0;           //按键消抖计时变量清零
  94.                 kf1=0;         //按键自锁标志清零
  95.             }
  96.             else if(kf1 == 0)  //有按键按下,且是第一次被按下
  97.             
  98.                         {
  99.                
  100.                 ++i;                   //消抖
  101.                 if(i>12)
  102.                 {
  103.                     i=0;                   //按键消抖计时变量清零
  104.                     kf1=1;         //自锁按键置位,避免一直触发
  105.                     knum++;                   //调节时分秒--->123
  106.                     if(knum==4) knum = 0;  //按第四次关闭设置
  107.                 }        
  108.             }
  109.         }        
  110. //////////////////////////////////////加1按键//////////////////////////////////////        
  111.         if(key2==0)                     //加1按键        快速加数
  112.         {
  113.                 j++;
  114.                 if(j >= 3000)           //长按,数码管扫描放中断里面,这里的值就要取得大才行
  115.                 {                       //因为没用delay延时,CPU跑的很快
  116.                         if(knum==1)
  117.                         {
  118.                             miao++;                                        //秒钟加1
  119.                             if(miao==60) miao = 0;        //超过60s变成0
  120.                         }
  121.         
  122.                         if(knum==2)
  123.                         {
  124.                         fen++;                                        //分钟加1
  125.                         if(fen==60) fen=0;                //超过60变0
  126.                         }
  127.         
  128.                         if(knum==3)
  129.                         {
  130.                         shi++;                                        //小时加1
  131.                         if(shi==24) shi=0;                //超过24变0
  132.                         }
  133.         
  134.                         j=1000;           //这里j的值可以设置连加的快慢,j的值越大就越快
  135.                 }                         //因为初值越大,加到3000的时间就越短
  136.         }                                                                                          
  137.         else                                                                         //慢速加数
  138.         {
  139. if(j>500 && j<3000)           
  140.                       {
  141.                                                                  if(knum==1)
  142.                         {
  143.                             miao++;                                        //秒钟加1
  144.                             if(miao==60) miao = 0;        //超过60s变成0
  145.                         }
  146.         
  147.                         if(knum==2)
  148.                         {
  149.                         fen++;                                        //分钟加1
  150.                         if(fen==60) fen=0;                //超过60变0
  151.                         }
  152.         
  153.                         if(knum==3)
  154.                         {
  155.                         shi++;                                        //小时加1
  156.                         if(shi==24) shi=0;                //超过24变0
  157.                         }
  158.                         j=0;
  159.         
  160.                }      
  161.         }        
  162. //////////////////////////////////////减1按键//////////////////////////////////////               
  163.         if(key3==0)                 //减1按键        快速减数
  164.         {
  165.         k++;
  166.         if(k >= 3000)           //长按,数码管扫描放中断里面,这里的值就要取得大才行
  167.         {                                                //因为没用delay延时,CPU跑的很快
  168.             if(knum==1)
  169.             {
  170.                 miao--;                                         //秒钟减1
  171.                 if(miao==255) miao = 59; //小于0就等于59
  172.                                                          
  173.             }        
  174.             if(knum==2)
  175.             {
  176.                 fen--;                                         //分钟减1
  177.                 if(fen==255) fen=59;         //小于0就等于59
  178.                                                                
  179.             }        
  180.             if(knum==3)
  181.             {
  182.                     shi--;                                 //时钟减1
  183.                     if(shi==255) shi=23; //小于0就等于23
  184.                                                                                 
  185.             }        
  186.             k=1000;
  187.         }
  188.         }               
  189.         else
  190.         {
  191.         if(k>500 && k<3000)
  192.                                 
  193.         {
  194.             if(knum==1)
  195.             {
  196.                 miao--;                                         //秒钟减1
  197.                 if(miao==255) miao = 59; //小于0就等于59
  198.                                                         
  199.             }        
  200.             if(knum==2)
  201.             {
  202.                 fen--;                                         //分钟减1
  203.                 if(fen==255) fen=59;         //小于0就等于59
  204.                                                                
  205.             }        
  206.             if(knum==3)
  207.             {
  208.                     shi--;                                 //时钟减1
  209.                     if(shi==255) shi=23; //小于0就等于23
  210.                                                                                 
  211.             }
  212.         }
  213.                 k=0;        //消抖变量清零,为下次按键做准备        
  214.         }
  215. ////////////////////////////////////////////////////////////////////////////      
  216. }


  217. void main()
  218. {
  219.         init();                        //定时器初始化
  220.         out = 1;
  221. P1M0=0xff;
  222. P1M1=0x00;

  223. while(1)
  224.         {
  225.             keysan();        //按键扫描函数
  226.             dis();                //显示函数
  227.             if(shi==0 && fen==0 && miao==0 && flag == 1 )  //倒计时时间到
  228.             {
  229.                 flag=0;   //停止计时
  230.                 flag1=1;  //启动蜂鸣器标志置1
  231.                 out=1;    //关闭输出
  232.             }
  233.         }        
  234. }

  235. void timer() interrupt 1
  236. {
  237.         TH0 = (65536-1000)/256;          //1毫秒初值
  238.         TL0 = (65536-1000)%256;
  239. //////////////////////////////////////1s计时//////////////////////////////////////        
  240.         if(flag)
  241.         {
  242.                 cont++;
  243.                 if(cont == 1000)                   //1s到
  244.                 {
  245.                     cont = 0;                                 //清0
  246.                     miao--;                                         //秒数减1
  247.                     if(miao==255)                         //如果小于0,就是59
  248.                     {
  249.                             miao=59;
  250.                             fen--;                                 //分钟数减1
  251.                             if(fen==255)                 //如果小于0,就是59
  252.                             {
  253.                             fen=59;
  254.                             shi--;                         //小时减1
  255.                             if(shi==255) shi=0;                   //时钟小于0,就是0
  256.                             if(shi==0) fen=59;                   //时钟小于0,就是255
  257.                             if(fen==0 && shi==0) fen=0;//时钟分钟都为0,就是0         
  258.                             }
  259.                     }
  260.                 }
  261.         }
  262. //////////////////////////////////////蜂鸣器控制//////////////////////////////////////
  263.         if(flag1)              //倒计时时间到,启动蜂鸣器
  264.         {
  265.             cont1++;
  266.             if(cont1==500) //500ms蜂鸣器响一次
  267.             {
  268.                 cont1=0;
  269.                 di=!di;
  270.                 cont2++;
  271.                 if(cont2==20)//500*20=10000ms=10s,蜂鸣器响10s后停止
  272.                 {
  273.                         cont2=0;
  274.                         flag1=0;
  275.                 }
  276.             }
  277.         }
  278. //////////////////////////////////////启动/暂停键//////////////////////////////////////
  279.         if(knum != 0)
  280.         {
  281.             shan_cont++;
  282.             if(shan_cont==100)  //设置时,100ms闪烁时间 可根据实际效果调整
  283.             {
  284.                 shan_cont=0;
  285.                 shan = !shan;
  286.             }
  287.         }
  288. /**********************************数码管扫描函数**********************************/
  289.         i++;                          //挨个显示
  290.         if(i>=8) i=0;          //清0
  291.         duan = 0x00;         
  292.         switch(i)
  293.         {
  294.             case 0:
  295.                     if(knum==1) //如果设置键第一次按下
  296.                     {
  297.                                          if(shan==1) {wei = 0x00; duan = LedBuff[0];}  //设置秒位闪烁
  298.                                          
  299.                      else {wei = weima[0]; duan = LedBuff[0];}
  300.                     }
  301.                     else{wei = weima[0]; duan = LedBuff[0];}        break;        //否则正常显示           
  302.             case 1:                                   
  303.                     if(knum==1)        //如果设置键第一次按下
  304.                     {
  305.                                          if(shan==1){wei = 0x00; duan = LedBuff[1];}   //设置秒位闪烁
  306.                      else{wei = weima[1]; duan = LedBuff[1];}
  307.                     }
  308.                     else{wei = weima[1]; duan = LedBuff[1];}  break;        //否则正常显示

  309.             case 2:  wei = weima[2]; duan = LedBuff[2];        break;        //显示-            
  310.             case 3:        
  311.                     if(knum==2) //如果设置键第二次按下
  312.                     {
  313.                                          if(shan==1){wei = 0x00; duan = LedBuff[3];}   //设置分位闪烁
  314.                      else{wei = weima[3]; duan = LedBuff[3];}
  315.                     }
  316.                     else{wei = weima[3]; duan = LedBuff[3];}    break;//否则正常显示

  317.             case 4:        
  318.                     if(knum==2) //如果设置键第二次按下
  319.                     {
  320.                                          if(shan==1){wei = 0x00; duan = LedBuff[4];}  //设置分位闪烁
  321.                      else{wei = weima[4]; duan = LedBuff[4];}
  322.                     }
  323.                     else{wei = weima[4]; duan = LedBuff[4];}        break;        //否则正常显示            
  324.             case 5:  wei = weima[5]; duan = LedBuff[5];        break;                //显示-            
  325.             case 6:        
  326.                     if(knum==3) //如果设置键第三次按下
  327.                     {
  328.                                          if(shan==1){wei = 0x00; duan = LedBuff[6];} //设置时位闪烁
  329.                      else{wei = weima[6]; duan = LedBuff[6];}
  330.                     }
  331.                     else{wei = weima[6]; duan = LedBuff[6];}        break;//否则正常显示        
  332.             case 7:        
  333.                     if(knum==3) //如果设置键第三次按下
  334.                     {
  335.                                          if(shan==1){wei = 0x00; duan = LedBuff[7];}    //设置时位闪烁
  336.                      else{wei = weima[7]; duan = LedBuff[7];}
  337.                     }
  338.                     else{wei = weima[7]; duan = LedBuff[7];}        break;//否则正常显示            
  339.             default: break;        

  340.         }

复制代码

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

使用道具 举报

沙发
ID:213173 发表于 2022-1-14 07:16 | 只看该作者
uchar code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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