程序的話可以給妳壹個作為參考!? 實現了計算結果的小數顯示。
/****************************************************************/
//掃描顯示6位數碼管,顯示信息為緩沖區的六個“0”
//2017.8.7 添加浮點數顯示支持
/****************************************************************/
#include<reg52.h> //頭文件定義
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char // 宏定義
#define uint unsigned int
#define KEY P1
uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};? //00 顯示空
uchar disp_buffer[6]={2,0,1,7,0,5} ,buf[10]; //顯示緩沖區
uchar flag = 0;
long dat1,dat2;
float temp;
bit keypress = 1,getv = 0;
void p_data(long dat);
void display();
/****************************************************************/
//延時子程序,帶有輸入參數 m
/****************************************************************/
void delay(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<123;j++)
{;}
}
}
/****************************************************************/
//按鍵掃描程序 4X4
/****************************************************************/
uchar key()
{
uchar keytemp , key_h;
KEY = 0xf0;
if((KEY &0xf0)!= 0xf0)
{
keytemp = KEY&0xf0;
KEY = 0x0f; //翻轉
key_h = KEY&0x0f;
keytemp = keytemp | key_h;
switch(keytemp)
{
case 0xee: return(0);break;
case 0xed: return(1);break;
case 0xeb: return(2);break;
case 0xe7: return(3);break;
case 0xde: return(4);break;
case 0xdd: return(5);break;
case 0xdb: return(6);break;
case 0xd7: return(7);break;
case 0xbe: return(8);break;
case 0xbd: return(9);break;
case 0xbb: return(10);break;
case 0xb7: return(11);break;
case 0x7e: return(12);break;
case 0x7d: return(13);break;
case 0x7b: return(14);break;
case 0x77: return(15);break;
}
}
return 0xff;
}
void keyscan()
{
uchar getk;
getk = key();
if(getk != 0xff)
{
delay(10);
getk = key();
if(getk != 0xff)
{
if(keypress)
{
keypress = 0;
switch(getk)
{
case 0: //根據按鍵決定是做哪種運算,並置位getv
getv = 1;
flag = 1;
break;
case 0x0b:
getv = 1;
flag = 2;
break;
case 0x0c:
getv = 1;
flag = 3;
break;
case 0x0d://
flag = 4;
getv = 1;
break;
case 0x0e:
getv = 0;
switch(flag) ?//按等號鍵 進行運算,並將結果輸出給temp? 用於顯示
{?
case 1:
temp = dat1 + dat2;
break;
case 2:
temp = dat1 - dat2;
break;
case 3:
temp = dat1 * dat2;
break;
case 4:
temp = (float)dat1 / (float)dat2;
break;
}
dat1 = 0;
dat2 = 0;
flag = 0;
break;
case 0x0f:
if(!getv)
{
dat1 = dat1/10;;
temp = dat1;
}
else
{
dat2 = dat2/10;
temp = dat2;
}
break;
default:
if(!getv) //根據getv的值判斷是第壹個數據還是第二個數據!
{
dat1 = dat1*10 + getk; //將按鍵值組合成為數據
temp = dat1;
}
else
{
dat2 = dat2*10 + getk;
temp = dat2;
}
break;
}
}
}
}
else
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 > 0)
disp_buffer[ct - 2] = 16;
}
sprintf(buf,"%f",numf);
for(ct = 7 ,ctn = 5; ct != 0 ; ct--)
{
if(buf[ct-1] == '.') //如果是小數點則記錄位置,並傳遞給返回值
{
dotps = 6 - ctn;
disp_buffer[ctn] = 0;
}
else if(buf[ct - 1] != '0')//不等於0 則將ascii轉換為數值填充入顯示緩沖區,
{
disp_buffer[ctn] = buf[ct - 1] - 0x30;
ctn--;
}
}
return dotps;
}
/****************************************************************/
//填充disp_buffer ,數據處理
/****************************************************************/
void p_data(long dat)
{
uchar pi;
for(pi = 0 ; pi < 6 ; pi++)
{?
if(dat != 0 )
{
disp_buffer[5 - pi] = dat%10;
}?
else
disp_buffer[5 - pi] = 16;
dat = dat/10;
}
}
/****************************************************************/
//顯示子程序
/****************************************************************/
void display(uchar? flash , uchar count, uchar dot) //dot 代表現實小數點的位置
{
uchar i,temp;
temp = 0x01;
for(i=0;i<6;i++)
{
P2 = temp; //位選
/*方法壹
if( i == flash - 1)
{
if(ct <50)
P0 = Tab[disp_buffer[i]]; //送顯示段碼
else
P0 = 0; //送顯示段碼
}
else
P0 = Tab[disp_buffer[i]]; //送顯示段碼
*/
/*方法二***************/
if(!(flash&0x01))
{
if(count <50)
P0 = Tab[disp_buffer[i]]; //送顯示段碼
else
P0 = 0; //送顯示段碼
}
else
P0 = Tab[disp_buffer[i]]; //送顯示段碼
flash = flash >> 1;
/*************************/
if(dot - 1 == 5 - i)
P0 = P0|0x80; ?
delay(2);
P0 = 0x00; //消隱
temp = _crol_(temp,1);
}
}
/****************************************************************/
//主函數
/****************************************************************/
void main()
{
uchar dot;
while(1)
{
keyscan();
dot = float_int_dot(temp);
display(0xff,100,dot); //11 001101
} ?
}
Proteus 仿真圖