找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

8位LED數(shù)碼管顯示從0到9999 9999

查看數(shù): 2046 | 評論數(shù): 4 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2023-5-17 10:44

正文摘要:

初學單片機,學到LED數(shù)碼管顯示的時候,發(fā)現(xiàn)個位數(shù)顯示快,到了十位數(shù)及以上的時候,速度就慢下來了。 單純調(diào)延時似乎不行,想要做成每次加1的速度都差不多時間,不知道這個該怎么解決? #include <reg5 ...

回復

ID:647261 發(fā)表于 2023-5-18 09:09

這個好,省一個IO口,代碼看起來也更短
ID:647261 發(fā)表于 2023-5-17 15:31
xuyaqi 發(fā)表于 2023-5-17 14:05
顯示數(shù)目遞進不要用for,用定時間隔+1.

感謝!
改用定時器,果然正常顯示了
改后代碼如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long
  6. sbit clk = P3^0;
  7. sbit dat = P3^1;
  8. sbit sclk1 = P3^2;
  9. sbit sclk2 = P3^3;
  10. uchar code num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11. ulong number;
  12. uchar a = 0;

  13. void delay100us(uint n)
  14. {
  15.    uchar i;
  16.    for(;n>0;n--)
  17.    {
  18.       for(i=0;i<10;i++){;}
  19.    }
  20. }

  21. void T0_init()
  22. {
  23.    TMOD = 0x01;
  24.    TH0  = (65536-50000)/256;
  25.    TL0  = (65536-50000)%256;
  26.    EA   = 1;
  27.    ET0  = 1;
  28.    TR0  = 1;
  29. }

  30. void T0_timer() interrupt 1
  31. {
  32.    TH0  = (65536-50000)/256;
  33.    TL0  = (65536-50000)%256;
  34.    a++;
  35.    if(a == 10)
  36.    {
  37.       ++number;
  38.       a = 0;
  39.    }
  40.    if(number == 100000000) number = 0;
  41. }

  42. void data_num(uchar dat8)        //串口數(shù)據(jù)發(fā)送數(shù)字數(shù)據(jù)
  43. {
  44.    uchar i;
  45.    for(i=0;i<8;i++)
  46.    {
  47.       clk = 0;
  48.       dat = (dat8 >> i) & 0x01;
  49.       clk = 1;
  50.    }
  51.    sclk1 = 0;
  52.    sclk1 = 1;
  53. }

  54. void digit_num(uchar digit)        //串口數(shù)據(jù)發(fā)送LED位數(shù)數(shù)據(jù)
  55. {
  56.    uchar i;
  57.    for(i=0;i<8;i++)
  58.    {
  59.       clk = 0;
  60.       dat = (digit >> i) & 0x01;
  61.       clk = 1;
  62.    }
  63.    sclk2 = 0;
  64.    sclk2 = 1;
  65. }

  66. int digit_check(ulong n)        //檢測顯示目標數(shù)的位數(shù)
  67. {
  68.    uchar m;
  69.    if(n>9999999)
  70.    m = 8;
  71.    else if(n>999999)
  72.    m = 7;
  73.    else if(n>99999)
  74.    m = 6;
  75.    else if(n>9999)
  76.    m = 5;
  77.    else if(n>999)
  78.    m = 4;
  79.    else if(n>99)
  80.    m = 3;
  81.    else if(n>9)
  82.    m = 2;
  83.    else
  84.    m = 1;
  85.    return m;
  86. }

  87.    
  88. int main(void)
  89. {
  90.    ulong n;
  91.    uint i,m;
  92.    number = 0;
  93.    T0_init();
  94.    while(1)
  95.    {
  96.       m = digit_check(number);
  97.       n = number;
  98.       for(i=0;i<m;i++)
  99.       {
  100.          data_num(0xff);
  101.          digit_num(0x01 << i);
  102.          data_num(num[n%10]);
  103.          //delay100us(100);
  104.          n = n/10;
  105.       }
  106.    }
  107. }
復制代碼
ID:213173 發(fā)表于 2023-5-17 15:02

  1. #include <reg51.h>
  2. //#include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long
  6. sbit clk = P3^0;
  7. sbit dat = P3^1;
  8. sbit sclk1 = P3^2;
  9. //sbit sclk2 = P3^3;
  10. uchar code num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11. uchar data buf[8];
  12. ulong n,m;
  13. uchar i,k;
  14. uint j;

  15. void data_num(uchar dat8,digit)        //串口數(shù)據(jù)發(fā)送數(shù)字數(shù)據(jù)
  16. {
  17.    uchar i;
  18.    for(i=0;i<8;i++)
  19.    {
  20.       clk = 0;
  21.       dat = (dat8 >> i) & 0x01;
  22.       clk = 1;
  23.    }
  24.    for(i=0;i<8;i++)
  25.    {
  26.       clk = 0;
  27.       dat = (digit >> i) & 0x01;
  28.       clk = 1;
  29.    }
  30.    sclk1 = 0;
  31.    sclk1 = 1;
  32. }

  33. void InitTimer0(void)//@12MHz 1ms
  34. {
  35.     TMOD = 0x01;
  36.     TH0 = 0x0FC;
  37.     TL0 = 0x18;
  38.     EA = 1;
  39.     ET0 = 1;
  40.     TR0 = 1;
  41. }

  42. int main(void)
  43. {
  44.         InitTimer0();
  45.    while(1)
  46.    {
  47.                 m=n;
  48.                 for(i=0;i<8;i++)
  49.                 {
  50.                         buf[i]=m%10;
  51.                         m/=10;
  52.                 }
  53.    }
  54. }

  55. void Timer0Interrupt(void) interrupt 1
  56. {
  57.         TH0 = 0xFC;
  58.         TL0 = 0x18;
  59.         j++;
  60.         if(j>=500)//500ms       
  61.         {
  62.                 j=0;
  63.                 if(++n>99999999)
  64.                         n=0;
  65.         }
  66.         data_num(0x01<<k,num[buf[k]]);
  67.         k=++k%8;
  68. }
復制代碼



ID:94031 發(fā)表于 2023-5-17 14:05
顯示數(shù)目遞進不要用for,用定時間隔+1.

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表