基于51单片机的计算器设计

/

 
Easy calculator

 

/


include <reg52.h>



typedef   unsigned char  uint8;

typedef   unsigned char  u8;

typedef   unsigned int   uint16;

typedef   unsigned long  uint32;

typedef   char  int8;

typedef   int   int16;

typedef   long  int32;



sbit KeyIn1 = P2^4;

sbit KeyIn2 = P2^5;

sbit KeyIn3 = P2^6;

sbit KeyIn4 = P2^7;

sbit KeyOut1 = P2^3;

sbit KeyOut2 = P2^2;

sbit KeyOut3 = P2^1;

sbit KeyOut4 = P2^0;

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ADDR4  = P1^4;

sbit ADDR5  = P1^5;

sbit LEDS0=P3^0;

sbit LEDS1=P3^1;

sbit LEDS2=P3^2;

sbit LEDS3=P3^3;

sbit LEDS4=P3^4;

sbit LEDS5=P3^5;




define FADD 10   // +

define FSUB 11   // -

define FMUL 12   // *

define FDIV 13   // /

define FRES 14  //  清零

define FEQU 15  //  =


define KEY_DELAY 1

define BUZ_DELAY 80



code uint8 Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};



uint8 Led_n=0;

uint8 Led_buf[6];

float Tmp1=0, Tmp2=0;

int8 C_flag=0;



/

 
延时

/

void delay(uint16 n)

{

   uint8 i,j;

while (n--)for(j=200;j>0;j--);

}







/
 

  按键扫描

/

u8 key_scan()

  {

  u8 tmp=-1;

 

    KeyIn1 =0;

KeyIn2 =1;

KeyIn3 =1;

KeyIn4 =1;

if(KeyOut1==0) {tmp=1;}

if(KeyOut2==0) {tmp=4;}// P0=Ledcode[1];

if(KeyOut3==0)  {tmp=7;}//P0=Ledcode[2];

if(KeyOut4==0)  {tmp=0;}//P0=Ledcode[3];



KeyIn1 =1;

    KeyIn2 =0;

KeyIn3 =1;

KeyIn4 =1;

if(KeyOut1==0) {tmp=2;}

if(KeyOut2==0) {tmp=5;}

if(KeyOut3==0)  {tmp=8;}

if(KeyOut4==0) {tmp=14;} 



KeyIn1 =1;

    KeyIn2 =1;

KeyIn3 =0;

KeyIn4 =1;

if(KeyOut1==0) {tmp=3;}

if(KeyOut2==0) {tmp=6;} 

if(KeyOut3==0) {tmp=9;} 

if(KeyOut4==0) {tmp=15;}  



KeyIn1 =1;

    KeyIn2 =1;

KeyIn3 =1;

KeyIn4 =0;

if(KeyOut1==0) {tmp=10;} 

if(KeyOut2==0)  {tmp=11;}

if(KeyOut3==0)  {tmp=12;}

if(KeyOut4==0)  {tmp=13;}  

 return tmp;









}







/

 
验证数据有效性

/

bit check_num(float f_num)

{

if (f_num >= 100000)

return 1;



return 0;

}



/


  制作数码管错误标志

/

void make_led_error(void)

{

int8 i;



for (i=0; i<5; i++)

Led_buf[i] = Ledcode[10];

Led_buf[5] = Ledcode[12];

}



/

 
制作数码管整数数据

/

void make_led_inumber1(int i_num) //i_num/1000为千位

{

  if(i_num<=9)

{

P1=0x01;

P0 = Ledcode[i_num];

}

else if((i_num>=10))

{

P1=0x01;

P0 = Ledcode[i_num%10]; //没有缓存功能 实现不了



P1=0x02;

P0 = Ledcode[i_num/10];

}

else   if((i_num>=100))

{

P1=0x01;

P0 = Ledcode[i_num%100%10];



P1=0x02;

P0 = Ledcode[i_num%100/10];



P1=0x04;

P0 = Ledcode[i_num/100];







}

else if((i_num>=1000))

{

P1=0x01;

P0 = Ledcode[i_num%1000%10%10];



P1=0x02;

P0 = Ledcode[i_num%1000%100/10];



P1=0x04;

P0 = Ledcode[i_num%1000/100];

    P1=0x08;

P0 = Ledcode[i_num/1000];





}

 



 



}

void make_led_inumber(int32 i_num)

{

bit s_flag=0;

int16 sit;

int8 i;



if (i_num < 0)

{

s_flag = 1;

i_num = -i_num;

}



ET0 = 0;

for (i=4, sit=10000; i>=1; i--, sit/=10)

{

if (i_num >= sit)

break;

Led_buf[i] = Ledcode[10];

i_num -= i_num/sit
sit;

}

for (;i>=1; i--, sit/=10)

{

Led_buf[i] = Ledcode[i_num/sit];

i_num -= i_num/sitsit;

}

Led_buf[0] = Ledcode[i_num] & 0x7F;

if (s_flag)

Led_buf[5] = Ledcode[11];

else

Led_buf[5] = Ledcode[10];

ET0 = 1;



}



/


  制作数码管浮点数据

/

void make_led_fnumber(float f_num)

{

bit s_flag=0;

int32 num;

int16 sit;

int8 i, decimal, dot_sit=0;





if (f_num < 0)

{

s_flag = 1;

f_num = -f_num;

}



num = (int32)(f_num10000+0.5);

for (decimal=4; decimal>0; decimal--)

{

if (num % 10 != 0)

break;

num /= 10;

}



dot_sit = decimal;

if (f_num >= 10000)

dot_sit = 0;

else if (f_num >= 1000)

if (decimal >= 1)

dot_sit = 1;

else if (f_num >= 100)

if (decimal >= 2)

dot_sit = 2;

else if (f_num >= 10)

if (decimal >= 3)

dot_sit = 3;



for (i=0; i<dot_sit; i++)

f_num
= 10;

num = (int32)(f_num+0.5);



ET0 = 0;

for (i=4, sit=10000; i>=1; i--, sit/=10)

{

if (num >= sit)

break;

if (i == dot_sit)

break;

Led_buf[i] = Ledcode[10];

num -= num/sitsit;

}

for (;i>=1; i--, sit/=10)

{

Led_buf[i] = Ledcode[num/sit];

num -= num/sit
sit;

}

Led_buf[0] = Ledcode[num];

Led_buf[dot_sit] &= 0x7F;

if (s_flag)

Led_buf[5] = Ledcode[11];

else

Led_buf[5] = Ledcode[10];

ET0 = 1;



}



/

 
数码管显示

/

void show_num(uint8
buf)

{

Led_n=0;

switch (Led_n)

{

case 0: 

ADDR0 =1;

ADDR1 = 0;

ADDR2 = 0;

ADDR3 = 0;

ADDR4 = 0;

ADDR5 = 0;



P0 = buf[0];

break;

case 1: 

ADDR0 = 1;

ADDR1 = 0;

ADDR2 = 0;

ADDR3 = 0;

ADDR4 = 0;

ADDR5 = 0;

P0 = buf[1];

break;

case 2: 

ADDR0 = 0;

ADDR1 = 1;

ADDR2 = 0;

ADDR3 = 0;

ADDR4 = 0;

ADDR5 = 0;



P0 = buf[2];

break;

case 3: 

ADDR0 = 0;

ADDR1 = 0;

ADDR2 = 1;

ADDR3 = 0;

ADDR4 = 0;

ADDR5 = 0;



P0 = buf[3];

break;

case 4: 

ADDR0 = 0;

ADDR1 = 0;

ADDR2 = 0;

ADDR3 = 1;

ADDR4 = 0;

ADDR5 = 0;

P0 = buf[4];

break;

case 5: 

ADDR0 = 0;

ADDR1 = 0;

ADDR2 = 0;

ADDR3 = 0;

ADDR4 = 1;

ADDR5 = 0;



P0 = buf[5];

break;

}





if (Led_n >= 5)

Led_n = 0;

else

Led_n++;

}



/

 
计算程序

/

void calculate(int8 key_val)

{

float ans;

bit err=0;



if ((key_val >= FADD) && (key_val <= FSUB))   //如果是 +—
/的一个动作

{

C_flag = key_val; //赋值

}

else if (key_val == FEQU)

{

switch (C_flag)

{

case FADD: ans = Tmp1+Tmp2; break; //加的动作 两个数相加

case FSUB: ans = Tmp1-Tmp2; break;

case FMUL: ans = Tmp1Tmp2; break;

case FDIV: if (Tmp2 == 0)

{

err = 1;

break;

}

else

{

ans = Tmp1/Tmp2; 

break;

}

}

if (check_num(ans))

err = 1;

if (err)

make_led_error();

else

make_led_fnumber(ans);

C_flag = 0;

Tmp1 = 0;

Tmp2 = 0;

}

else if (key_val == FRES)

{

make_led_fnumber(0);

C_flag = 0;

Tmp1 = 0;

Tmp2 = 0;

}

else

{

if (C_flag == 0)

{

ans = Tmp1;

ans
= 10;

ans += key_val;

if (check_num(ans))

return;

else{

Tmp1 = ans;

make_led_inumber1(Tmp1);  }

}

else

{

ans = Tmp2;

ans *= 10;

ans += key_val;

if (check_num(ans))

return;

else

{ Tmp2 = ans;

make_led_inumber1(Tmp2); }

}



}



}







main()

{

int8 key_val;

   P1=0x01;

   P0=Ledcode[0];

while (1)

{



//key_scan();

//if(1==key_scan()){P0=Ledcode[1];ADDR0=1;}

 int8 key_val;

// make_led_inumber(0);



  //  TMOD = 0x01;

  //  TH0 = 0xF8;      

  //  TL0 = 0xCC;

   // TR0 = 1; 

// ET0 = 1;

// EA = 1;



while (1)

{

key_val = key_scan();

if (key_val == -1)

continue;

calculate(key_val);



}

}

}





void time0() interrupt 1

{

TR0 = 0;

TH0 = 0xF8;

TL0 = 0xCC;



// show_num(Led_buf);

TR0 = 1;

}


最新评论

  1. 德为
    发布于:2015-02-04 22:53 回复

sitemap