找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1340|回复: 4
收起左侧

8位LED数码管显示从0到9999 9999

[复制链接]
ID:647261 发表于 2023-5-17 10:44 | 显示全部楼层 |阅读模式
初学单片机,学到LED数码管显示的时候,发现个位数显示快,到了十位数及以上的时候,速度就慢下来了。
单纯调延时似乎不行,想要做成每次加1的速度都差不多时间,不知道这个该怎么解决?

原理图

原理图


#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)        //串口数据发送数字数据
{
   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)        //串口数据发送LED位数数据
{
   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)        //检测显示目标数的位数
{
   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++)        //显示延时
         {
            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串口动态扫描显示.zip

27.36 KB, 下载次数: 6

回复

使用道具 举报

ID:94031 发表于 2023-5-17 14:05 | 显示全部楼层
显示数目递进不要用for,用定时间隔+1.
回复

使用道具 举报

ID:213173 发表于 2023-5-17 15:02 | 显示全部楼层
无标题.jpg
  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)        //串口数据发送数字数据
  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:647261 发表于 2023-5-17 15:31 | 显示全部楼层
xuyaqi 发表于 2023-5-17 14:05
显示数目递进不要用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)        //串口数据发送数字数据
  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)        //串口数据发送LED位数数据
  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)        //检测显示目标数的位数
  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:647261 发表于 2023-5-18 09:09 | 显示全部楼层

这个好,省一个IO口,代码看起来也更短
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表