當前位置:編程學習大全網 - 編程語言 - 求壹個基於51單片機的利用數碼管顯示的有小數點的計算器的c程序

求壹個基於51單片機的利用數碼管顯示的有小數點的計算器的c程序

程序的話可以給妳壹個作為參考!? 實現了計算結果的小數顯示。

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

//掃描顯示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 仿真圖

  • 上一篇:安美達大米色選機有那幾款,性能怎麽樣?
  • 下一篇:急求VB程序 設計壹個簡單的四則表達式計算程序 急急急急急!!!!!!!!
  • copyright 2024編程學習大全網