求一个基于51单片机的用数码管显示的带小数点的计算器的C程序。

程序可以给你一个参考!?实现了计算结果的小数显示。

/****************************************************************/

//扫描显示一个6位数码管,显示信息是缓冲区中的6个“0”。

//2017.8.7添加浮点显示支持。

/****************************************************************/

# include & ltreg52.h & gt//头文件定义

# include & ltstdio.h & gt

# include & ltintrins.h & gt

# define uchar无符号char//宏定义

#定义uint无符号整数

#定义键P1

uchar代码Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//

0x77,0x7c,0x39,0x5e,0x79,0x71,0x 00 };?//00显示为空。

uchar disp_buffer[6]={2,0,1,7,0,5},buf[10];//显示缓冲区

uchar标志= 0;

long dat1,dat2

浮动温度;

bit keypress = 1,getv = 0;

void p _ data(long dat);

void显示();

/****************************************************************/

//输入参数为m的延迟子程序

/****************************************************************/

无效延迟(无符号整数m)

{

无符号int i,j;

for(I = 0;我& ltm;i++)

{

for(j = 0;j & lt123;j++)

{;}

}

}

/****************************************************************/

//按键扫描仪4X4

/****************************************************************/

uchar键()

{

uchar keytemp,key _ h;

KEY = 0xf0

如果((键& amp0xf0)!= 0xf0)

{

keytemp = KEY & amp0xf0

KEY = 0x0f//翻转

key _ h = KEY & amp0x0f

key temp = key temp | key _ h;

开关(按键温度)

{

case 0x ee:return(0);打破;

案例0xed:返回(1);打破;

case 0x EB:return(2);打破;

案例0xe7:返回(3);打破;

案例0x de:return(4);打破;

案例0xdd:返回(5);打破;

案例0xdb:返回(6);打破;

案例0xd7:返回(7);打破;

案例0x be:return(8);打破;

案例0xbd:返回(9);打破;

案例0xbb:返回(10);打破;

案例0xb7:返回(11);打破;

案例0x7e:返回(12);打破;

案例0x7d:返回(13);打破;

案例0x7b:返回(14);打破;

案例0x77:返回(15);打破;

}

}

返回0xff

}

void键扫描()

{

uchar getk

getk = key();

如果(getk!= 0xff)

{

延时(10);

getk = key();

如果(getk!= 0xff)

{

如果(按键)

{

按键= 0;

开关(getk)

{

案例0: //根据键决定做什么样的操作,设置getv。

getv = 1;

flag = 1;

打破;

案例0x0b:

getv = 1;

flag = 2;

打破;

案例0x0c:

getv = 1;

flag = 3;

打破;

案例0x0d://

flag = 4;

getv = 1;

打破;

案例0x0e:

getv = 0;

开关(标志)?//按等号键执行运算,并将结果输出到temp?用于展示

{?

案例1:

temp = dat 1+dat 2;

打破;

案例二:

temp = dat 1-dat 2;

打破;

案例三:

temp = dat 1 * dat 2;

打破;

案例4:

temp =(float)dat 1/(float)dat 2;

打破;

}

dat 1 = 0;

dat 2 = 0;

flag = 0;

打破;

案例0x0f:

如果(!getv)

{

dat 1 = dat 1/10;;

temp = dat 1;

}

其他

{

dat 2 = dat 2/10;

temp = dat2

}

打破;

默认值:

如果(!Getv)//根据getv的值判断是第一个数据还是第二个数据!

{

dat 1 = dat 1 * 10+getk;//将键值组合成数据。

temp = dat 1;

}

其他

{

dat 2 = dat 2 * 10+getk;

temp = dat2

}

打破;

}

}

}

}

其他

keypress = 1;

}

/****************************************************************/

//对disp_buffer填充的浮点数据进行处理,转换成整数,并标记小数点位置。

/****************************************************************/

uchar float_int_dot(float numf)

{

uchar ct,ctn,dotps

for(CT = 7;ct!= 0 ;CT-)//初始化打印缓冲和显示缓冲。

{

buf[CT-1]= 0;

if(CT-1 & gt;0)

disp _ buffer[CT-2]= 16;

}

sprintf(buf," %f ",numf);

for(ct = 7,ctn = 5;ct!= 0 ;ct -)

{

If(buf[ct-1] == ' . ')//如果是小数点,记录位置,传递给返回值。

{

dot PS = 6-ctn;

disp _ buffer[ctn]= 0;

}

else if(buf[ct - 1]!= '0')//如果不等于0,ascii码将被转换成数值并填充到显示缓冲区中。

{

disp _ buffer[ctn]= buf[CT-1]-0x 30;

ctn-;

}

}

返回dotps

}

/****************************************************************/

//填充disp_buffer,处理数据。

/****************************************************************/

void p_data(长数据)

{

uchar pi

for(pi = 0;pi & lt6 ;pi++)

{?

如果(dat!= 0 )

{

disp _ buffer[5-pi]= dat % 10;

}?

其他

disp _ buffer[5-pi]= 16;

dat = dat/10;

}

}

/****************************************************************/

//显示子程序

/****************************************************************/

虚空显示(uchar?Flash,uchar count,uchar dot)//dot表示真正小数点的位置。

{

uchar i,temp

temp = 0x 01;

for(I = 0;我& lt6;i++)

{

P2 =温度;//位置选择

/*方法1

if( i == flash - 1)

{

如果(ct & lt50)

P0 = Tab[disp _ buffer[I]];//发送显示段代码

其他

P0 = 0;//发送显示段代码

}

其他

P0 = Tab[disp _ buffer[I]];//发送显示段代码

*/

/*方法2 * * * * * * * * * *

如果(!(flash & amp0x01))

{

if(count & lt;50)

P0 = Tab[disp _ buffer[I]];//发送显示段代码

其他

P0 = 0;//发送显示段代码

}

其他

P0 = Tab[disp _ buffer[I]];//发送显示段代码

flash = flash & gt& gt1;

/*************************/

if(dot - 1 == 5 - i)

P0 = P0 | 0x80?

延迟(2);

P0 = 0x00//消隐

temp = _crol_(temp,1);

}

}

/****************************************************************/

//主函数

/****************************************************************/

void main()

{

uchar点;

while(1)

{

key scan();

dot = float _ int _ dot(temp);

显示(0xff,100,点);//11 001101

} ?

}

Proteus仿真图