基于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/sitsit;
}
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/sitsit;
}
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;
}
最新评论