⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 采用51单片机开发板实现计算器
💻 C
字号:
/*
 * Easy calculator
 *
 * K4:+ K8:- K12:* K16:/ K14:Clear K15:=
 *
 * Made by Kingst-刚哥    
 * http://www.kingst.org
 * date: 2010.12.21
*/

#include <reg52.h>

typedef   unsigned char  uint8;
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 ENLED = P1^4;
sbit BUZZ  = P1^6;

#define FADD	10
#define FSUB	11
#define FMUL	12
#define FDIV	13
#define FRES	14
#define FEQU	15

#define KEY_DELAY 300
#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)
{
	while (n--);
}

/*
 * 蜂鸣器发声
*/
void buzzer_sound(void)
{
	uint16 i;

	for (i=0; i<BUZ_DELAY; i++)
	{
		BUZZ = ~BUZZ;
		delay(100);
	}

	BUZZ = 1;
}

/* 
 * 按键扫描
*/
int8 scan_key(void)
{
	int8 val=-1;

	KeyOut1 = 0;
	KeyOut2 = 1;
	KeyOut3 = 1;
	KeyOut4 = 1;
	if (KeyIn1 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn1 == 0)
			val = 1;
	}
	if (KeyIn2 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn2 == 0)
			val = 2;
	}
	if (KeyIn3 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn3 == 0)
			val = 3;
	}
	if (KeyIn4 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn4 == 0)
			val = FADD;
	}
	while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));

	KeyOut1 = 1;
	KeyOut2 = 0;
	KeyOut3 = 1;
	KeyOut4 = 1;
	if (KeyIn1 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn1 == 0)
			val = 4;
	}
	if (KeyIn2 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn2 == 0)
			val = 5;
	}
	if (KeyIn3 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn3 == 0)
			val = 6;
	}
	if (KeyIn4 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn4 == 0)
			val = FSUB;
	}
	while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));

	KeyOut1 = 1;
	KeyOut2 = 1;
	KeyOut3 = 0;
	KeyOut4 = 1;
	if (KeyIn1 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn1 == 0)
			val = 7;
	}
	if (KeyIn2 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn2 == 0)
			val = 8;
	}
	if (KeyIn3 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn3 == 0)
			val = 9;
	}
	if (KeyIn4 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn4 == 0)
			val = FMUL;
	}
	while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));

	KeyOut1 = 1;
	KeyOut2 = 1;
	KeyOut3 = 1;
	KeyOut4 = 0;
	if (KeyIn1 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn1 == 0)
			val = 0;
	}
	if (KeyIn2 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn2 == 0)
			val = FRES;
	}
	if (KeyIn3 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn3 == 0)
			val = FEQU;
	}
	if (KeyIn4 == 0)
	{
		delay(KEY_DELAY);
		if (KeyIn4 == 0)
			val = FDIV;
	}
	while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));

	if (val > 0)
		buzzer_sound();

	return val;
}

/*
 * 验证数据有效性
*/
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_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/sit*sit;
	}
	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_num*10000+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/sit*sit;
	}
	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)
{
	ENLED = 1;
	switch (Led_n)
	{
		case 0: 
			ADDR0 = 0;
			ADDR1 = 0;
			ADDR2 = 0;
			P0 = buf[0];
			break;
		case 1: 
			ADDR0 = 1;
			ADDR1 = 0;
			ADDR2 = 0;
			P0 = buf[1];
			break;
		case 2: 
			ADDR0 = 0;
			ADDR1 = 1;
			ADDR2 = 0;
			P0 = buf[2];
			break;
		case 3: 
			ADDR0 = 1;
			ADDR1 = 1;
			ADDR2 = 0;
			P0 = buf[3];
			break;
		case 4: 
			ADDR0 = 0;
			ADDR1 = 0;
			ADDR2 = 1;
			P0 = buf[4];
			break;
		case 5: 
			ADDR0 = 1;
			ADDR1 = 0;
			ADDR2 = 1;
			P0 = buf[5];
			break;
	}
	ENLED = 0;

	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 <= FDIV))
	{
		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 = Tmp1*Tmp2; 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_inumber(Tmp1);
		}
		else
		{
			ans = Tmp2;
			ans *= 10;
			ans += key_val;
			if (check_num(ans))
				return;
			else
				Tmp2 = ans;
			make_led_inumber(Tmp2);
		}

	}

}



main()
{
	int8 key_val;

	ADDR3 = 1;
	ENLED = 0;

	make_led_inumber(0);

    TMOD = 0x01;
    TH0 = 0xF8;	      
    TL0 = 0xCC;
    TR0 = 1; 
	ET0 = 1;
	EA = 1;

	while (1)
	{
		key_val = scan_key();
		if (key_val == -1)
			continue;
		calculate(key_val);

	}
}


void time0() interrupt 1
{
	TR0 = 0;
	TH0 = 0xF8;
	TL0 = 0xCC;

	show_num(Led_buf);

	TR0 = 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -