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

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

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
初學(xué)單片機(jī),學(xué)到LED數(shù)碼管顯示的時(shí)候,發(fā)現(xiàn)個(gè)位數(shù)顯示快,到了十位數(shù)及以上的時(shí)候,速度就慢下來(lái)了。
單純調(diào)延時(shí)似乎不行,想要做成每次加1的速度都差不多時(shí)間,不知道這個(gè)該怎么解決?


#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit clk = P3^0;
sbit dat = P3^1;
sbit sclk1 = P3^2;
sbit sclk2 = P3^3;
uchar code num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay100us(uint n)
{
   uchar i;
   for(;n>0;n--)
   {
      for(i=0;i<10;i++){;}
   }
}

void data_num(uchar dat8)        //串口數(shù)據(jù)發(fā)送數(shù)字?jǐn)?shù)據(jù)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      clk = 0;
      dat = (dat8 >> i) & 0x01;
      clk = 1;
   }
   sclk1 = 0;
   sclk1 = 1;
}

void digit_num(uchar digit)        //串口數(shù)據(jù)發(fā)送LED位數(shù)數(shù)據(jù)
{
   uchar i;
   for(i=0;i<8;i++)
   {
      clk = 0;
      dat = (digit >> i) & 0x01;
      clk = 1;
   }
   sclk2 = 0;
   sclk2 = 1;
}

int digit_check(ulong n)        //檢測(cè)顯示目標(biāo)數(shù)的位數(shù)
{
   uchar m;
   if(n>9999999)
   m = 8;
   else if(n>999999)
   m = 7;
   else if(n>99999)
   m = 6;
   else if(n>9999)
   m = 5;
   else if(n>999)
   m = 4;
   else if(n>99)
   m = 3;
   else if(n>9)
   m = 2;
   else
   m = 1;
   return m;
}


int main(void)
{
   ulong i,n;
   uint ii,j,m;
   while(1)
   {
      for(i=0;i<100000000;i++)        //從0顯示到9999 9999
      {
         for(ii=0;ii<30;ii++)        //顯示延時(shí)
         {
            m = digit_check(i);
            n = i;
            for(j=0;j<m;j++)
            {
               data_num(0xff);
               digit_num(0x01 << j);
               data_num(num[n%10]);
               delay100us(100);
               n = n/10;
            }
         }
      }
   }
}


05_LED串口動(dòng)態(tài)掃描顯示.zip

27.36 KB, 下載次數(shù): 6

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:94031 發(fā)表于 2023-5-17 14:05 | 只看該作者
顯示數(shù)目遞進(jìn)不要用for,用定時(shí)間隔+1.
回復(fù)

使用道具 舉報(bào)

板凳
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ù)字?jǐn)?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. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

地板
ID:647261 發(fā)表于 2023-5-17 15:31 | 只看該作者
xuyaqi 發(fā)表于 2023-5-17 14:05
顯示數(shù)目遞進(jìn)不要用for,用定時(shí)間隔+1.

感謝!
改用定時(shí)器,果然正常顯示了
改后代碼如下:
  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ù)字?jǐn)?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)        //檢測(cè)顯示目標(biāo)數(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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:647261 發(fā)表于 2023-5-18 09:09 | 只看該作者

這個(gè)好,省一個(gè)IO口,代碼看起來(lái)也更短
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 自拍偷拍亚洲欧美 | 欧美激情五月 | 97影院在线午夜 | 久久成人免费视频 | 色五月激情五月 | 国产伊人久久久 | 国产精品久久久久久久久免费 | 中文字幕高清免费日韩视频在线 | 欧美精品一区二区三区蜜桃视频 | 欧美一区免费 | 91不卡在线 | 91人人视频在线观看 | 亚洲精品1| 岛国毛片在线观看 | 色女人天堂 | 亚洲高清av在线 | 亚洲在线电影 | 天堂在线www | 五月天婷婷综合 | 欧美福利一区 | 免费观看一级特黄欧美大片 | 99精品久久久国产一区二区三 | 国产精品久久久久无码av | 天天躁日日躁狠狠的躁天龙影院 | 九色在线 | 国产色99精品9i | 99精品视频一区二区三区 | 久久99深爱久久99精品 | 免费精品视频在线观看 | 丝袜 亚洲 欧美 日韩 综合 | 9191在线观看 | 在线观看www高清视频 | 我爱操 | 99在线资源| 国产精品亚洲成在人线 | 亚洲精品免费在线观看 | 人操人人干人 | 久久精品一级 | 欧美日韩亚洲国产 | 日日操日日舔 | 日韩不卡在线 |