基于51
单片机的简易计算器。
电路图
源程序
#include//52单片机头文件
#include//要用到数学计算公式,所以调用
#include //移位
#define key P2 //定义矩阵键盘的I/O口
#define GPIO_LCD P0//定义LCD1602 数据/命令的输入端
unsigned char number[20];//用来储存我们所按键按下去的字符和数字
unsigned char add=0;//是否按过+号
unsigned char subtract=0;//是否按过-号
unsigned char ride=0;//是否按过*号
unsigned char divide=0;//是否按过/号
unsigned char eliminate=0;//是否按过清除键
unsigned char minus=0;//是否计算的数据需要添加负号
unsigned char decimals=0;//是否计算的数据需要小数点
unsigned char equal=0;//是否按下等号键
***it LCD_RS =P3^4;//定义LCD的模式选择,1为写数据,0为写命令
***it LCD_RW =P3^5;//定义LCD功能 1是读,0是写
***it LCD_E =P3^6;//定义LCD使能端
unsigned long a=0,b=0;//用于储存我们所要运算的数据
unsigned char i;//定义一个全局变量
unsigned char LCD_Wait(void)//判忙函数
{
LCD_RS=0;
LCD_RW=1;
_nop_();
LCD_E=1;
_nop_();
LCD_E=0;
return GPIO_LCD;
}
void delay(void) //延时函数
{
unsigned char x,z;
for(z=19;z>0;z--)
for(x=130;x>0;x--);
}
void LCD_Write_Com(unsigned char com)//LCD1602写命令函数
{
LCD_RS =0;
LCD_RW =0;
GPIO_LCD=com;
delay() ;
LCD_E=1;
delay() ;
LCD_E=0;
delay() ;
}
void LCD_Write_Date( unsigned char input)//LCD1602写数据函数
{
LCD_RS=1;
LCD_RW=0; ;
LCD_E=0;
_nop_();
GPIO_LCD =input;
_nop_();
LCD_E=1;
_nop_();
LCD_E=0;
_nop_();
LCD_Wait();
}
void LCD_Ini
tial()//LCD1602
初始化函数{
delay();
LCD_Write_Com (0x38);
delay() ;
LCD_Write_Com (0x38);
delay() ;
LCD_Write_Com (0x08);
delay() ;
LCD_Write_Com (0x0c);
delay() ;
LCD_Write_Com (0x06);
delay() ;
LCD_Write_Com (0x01);
delay() ;
}
以上函数是LCD1602的模块化函数库,如果看不懂,需要先学习一下LCD1602.如果懒得学的话,可以直接用这个函数库,前提是上面定义的变量要整体一一对应,各个端口的引脚也要和你的实际端口一一对应
unsigned long calculate()//计算数据模块
{
unsigned long value=0;
if(add)//如果我们按键按下了加号,那么在计算时进入这个加运算
{
value=a+b;
}
if(subtract) //如果我们按键按下了减号,那么在计算时进入这个减运算
{
if(a>=b)
value=a-b;
else
{
value=b-a;
minus=1;//说明后面的数大于前面的额数,将其标志为一,在输出结果是,可以利用它判断是否输出负号
}
}
if(ride)//乘法运算
{
value=a*b;
}
if(divide)//除法运算
{
value=(unsigned long)(((float)a/b)*1000);//因为此计算器是,保留小数点后三位,所以,两数相除,1/2=0.5,那么通过这个,可以让其先等于200,方便我们后续的结果处理
decimals=1;//标示结果已经<0,最后结果要出现小数点,
}
return value;//返回计算的结果
}
4