标题:
请帮忙指导一下单片机8位共阳数码管循环显示0-9,谢谢!
[打印本页]
作者:
147035206
时间:
2020-3-26 22:50
标题:
请帮忙指导一下单片机8位共阳数码管循环显示0-9,谢谢!
各位高手你们好!我这个51开发板(STC89C52)是10多年前的板子;板子上是2组4位共阳数码管,组成的8位数码管;没有
锁存器;位选是用三极管驱动的。请高手们。帮我优化一下这个程序。谢谢!!!
循环显示.png
(7.31 KB, 下载次数: 50)
下载附件
2020-3-26 23:03 上传
/*****八位数码管循环显示数字0--9;这是个笨方法,请高手指点,谢谢!*****/
单片机源程序如下:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uint i,j;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x90};//段选数字0-9;
uchar code wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选开关
void delay()
{
unsigned char i,j;
for(i=250;i>0;i--)
{
for(j=250;j>0;j--);
}
}
void main()
{
while(1)
{
for(i=0;i<8;i++)
{
P2=wela[i] ;
P0=table[i];
delay();
delay();
delay(); }//第一次依次显示0--7;
for(i=0;i<2;i++)
{
P2=wela[i];
P0=table[8+i];
delay();
delay();
delay();
}//循环下来,第一位显示8,第二位显示9;
for(i>=2;i<8;i++)
{
P2=wela[i];
P0=table[i-2];
delay();
delay();
delay();
}//从第三位到第八位显示0--5;
for(i=0;i<4;i++)
{
P2=wela[i];
P0=table[6+i];
delay();
delay();
delay();
}//继续从第1位到第四位显示6--9;
for(i>=4;i<8;i++)
{
P2=wela[i];
P0=table[i-4];
delay();
delay();
delay();
}//从第五位到第八位显示0--3;
for(i=0;i<6;i++)
{
P2=wela[i];
P0=table[4+i];
delay();
delay();
delay();
}//从第1位到第六位显示4--9;
for(i>=6;i<8;i++)
{
P2=wela[i];
P0=table[i-6];
delay();
delay();
delay();
}//从第七位到第八位显示0和1;
for(i=0;i<8;i++)
{
P2=wela[i] ;
P0=table[i+2];
delay();
delay();
delay(); }//从第一位到第八位显示2--9;完成一个整
循环。
}
}
复制代码
作者:
wulin
时间:
2020-3-27 08:12
添加一个显示缓存,可以大幅度简化代码。
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uint i,j,k;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选数字0-9;
uchar code wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选开关
uchar data dis_buf[11];//显示缓存
void delay(uint k) //ms延时程序
{
uint i,j;
for(i=k;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
for(i=0;i<10;i++)
{//将需要显示的数字0~9按序保存在显示缓存中
dis_buf[i]=table[i];
}
while(1)
{
P0=0xff;//消隐
P2=wela[j];//送位码
P0=dis_buf[j];//送段码
j++; //数码管动态显示计数
if(j==8)
{
j=0;
k++; //更新速度计数
if(k==50)//可以调整显示更新速度
{
k=0;
dis_buf[10]=dis_buf[0];//将显示缓存0移动到10
for(i=0;i<10;i++)
{
dis_buf[i]=dis_buf[i+1];//显示缓存全部移动一位
}
}
}
delay(2);//控制主循环速度
}
}
复制代码
作者:
147035206
时间:
2020-3-27 12:15
wulin 发表于 2020-3-27 08:12
添加一个显示缓存,可以大幅度简化代码。
谢谢您!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1