久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1495|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区在线 | 91麻豆精品国产91久久久更新资源速度超快 | 一区二区三区国产好的精 | 在线欧美日韩 | 久久久片 | 超碰免费在 | 免费福利视频一区二区三区 | 91麻豆精品国产91久久久资源速度 | 国产一区二区三区在线 | 久久精品欧美一区二区三区不卡 | 国产美女久久 | 亚洲视频在线看 | 成人a在线 | 亚洲成人一二三 | 天天天操 | 成人动漫视频网站 | 久久这里只有精品首页 | 久久精品屋 | 久久免费资源 | 天天色天天射天天干 | 亚洲一区二区精品视频在线观看 | 久久精品视频播放 | 亚洲综合二区 | 国产大片一区 | 91久久久久久 | 一级高清视频 | 欧美三级电影在线播放 | 羞羞的视频免费观看 | 久久一久久 | 国产一区2区 | 久久久www成人免费精品 | 成人精品国产一区二区4080 | 91一区二区 | 欧美日批 | 久久国产区 | 亚洲一二三在线观看 | 久久精品国产久精国产 | www.日韩 | 欧美黄色精品 | 久草在线免费资源 | 久久免费视频观看 |