找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4975|回复: 2
收起左侧

请帮忙指导一下单片机8位共阳数码管循环显示0-9,谢谢!

[复制链接]
ID:709752 发表于 2020-3-26 22:50 | 显示全部楼层 |阅读模式
各位高手你们好!我这个51开发板(STC89C52)是10多年前的板子;板子上是2组4位共阳数码管,组成的8位数码管;没有

锁存器;位选是用三极管驱动的。请高手们。帮我优化一下这个程序。谢谢!!!
循环显示.png
/*****八位数码管循环显示数字0--9;这是个笨方法,请高手指点,谢谢!*****/

单片机源程序如下:
  1. #include "reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint i,j;

  5. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x90};//段选数字0-9;
  6. uchar code  wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选开关

  7. void delay()
  8.    {
  9.      unsigned char i,j;
  10.      for(i=250;i>0;i--)
  11.      {
  12.           for(j=250;j>0;j--);
  13.           }

  14.    }  
  15. void main()
  16.   {
  17.     while(1)
  18.     {
  19.       for(i=0;i<8;i++)
  20.         {
  21.           P2=wela[i] ;
  22.                   
  23.           P0=table[i];
  24.                    delay();
  25.                     delay();
  26.                          delay(); }//第一次依次显示0--7;
  27.                   for(i=0;i<2;i++)
  28.                   {
  29.                   P2=wela[i];
  30.                   P0=table[8+i];
  31.                   delay();
  32.                   delay();
  33.                          delay();
  34.                   }//循环下来,第一位显示8,第二位显示9;
  35.               for(i>=2;i<8;i++)
  36.                             {
  37.                                   P2=wela[i];
  38.                           P0=table[i-2];
  39.                           delay();
  40.                                   delay();
  41.                          delay();
  42.                                 }//从第三位到第八位显示0--5;
  43.                                    for(i=0;i<4;i++)
  44.                             {
  45.                                P2=wela[i];
  46.                                P0=table[6+i];
  47.                                delay();
  48.                                            delay();
  49.                          delay();
  50.                                            }//继续从第1位到第四位显示6--9;
  51.                                            for(i>=4;i<8;i++)
  52.                                              {
  53.                                                          P2=wela[i];
  54.                                     P0=table[i-4];
  55.                                     delay();
  56.                                                         delay();
  57.                          delay();
  58.                                                  }//从第五位到第八位显示0--3;
  59.                                             for(i=0;i<6;i++)
  60.                                      {
  61.                                         P2=wela[i];
  62.                                         P0=table[4+i];
  63.                                         delay();
  64.                                                                 delay();
  65.                          delay();
  66.                                                     }//从第1位到第六位显示4--9;
  67.                                                     for(i>=6;i<8;i++)
  68.                                                        {
  69.                                                                   P2=wela[i];
  70.                                              P0=table[i-6];
  71.                                              delay();
  72.                                                                          delay();
  73.                          delay();
  74.                                                            }//从第七位到第八位显示0和1;
  75.                                                                         for(i=0;i<8;i++)
  76.                                            {
  77.                                                P2=wela[i] ;
  78.                                                                                              P0=table[i+2];
  79.                                                        delay();
  80.                                                        delay();
  81.                                                            delay(); }//从第一位到第八位显示2--9;完成一个整

  82. 循环。

  83.    }
  84.    }
复制代码

回复

使用道具 举报

ID:213173 发表于 2020-3-27 08:12 | 显示全部楼层
添加一个显示缓存,可以大幅度简化代码。
  1. #include "reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint i,j,k;
  5. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选数字0-9;
  6. uchar code  wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选开关
  7. uchar data dis_buf[11];//显示缓存
  8. void delay(uint k) //ms延时程序
  9. {
  10.         uint i,j;
  11.         for(i=k;i>0;i--)
  12.                 for(j=120;j>0;j--);
  13. }  
  14. void main()
  15. {
  16.         for(i=0;i<10;i++)
  17.         {//将需要显示的数字0~9按序保存在显示缓存中
  18.                 dis_buf[i]=table[i];       
  19.         }
  20.         while(1)
  21.         {
  22.                 P0=0xff;//消隐
  23.                 P2=wela[j];//送位码
  24.                 P0=dis_buf[j];//送段码
  25.                 j++;        //数码管动态显示计数
  26.                 if(j==8)
  27.                 {
  28.                         j=0;
  29.                         k++;    //更新速度计数
  30.                         if(k==50)//可以调整显示更新速度
  31.                         {
  32.                                 k=0;
  33.                                 dis_buf[10]=dis_buf[0];//将显示缓存0移动到10
  34.                                 for(i=0;i<10;i++)
  35.                                 {
  36.                                         dis_buf[i]=dis_buf[i+1];//显示缓存全部移动一位
  37.                                 }
  38.                         }
  39.                 }
  40.                 delay(2);//控制主循环速度
  41.         }
  42. }
复制代码
回复

使用道具 举报

ID:709752 发表于 2020-3-27 12:15 | 显示全部楼层
wulin 发表于 2020-3-27 08:12
添加一个显示缓存,可以大幅度简化代码。

谢谢您!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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