我现在能实现0.1-9999,小数点部分应该怎么改
#include
#define uint unsigned int
#define uchar unsigned char
uchar a[]={0x05,0x7d,0x46,0x54,0x3c,0x94,0x84,0x5d,0x04,0x14};//
uchar b[]={0xf7,0xef,0xdf,0xbf};
uchar c[]={0x01,0x79,0x42,0x50,0x38,0x90,0x80,0x59,0x00,0x10};//
uint time=0;
uint i,j,w,a1,a2,a3,a4;
void delayms(uint xms);
void display();
void display1();
void math(uint w);
void Timer0Init(void);
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
for(j=0;j<=9;)//小数循环
{
math(j);
display1();
//delayms(2);
P0=0xff;
}
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
for(i=1;i<=9999;)//整数循环
{
math(i);
display();
//delayms(2);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;//50ms
TL0=(65536-45872)%256;
time++;//小数
if(time==20)
{
j++;
time=0;
}
i++;//整数
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void math(uint w)
{
if(w>1)
{
a1=w/1000;//千位
a2=w%1000/100;//百位
a3=w%100/10;//十位
a4=w%10;//个位
}
}
void display1()
{
P2=b[2];
P0=c[0];
delayms(2);
P0=0xff;
P2=b[3];
P0=a[j];
delayms(2);
P0=0xff;
}
void display()
{
if(a1>0)
{
P2=b[0];
P0=a[a1];
delayms(2);
P0=0xff;
P2=b[1];
P0=a[a2];
delayms(2);
P0=0xff;
P2=b[2];
P0=a[a3];
delayms(2);
P0=0xff;
P2=b[3];
P0=a[a4];
delayms(2);
P0=0xff;
}
else
{
if(a2>0)
{
P2=b[1];
P0=a[a2];
delayms(2);
P0=0xff;
P2=b[2];
P0=a[a3];
delayms(2);
P0=0xff;
P2=b[3];
P0=a[a4];
delayms(2);
P0=0xff;
}
else
{
if(a3>0)
{
P2=b[2];
P0=a[a3];
delayms(2);
P0=0xff;
P2=b[3];
P0=a[a4];
delayms(2);
P0=0xff;
}
else
{
P2=b[3];
P0=a[a4];
delayms(2);
P0=0xff;
}
}
}
}
1.将所有的数字(0-9、0.-9.)的段码使用一个数组保存起来;
2.将要显示的数值乘以10倍;
3.对放大倍数后的值每一位求余数;
4.显示每一位,注意这个时候的小数点是固定在倒数第二位的,这个时候倒数第二位的段码需要往后移动合适的值;
例如:
//保存8位数码管每一位需要显示的值
unsigned char segbuff[] ={10,10,10,10,10,10,10,10};
//保存数码管需要用到的所有段码的值
unsigned char segtab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,
0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f,0xbf,0xff};
void segs();
int main(void)
{
unsigned int i=0;
//显示数值
for(i=0;i<65535;i++)
{
i *= 10;
segbuff[0] = i/10000;//显示千分位 //或者此处使用11就可熄灭数码管的值
segbuff[1] = i%10000/1000;//显示百分位 //或者此处使用11就可熄灭数码管的值
segbuff[2] = i%10000%1000/100;//显示十分位 //或者此处使用11就可熄灭数码管的值
segbuff[3] = i%10000%1000%100+12;//显示个位
segbuff[4] = 10;//显示小数位
segs();
//合适的延时
}
}
void segs(){
static unsigned char segaddr = 0;
//消影
P2 = P2&0x1f|0xe0;P0 = 0xff;P2 = P2&0x1f;
//位选
P2 = P2&0x1f|0xc0;P0 = 1<<segaddr;P2 = P2&0x1f;
//段选
P2 = P2&0x1f|0xe0;P0 = segtab[segbuff[segaddr]];P2 = P2&0x1f;
if(++segaddr == 8) segaddr = 0;
}
你计数的实际上是0.1的倍数,所以如果计数是10的整数倍,就不显示小数点,且去掉最后的0就是了
不过你这个程序其实问题很多
1,unsigned int i=0;
//显示数值
for(i=0;i<65535;i++)
{
i *= 10;
i的类型是unsigned int,最大就是65535,乘以10的话,后面的数就肯定超范围了,而且我真没看懂为啥要乘以10
2,扫描显示函数也有问题。数据变一次就刷新一个位,这样的话,变化的位可能根本不能被立刻刷新。