標(biāo)題: 單片機(jī)驅(qū)動8位數(shù)碼管怎么讓其中2位閃爍,求助大佬 [打印本頁]

作者: 千年約定    時間: 2021-2-15 20:29
標(biāo)題: 單片機(jī)驅(qū)動8位數(shù)碼管怎么讓其中2位閃爍,求助大佬
現(xiàn)在情況是只能整體閃爍不知道怎么控制其中2位閃爍
代碼如下
  1. #include  "reg52.h"
  2. sbit  a=P2^2;
  3. sbit  b=P2^3;
  4. sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. sbit  k8=P3^7;

  9.    unsigned  char  i=0;
  10.    unsigned  int   l=0;
  11.    unsigned   int  flag=0;
  12.    unsigned   int  cishu=1;
  13.    unsigned    ssec=0,sec=5,min=0;
  14.    unsigned   DisplayData[8];
  15.    unsigned code  dongtai[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  17.      void  delay(unsigned  int  i)
  18.      {
  19.         while(i--);
  20.      }

  21.             void Timer0Init()
  22.           {
  23.             
  24.                          TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  25.             TH0=0Xd8;        //給定時器賦初值,定時10ms
  26.                 TL0=0Xf0;        
  27.                 ET0=1;//打開定時器0中斷允許
  28.                 EA=1;//打開總中斷
  29.                 TR0=1;//打開定時器                        
  30.           }

  31.                      void Timer1Init()
  32.             {
  33.                     TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
  34.                     TH1=0XFC;        //給定時器賦初值,定時1ms
  35.                     TL1=0X18;        
  36.                     ET1=1;//打開定時器1中斷允許
  37.                     EA=1;//打開總中斷
  38.                     TR1=1;//打開定時器                        
  39.             }

  40.   void  aaa()
  41. {

  42.         DisplayData[4]=dongtai[min/10];
  43.         DisplayData[5]=dongtai[min%10]+0x80;
  44.         DisplayData[6]=dongtai[sec/10];
  45.         DisplayData[7]=dongtai[sec%10];

  46.          
  47.             DisplayData[0]=dongtai[cishu];        
  48.             DisplayData[1]=0x80;
  49.             DisplayData[2]=0x80;
  50.             DisplayData[3]=0x80;
  51.          
  52.          
  53.            if(min==0&&sec==0)
  54.             {
  55.                    DisplayData[4]= 0x3f;
  56.                    DisplayData[5]= 0x3f+0x80;
  57.                    DisplayData[6]= 0x3f;
  58.                    DisplayData[7]= 0x3f;
  59.             }
  60. }
  61.   void  abc()
  62. {
  63.         for(i=0;i<8;i++)
  64.         { switch(i)
  65.           { case(0): a=0;b=0;c=0; break;
  66.             case(1): a=1;b=0;c=0; break;
  67.             case(2): a=0;b=1;c=0; break;
  68.                 case(3): a=1;b=1;c=0; break;
  69.                 case(4): a=0;b=0;c=1; break;
  70.                 case(5): a=1;b=0;c=1; break;
  71.                 case(6): a=0;b=1;c=1; break;
  72.                 case(7): a=1;b=1;c=1; break;
  73.           }
  74.            if(l==1&&(i==0||i==1))
  75.            {
  76.                   Timer1Init();
  77.                            
  78.            }            
  79.           P0=DisplayData[i];
  80.                   
  81.                 delay(100);  
  82.                 P0=0x00;
  83.         
  84.     }                 
  85. }
  86.   void  main()
  87. {
  88.              P0=0x00;
  89.          while(1)
  90.        {  
  91.                    if(k1!=0xFF)
  92.                    delay(1000);
  93.                    if(k1!=0xFF)
  94.                   {                        
  95.                       flag++;
  96.                       if(flag==1)
  97.                         {
  98.                                        
  99.                     }
  100.                    else  if(flag>1)
  101.                   {
  102.                           flag=1;
  103.                           cishu++;
  104.                           if(cishu>=9)
  105.                         {
  106.                             cishu=1;
  107.                     }
  108.                   }
  109.                           Timer0Init();
  110.                                  sec=5;
  111.                             min=0;
  112.                  }  
  113.                  while(!k1);
  114.                              
  115.                   
  116.                    if(k2!=0xFF)
  117.                    delay(30000);
  118.                    if(k2!=0xFF)
  119.                   {                 
  120.                          l++;
  121.                          while(!k2);
  122.                           if(l>=5)
  123.                           {
  124.                            l=0;
  125.                           }
  126.                   }
  127.                   
  128.                   
  129.                   abc();        
  130.                   aaa();
  131.            }                                 
  132. }         

  133.    void Timer0() interrupt 1
  134. {
  135.         TH0=0Xd8;        //給定時器賦初值,定時10ms
  136.         TL0=0Xf0;
  137.         
  138.         ssec++;
  139.         if(ssec>=100)  //1s
  140.         {
  141.           ssec=0;
  142.           sec--;        
  143.           if(sec<=0)
  144.          {
  145.             if(min>0)
  146.            {
  147.                  sec=60;
  148.              min--;
  149.            }
  150.                 if(min<=0)
  151.            {         
  152.                    if(sec==0)
  153.                   {
  154.                       TR0=0;
  155.                   }
  156.            }
  157.          }
  158.         }
  159. }

  160.   void Timer1() interrupt 3
  161. {
  162.         static unsigned  int  j=0;
  163.         TH1=0XFC;        //給定時器賦初值,定時1ms
  164.         TL1=0X18;         
  165.         j++;  
  166.         if(j>=500)         
  167.         {
  168.                 j=0;
  169.           P0=0x00;
  170.           delay(20000);
  171.                   
  172.         }        
  173. }   
復(fù)制代碼
   


作者: xianfajushi    時間: 2021-2-16 07:50
可參https://blog.csdn.net/xianfajushi/article/details/94927172
作者: 千年約定    時間: 2021-2-16 20:12
xianfajushi 發(fā)表于 2021-2-16 07:50
可參https://blog.csdn.net/xianfajushi/article/details/94927172

多謝大佬我去看看
作者: 千年約定    時間: 2021-2-16 20:49
xianfajushi 發(fā)表于 2021-2-16 07:50
可參https://blog.csdn.net/xianfajushi/article/details/94927172

sbit duan = P2^6;//數(shù)碼段
sbit wei = P2^7;//數(shù)碼位

不太明白為什么一個引腳就能控制數(shù)碼管的位和段顯示
我寫的是8位數(shù)碼管呀
真想不明白
作者: wulin    時間: 2021-2-16 22:23
你這程序?qū)懙脝栴}不少,難以達(dá)到預(yù)期效果,給你改了,仿真正常。


  1. #include  "reg52.h"
  2. //sbit  a=P2^2;
  3. //sbit  b=P2^3;
  4. //sbit  c=P2^4;
  5. sbit  k1=P3^0;
  6. sbit  k2=P3^1;
  7. sbit  k4=P3^3;
  8. //sbit  k8=P3^7;

  9. unsigned char num,cishu=0;
  10. //unsigned int   l=0;
  11. bit flag=0;
  12. unsigned int ssec=0;
  13. char sec=0,min=0;
  14. bit sign=0;
  15. bit flash;
  16. unsigned char DisplayData[8];
  17. unsigned char code dongtai[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  18.                                                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  19. void  delay(unsigned int i)
  20. {
  21.         while(i--);
  22. }

  23. void Timer0Init()
  24. {
  25.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。      
  26.         TH0 = 0xFC;                //設(shè)置定時初值定時1ms
  27.         TL0 = 0x18;                //設(shè)置定時初值
  28.         ET0=1;//打開定時器0中斷允許
  29.         EA=1;//打開總中斷
  30.         TR0=1;//打開定時器                        
  31. }
  32. /*
  33. void Timer1Init()
  34. {
  35.         TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
  36.         TH1=0XFC;        //給定時器賦初值,定時1ms
  37.         TL1=0X18;        
  38.         ET1=1;//打開定時器1中斷允許
  39.         EA=1;//打開總中斷
  40.         TR1=1;//打開定時器                        
  41. }*/

  42. void  aaa()
  43. {
  44.         DisplayData[0]=dongtai[cishu];        
  45.         DisplayData[1]=0x40;
  46.         DisplayData[2]=0x40;
  47.         DisplayData[3]=0x40;
  48.         if(cishu==0)
  49.         {
  50.                 DisplayData[4]=dongtai[min/10];
  51.                 DisplayData[5]=dongtai[min%10]+0x80;
  52.                 DisplayData[6]=dongtai[sec/10];
  53.                 DisplayData[7]=dongtai[sec%10];
  54.         }
  55.         else
  56.         {
  57.                 if(cishu==1&&flash==1)
  58.                         DisplayData[4]=0;
  59.                 else
  60.                         DisplayData[4]=dongtai[min/10];
  61.                 if(cishu==2&&flash==1)
  62.                         DisplayData[5]=0x80;
  63.                 else
  64.                         DisplayData[5]=dongtai[min%10]+0x80;
  65.                 if(cishu==3&&flash==1)
  66.                         DisplayData[6]=0;
  67.                 else
  68.                         DisplayData[6]=dongtai[sec/10];
  69.                 if(cishu==4&&flash==1)
  70.                         DisplayData[7]=0;
  71.                 else
  72.                         DisplayData[7]=dongtai[sec%10];
  73.         }
  74.    /*
  75.         if(min==0&&sec==0)
  76.         {
  77.                 DisplayData[4]= 0x3f;
  78.                 DisplayData[5]= 0x3f+0x80;
  79.                 DisplayData[6]= 0x3f;
  80.                 DisplayData[7]= 0x3f;
  81.         }*/
  82. }

  83. void abc()
  84. {   
  85.         static unsigned char t=0;
  86.         P0=0x00;
  87.         P2&=0xe3;
  88.         P2|=(t<<2);
  89.         P0=DisplayData[t];
  90.         t=++t%8;
  91. }

  92. void  main()
  93. {
  94. //        P0=0x00;
  95.         Timer0Init();
  96.         while(1)
  97.         {  
  98.                 if(!k1||!k2||!k4)
  99.                 {
  100.                         delay(1000);
  101.                         if((!k1||!k2||!k4) && sign==0)
  102.                         {         
  103.                                 sign=1;
  104.                                 if(!k1 && flag==0)
  105.                                         cishu=++cishu%5;
  106.                                 if(!k2 && cishu>0)
  107.                                 {
  108.                                         switch(cishu)
  109.                                         {
  110.                                                 case 1: min+=10;if(min/10>5)min%=10; break;
  111.                                                 case 2: min++;if(min%10==0)min-=10; break;
  112.                                                 case 3: sec+=10;if(sec/10>5)sec%=10; break;
  113.                                                 case 4: sec++;if(sec%10==0)sec-=10; break;
  114.                                         }
  115.                                 }
  116.                                 if(!k4 && cishu==0)
  117.                                         flag=1;
  118.                         }
  119.                 }
  120.                 else sign=0;   
  121.                 aaa();
  122.         }
  123. }         

  124. void Timer0() interrupt 1
  125. {
  126.         TH0 = 0xFC;                //設(shè)置定時初值
  127.         TL0 = 0x18;                //設(shè)置定時初值
  128.         if(flag)
  129.         {
  130.                 if(min|sec!=0)
  131.                 {
  132.                         ssec++;
  133.                         if(ssec>=1000)  //1s
  134.                         {
  135.                                 ssec=0;
  136.                                 sec--;        
  137.                                 if(min==0&&sec==0)
  138.                                         flag=0;                       
  139.                                 else if(sec<0)
  140.                                 {
  141.                                         min--;
  142.                                         sec=59;
  143.                                 }
  144.                         }
  145.                 }
  146.                 else flag=0;
  147.         }
  148.         if(++num==200)
  149.         {
  150.                 num=0;
  151.                 flash=~flash;
  152.         }
  153.         abc();
  154. }
  155. /*
  156. void Timer1() interrupt 3
  157. {
  158.         static unsigned  int  j=0;
  159.         TH1=0XFC;        //給定時器賦初值,定時1ms
  160.         TL1=0X18;         
  161.         j++;  
  162.         if(j>=500)         
  163.         {
  164.                 j=0;
  165.                 P0=0x00;
  166.                 delay(20000);
  167.         }        
  168. }*/   
復(fù)制代碼




作者: 千年約定    時間: 2021-2-17 11:14
本帖最后由 千年約定 于 2021-2-17 20:29 編輯
wulin 發(fā)表于 2021-2-16 22:23
你這程序?qū)懙脝栴}不少,難以達(dá)到預(yù)期效果,給你改了,仿真正常。

大佬很感謝您認(rèn)真看了我的程序并且花了很多時間進(jìn)行了修改
很抱歉沒在問題上說清楚我的程序具體功能。功能是數(shù)碼管前兩位用來計(jì)數(shù)倒計(jì)時的次數(shù)的,最后四位用來做倒計(jì)時的時鐘,當(dāng)我按K1按鍵的時候開始倒計(jì)時,當(dāng)我長按K2按鍵的時候能夠修改次數(shù),分鐘,秒鐘,修改的時候?qū)?yīng)的數(shù)碼管能夠閃爍顯示,其他數(shù)碼管正常顯示,K4和K8用來對其加減

將您的程序略作修改后終于實(shí)現(xiàn)了2位閃爍功能
非常感謝

作者: wulin    時間: 2021-2-17 20:45
一位或多位數(shù)碼管閃爍原理時一樣的,按你的意圖修改并詳細(xì)注釋,應(yīng)該可以看得懂。
1秒至99分59秒倒計(jì)時程序數(shù)碼管閃爍示例 仿真.zip (124.42 KB, 下載次數(shù): 9)


作者: 千年約定    時間: 2021-2-17 23:06
wulin 發(fā)表于 2021-2-17 20:45
一位或多位數(shù)碼管閃爍原理時一樣的,按你的意圖修改并詳細(xì)注釋,應(yīng)該可以看得懂。

多謝大佬我去好好看看
作者: 兩儀式    時間: 2021-2-18 00:29
為什么一個位和段能控制顯示,因?yàn)橐粋單純的七段數(shù)碼管就要七個引腳去控制,如果8位的話,就需要56個腳,所以通過位選來選擇哪一位顯示,節(jié)省引腳。因此只能顯示一位,但是它顯示的很快,肉眼是看不出來的,也就等同于都亮了,你要亮哪個,選哪個就好了。


不用過多糾結(jié),都是電路來的。
作者: 千年約定    時間: 2021-2-18 09:49
兩儀式 發(fā)表于 2021-2-18 00:29
為什么一個位和段能控制顯示,因?yàn)橐粋單純的七段數(shù)碼管就要七個引腳去控制,如果8位的話,就需要56個腳, ...

多謝大佬解釋
作者: 12334345    時間: 2021-2-19 09:14
給高低電平并延時
作者: tyrl800    時間: 2021-2-20 15:24
樓主問題解決了嗎?
作者: 千年約定    時間: 2021-3-1 11:47
tyrl800 發(fā)表于 2021-2-20 15:24
樓主問題解決了嗎?

解決了





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1