51单片机计算器程序
//**************************计算器程序************************************
//0-9数字
//12加
//13减
//14乘
//15除
//P0 1602
//P1矩阵键盘
//第一行显示算式
//第二行显示结果
//2015.2.6
#include
#include #define GPIO_KEY P1 unsigned char KeyValue;
int sin; //保存运算符号
int x=0; //保存运算立即数
int num1=0;//保存第一个运算数
int num2=0;//保存第二个运算数
int xianshi=-1;//显示地址
int result;//结果
int re;
int show;
sbit E=P2^7;
sbit RW=P2^5;
sbit RS=P2^6; //1602 //***********延时函数
10ms**************************************************************************
****
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//*****************************************************1602********************
**************************************************************
void wrcmd(int cmd) {
int m;
RW=0;
RS=0;
P0=cmd;
for(m=0;m<=2;m++); E=1;
for(m=0;m<=2;m++); E=0;
}
void wrdate(int shuju) {
int m;
RW=0;
RS=1;
P0=shuju;
for(m=0;m<=2;m++); E=1;
for(m=0;m<=2;m++); E=0;
}
void init()
{
RW=0;
E=0;
wrcmd(0x38);
wrcmd(0x0c);
wrcmd(0x06);
wrcmd(0x01);
}
void disp(int x,int y,int ch)
{
int m;
wrcmd(0x80+x*0x40+y);
for(m=0;m<=252;m++);
wrdate(ch);
}
//*********************************矩阵键盘*******************************************************************************
*********************
void key(void)
{
char a = 0;
A: GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay10ms();//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+3;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0): KeyValue=KeyValue;break;
}
while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay10ms();
a++;
}
} else{ goto A; }
} else {goto A; }
}
//*****************************拆字程序
*******************************************************************************
**************************
void takeapart()
{int i; int a;
for(i=0;i<16;i++)
{
a=result%10;
result=result/10;
disp(1,15-i,'0'+a);
if(result==0) {break;}
}
}
//****************************输入函数
*******************************************************************************
***********************
void main() //输入函数
{ init();
for(;;)
{
B: key();
if(KeyValue<=9) //如果输入的是数字
{
x=10*x+KeyValue;//前一个数×10+键值
xianshi=xianshi+1; //显示地址,1
disp(0,xianshi,'0'+KeyValue);
}
else
{
//保存x
xianshi=xianshi+1;//显示地址,1
if(KeyValue==12){ disp(0,xianshi,'+');num1=x; x=0; sin=KeyValue; goto B; }//保存运输符
号
else if(KeyValue==13){ disp(0,xianshi,'-');num1=x; x=0; sin=KeyValue; goto B; }//保存运输符号
else if(KeyValue==14){ disp(0,xianshi,'*');num1=x; x=0; sin=KeyValue; goto B; }//保存运输符号
else if(KeyValue==15){ disp(0,xianshi,'/');num1=x; x=0; sin=KeyValue; goto B; }//保存运输符号
else //如果是等号
{ num2=x;
if(sin==12) { result=num1+num2; takeapart(); }//拆字程序
else if(sin==13) { result=num1-num2; takeapart(); }//拆字程序
else if(sin==14) { result=num1*num2; takeapart(); }//拆字程序
else if(sin==15) { result=num1/num2; takeapart(); }//拆字程序
else {disp(1,1,'!'); }
}
}
}
}