|
初学单片机,学到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;
}
}
}
}
}
|
|