#include <reg52.h> #include<math.h> unsigned char code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数码管对应的码制 对应于P1口 unsigned char code tab[]={0x7F,0xbF,0xdF,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管片选 对应于P0口 unsigned int a[8]; //存放各个位的数组 unsigned int temp[8]; void delay(unsigned int i) //延时程序 { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } void ftm(float num) //主要函数实现 { float m,n; int integer,start,f; int i=0; int floatnum=0; int integernum=0; integer=(int)num; m=num-integer; while(m!=0) //求出小数部分的数字放到temp数组里,同时求出小数的位数 { n=m*10; temp=(int)n; m=m*10-temp; floatnum=floatnum+1; i++; } f=floatnum-1; for(i=7;i>=0;i--) //从数组a的最后一位开始存放小数部分, { a=temp[f]; if(f==0) break; else f=f-1; } for(i=7-floatnum;i>=0;i--) //数组a接着存放整数部分,并求出整数部分的位数 { a=integer-(integer/10)*10; integer=integer/10; if(integer==0) { integernum=7-floatnum-i+1; break; } } start=8-integernum-floatnum; while(1) //显示 { for(i=start;i<8;i++) { P1=table[a] ; P0=tab; delay(100); if(i==start+integernum-1) { P1=0x80; delay(100); } } } } void main () { ftm(125.42); }
请详细描述下你的问题
其实不用这么复杂的,以下是小弟写的显示3.2的程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wx=P2^7;
sbit dx=P2^6;
uchar shu,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x80};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init();
void display(uchar dot,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
//dot=17;
shi=shu/10;
ge=shu%10;
display(16,shi,ge);
}
}
void display(uchar dot,uchar shi,uchar ge)
{
wx=1;
P0=0xfe;
wx=0;
P0=0xff;
dx=1;
P0=table[dot];
dx=0;
delay(5);
wx=1;
P0=0xfe;
wx=0;
P0=0xff;
dx=1;
P0=table[shi];
dx=0;
delay(5);
wx=1;
P0=0xfd;
wx=0;
P0=0xff;
dx=1;
P0=table[ge];
dx=0;
delay(5);
}
void init()
{
shu=32;
}
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |