求一个基于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仿真图