找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5960|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)碼管動(dòng)態(tài)掃描程序,有一個(gè)沒(méi)搞懂,求解惑!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:404479 發(fā)表于 2018-11-7 14:57 來(lái)自手機(jī) | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
以下這段是數(shù)碼管動(dòng)態(tài)掃描的單片機(jī)程序,這段程序?qū)崿F(xiàn)的是8個(gè)數(shù)碼管同時(shí)循環(huán)顯示11111111,22222222,一直到99999999,以下幾個(gè)地方我不明白,大家?guī)臀抑笇?dǎo)以下:
①數(shù)碼管用共陰極,用的是138譯碼器控制8和數(shù)碼管的負(fù)級(jí),大家知道,138譯碼器一次性只能輸出一位低電平,不能同時(shí)全輸出低電平,也就是只能通過(guò)switch選擇語(yǔ)句來(lái)一位一位的點(diǎn)亮,不能實(shí)現(xiàn)同時(shí)一起點(diǎn)亮同一個(gè)數(shù),并且循環(huán)掃描顯示,于是,我就請(qǐng)教了很多論壇朋友,他們修改了一段代碼,我就不理解是什么意思,也就是從我編寫(xiě)的原基礎(chǔ)上,增加了:
void main()
{        
unsigned char i;
        while(1)
        {        
          for  (i=0;i<200;i++)     
                                        {
                                                DigDisplay();  
                                        }
                                        k++;
                                        if (k>9)
                                        {
                                                k=0;
                                        }
        }               
}
我看不懂的是,它在main主函數(shù)里增加要循環(huán)200次這個(gè)子函數(shù)的意義是什么,這樣會(huì)不會(huì)是為了快速刷新子函數(shù)里面的這個(gè)switch反復(fù)執(zhí)行來(lái)達(dá)到138譯碼器全部無(wú)間隔的提供負(fù)級(jí),讓數(shù)碼管顯示00000000,11111111,這樣循環(huán)顯示到99999999然后又從0開(kāi)始?是這樣嗎?
以下是網(wǎng)友們修改的代碼,可以實(shí)現(xiàn)同時(shí)一起動(dòng)態(tài)掃描顯示,我就不理解為何要讓子函數(shù)執(zhí)行200次的循環(huán)!
修改后我不能理解的程序:
  1. #include "reg52.h"                     
  2. typedef unsigned int u16;         
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. unsigned char k=0;

  8. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


  10. void delay(u16 i)
  11. {
  12.         while(i--);        
  13. }


  14. void DigDisplay()
  15. {
  16.         u8 i;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 switch(i)         
  20.                 {
  21.                         case(0):
  22.                                 LSA=0;LSB=0;LSC=0; break;
  23.                         case(1):
  24.                                 LSA=1;LSB=0;LSC=0; break;
  25.                         case(2):
  26.                                 LSA=0;LSB=1;LSC=0; break;
  27.                         case(3):
  28.                                 LSA=1;LSB=1;LSC=0; break;
  29.                         case(4):
  30.                                 LSA=0;LSB=0;LSC=1; break;
  31.                         case(5):
  32.                                 LSA=1;LSB=0;LSC=1; break;
  33.                         case(6):
  34.                                 LSA=0;LSB=1;LSC=1; break;
  35.                         case(7):
  36.                                 LSA=1;LSB=1;LSC=1; break;        
  37.                 }
  38.                 P0=smgduan[k];
  39.                 delay(100);      
  40.                 P0=0x00;
  41.         }
  42. }


  43. void main()
  44. {        
  45. unsigned char i;
  46.         while(1)
  47.         {        
  48.           for  (i=0;i<200;i++)     
  49.                                         {
  50.                                                 DigDisplay();  
  51.                                         }
  52.                                         k++;
  53.                                         if (k>9)
  54.                                         {
  55.                                                 k=0;
  56.                                         }
  57.         }               
  58. }
復(fù)制代碼


下面是我個(gè)人寫(xiě)的不能同時(shí)顯示得程序,這個(gè)程序就只能利用動(dòng)態(tài)掃描來(lái)顯示出1234567,就不動(dòng)了!


  1. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

  2. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;

  7. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值


  9. void delay(u16 i)
  10. {
  11.         while(i--);        
  12. }


  13. void DigDisplay()
  14. {
  15.         u8 i;
  16.         for(i=0;i<8;i++)
  17.         {
  18.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  19.                 {
  20.                         case(0):
  21.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  22.                         case(1):
  23.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  24.                         case(2):
  25.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  26.                         case(3):
  27.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  28.                         case(4):
  29.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  30.                         case(5):
  31.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  32.                         case(6):
  33.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  34.                         case(7):
  35.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  36.                 }
  37.                 P0=smgduan[i];//發(fā)送段碼
  38.                 delay(100); //間隔一段時(shí)間掃描        
  39.                 P0=0x00;//消隱
  40.         }
  41. }


  42. void main()
  43. {        
  44.         while(1)
  45.         {        
  46.                 DigDisplay();  //數(shù)碼管顯示函數(shù)        
  47.         }               
  48. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:419294 發(fā)表于 2018-11-7 16:43 | 只看該作者
動(dòng)態(tài)掃描就是幾個(gè)數(shù)碼顯示的數(shù)字式一直顯示的,實(shí)際上是一個(gè)一個(gè)在顯示,這就是動(dòng)態(tài)顯示
回復(fù)

使用道具 舉報(bào)

板凳
ID:89515 發(fā)表于 2018-11-7 17:15 | 只看該作者
顯示同一個(gè)數(shù)的次數(shù),相當(dāng)于延時(shí)
回復(fù)

使用道具 舉報(bào)

地板
ID:394504 發(fā)表于 2018-11-7 17:54 | 只看該作者
你的 i 先復(fù)制為零 在循環(huán)八次 之后 i就為八了 所以就不會(huì)繼續(xù)顯示了 所以你的i要去判斷
if (i == 8)
{
    i = 0;
}
回復(fù)

使用道具 舉報(bào)

5#
ID:272089 發(fā)表于 2018-11-7 18:13 | 只看該作者
  1. uchar code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  2. uchar buf1[8];

  3. void dis()
  4. {
  5.     uchar i,j=0x7f;
  6.         for(i=0;i<8;i++)
  7.         {
  8.            cs1=0;cs2=1;
  9.            P0=ledcode[buf1[i]];wr=1;wr=0;
  10.            cs1=1;cs2=0;
  11.            P0=j;wr=1;wr=0;
  12.            delay(100);
  13.            cs1=cs2=1;
  14.            j=_cror_(j,1);
  15.            P0=0xff;wr=1;wr=0;
  16.         }
  17. }
  18. void main()
  19. {
  20.      buf[0]=1;                          //想用第幾個(gè)數(shù)碼管就寫(xiě)buf[幾]
  21.      buf[1]=2;                          //等于后面的是用來(lái)顯示上面的數(shù)組的,
  22.                                             //等于1就是顯示ledcode的第一個(gè)數(shù)組也就是1
  23.      buf[2]=3;                         //不過(guò)我這個(gè)是共陰極的數(shù)碼管
  24.      while(1){dis();}
  25. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2018-11-7 22:03 | 只看該作者
他在main主函數(shù)里增加要循環(huán)200次是為了延時(shí),使0~9變化不至于太快而無(wú)法辨識(shí)。也就是數(shù)碼管動(dòng)態(tài)掃描顯示200次,顯示內(nèi)容才變化1次。由于單片機(jī)運(yùn)行速度非?,你要處理的任務(wù)又很少,主循環(huán)周期很短。0~9變化太快你看到的是筆畫(huà)亮度不均的8字。壇友是在你的程序基礎(chǔ)上優(yōu)化的,在實(shí)際應(yīng)用中不可能是這樣處理的。
回復(fù)

使用道具 舉報(bào)

7#
ID:111634 發(fā)表于 2018-11-8 09:06 | 只看該作者
還是要打基礎(chǔ),學(xué)理論,否則,問(wèn)題多多,事倍功半。
回復(fù)

使用道具 舉報(bào)

8#
ID:381277 發(fā)表于 2018-11-8 10:30 | 只看該作者
第一段程序的變量k是兩段程序運(yùn)行結(jié)果不一樣的關(guān)鍵
回復(fù)

使用道具 舉報(bào)

9#
ID:123289 發(fā)表于 2018-11-8 13:38 | 只看該作者
是你未理解如何掃描:
準(zhǔn)備好一行的顯示碼 → 關(guān)所有顯示(防止因切換引起錯(cuò)碼閃動(dòng))→ 輸出顯示碼 → 打開(kāi)顯示
→ 間隔一段時(shí)間(這段時(shí)間才能讓人眼感覺(jué)到顯示的信息!間隔小了人眼看分不清,間隔大了有閃爍感,需要仔細(xì)選擇)
下一行開(kāi)始,如發(fā)泡制。
回復(fù)

使用道具 舉報(bào)

10#
ID:404479 發(fā)表于 2018-11-16 19:27 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2018-11-7 22:03
他在main主函數(shù)里增加要循環(huán)200次是為了延時(shí),使0~9變化不至于太快而無(wú)法辨識(shí)。也就是數(shù)碼管動(dòng)態(tài)掃描顯示20 ...

謝謝,我明白了!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表