单片机实现计算器功能

2019-04-15 18:42发布

#include
sbit E=P2^2;
sbit RS=P2^0;
sbit RW=P2^1;
#define GPIO_KEY P1
unsigned char KeyValue=17;  //键盘按键值
void KeyDown(void);   //键盘扫描
void delay1ms(unsigned int x);
void init();      //lcd1602初始化
void writecom(unsigned char j);   //写命令
void writedata(unsigned char j);   //写数据
void fbusy(); //忙检测
unsigned char LEDBuffer[5];


unsigned char i=0;           //x作为第一个数据   注意char型的数据位数只有8位,最高计数到256
unsigned char flag=0;
unsigned int result=0,temp=0,x;
unsigned int numbuffer[10];   //用于缓存数据
unsigned int j=0;
unsigned char pflag=0,mflag=0,hflag=0,lflag=0;     //用于定义乘除法的优先级
void main()
{
IT0=1;   //定义外部中断用于清屏
EX0=1;
EA=1;
    SP=0x50;
init();
writecom(0x80);
writedata('1');
writedata('5');
writedata('0');
writedata('0');
writedata('9');
writedata('0');
writedata('5');
writedata('1');
writedata('3');
writedata('0');
writedata(' ');
writedata(' ');
writedata('m');
writedata('c');
writedata('l');
delay1ms(500);
init();   
writecom(0x80);
while(1)
{
//    writecom(0x80);
   KeyDown();
  
switch(KeyValue)
{
  case 0:
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
  case 6:
  case 7:
  case 8:
  case 9:{
      writedata('0'+KeyValue);
  temp=temp*10+KeyValue;      //第一个数字
  KeyValue=17;
  }
  break;
  case 10:{
      writedata('+');
  numbuffer[j]=temp;   //缓存区数据
  temp=0;
  j++;
               if(pflag)
  {
      numbuffer[j-2]=numbuffer[j-1]*numbuffer[j-2];
  numbuffer[j-1]=0;
  j--;
  pflag=0;
}
if(mflag)
  {
      numbuffer[j-2]=numbuffer[j-2]/numbuffer[j-1];
  numbuffer[j-1]=0;
  j--;
  mflag=0;
}
if(hflag)
  {
      numbuffer[j-1]=-1*numbuffer[j-1];
  hflag=0;
}
if(lflag)
  {
      numbuffer[j-2]=numbuffer[j-2]%numbuffer[j-1];
  j--;
  lflag=0;
}
  KeyValue=17;
  flag=1;    //定义一个加法的标志位
  }
  break;
  case 11:{
      writedata('-');
  numbuffer[j]=temp;   //缓存区数据
  j++;
  temp=0;
               if(pflag)
  {
      numbuffer[j-2]=numbuffer[j-2]*numbuffer[j-1];
  j--;
  pflag=0;
}
if(mflag)
  {
      numbuffer[j-2]=numbuffer[j-2]/numbuffer[j-1];
  j--;
  mflag=0;
}
if(hflag)
  {
      numbuffer[j-1]=-1*numbuffer[j-1];
  hflag=0;
}
if(lflag)
  {
      numbuffer[j-2]=numbuffer[j-2]%numbuffer[j-1];
  j--;
  lflag=0;
}
hflag=1;
  KeyValue=17;
  flag=2;
  }
  break;
  case 12:{
      writedata('*');
  numbuffer[j]=temp;   //缓存区数据
  j++;
  if(pflag)
  {
      numbuffer[j-2]=numbuffer[j-1]*numbuffer[j-2];
  numbuffer[j-1]=0;
  j--;
  pflag=0;
}
if(mflag)
  {
      numbuffer[j-2]=numbuffer[j-2]/numbuffer[j-1];
  numbuffer[j-1]=0;
  j--;
  mflag=0;
}
if(hflag)
  {
      numbuffer[j-1]=-1*numbuffer[j-1];
  hflag=0;
}
if(lflag)
  {
      numbuffer[j-2]=numbuffer[j-2]%numbuffer[j-1];
  j--;
  lflag=0;
}
  temp=0;
  pflag=1;     //定义乘除法的高优先级
  KeyValue=17;
  flag=3;
  }
  break;
  case 13:{
      writedata('/');
  numbuffer[j]=temp;   //缓存区数据
  j++;
  if(pflag)
  {
      numbuffer[j-2]=numbuffer[j-1]*numbuffer[j-2];
  numbuffer[j-1]=0;
  j--;
  pflag=0;
}
if(mflag)
  {
      numbuffer[j-2]=numbuffer[j-2]/numbuffer[j-1];
  numbuffer[j-1]=0;
  j--;
  mflag=0;
}
if(hflag)
  {
      numbuffer[j-1]=-1*numbuffer[j-1];
  hflag=0;
}
if(lflag)
  {
      numbuffer[j-2]=numbuffer[j-2]%numbuffer[j-1];
  j--;
  lflag=0;
}
  temp=0;
  mflag=1;
  KeyValue=17;
  flag=4;
  }
  break;
  case 14:{
      writedata('%');
  numbuffer[j]=temp;   //缓存区数据
  j++;
  temp=0;
               lflag=1;  //求余优先级
  KeyValue=17;
  flag=5;
  }
  break;
  case 15:{
      writedata('=');
  numbuffer[j]=temp;   //缓存区数据
  temp=0;
  j++;   
  if(pflag)
  {
      numbuffer[j-2]=numbuffer[j-2]*numbuffer[j-1];
  j--;
  j--;   
  pflag=0;
}
if(mflag)
  {
      numbuffer[j-2]=numbuffer[j-2]/numbuffer[j-1];
  j--;
  j--;
  mflag=0;
}


if(hflag)
  {
      numbuffer[j-1]=-1*numbuffer[j-1];
  hflag=0;
}
if(lflag)
  {
      numbuffer[j-2]=numbuffer[j-2]%numbuffer[j-1];
  j--;
  j--;
  lflag=0;
}
  KeyValue=17;
               for(i=0;i<=j;i++)
  {
      result+=numbuffer[i];
}
i=0;
while(result)
         {
            LEDBuffer[i]=result%10;    //将数据存储在缓存区中
        result/=10;
        i++; //i的值比实际位数多一个值
         }
 for(i;i>0;i--)
 {
    writedata('0'+LEDBuffer[i-1]);   //显示输出结果
 }
}
  break;
}
}
}


void init()
{
    writecom(0x01);
writecom(0x38);
writecom(0x0c);
writecom(0x06);
}
void writecom(unsigned char j)
{
fbusy();
    E=0;
RS=0;
RW=0;
E=1;
P0=j;
E=0;
}
void fbusy()
{    
E=0;
    P0=0xff;
RS=0;
RW=1;
E=1;
while(P0&0x80)
{
  E=0;
  E=1;
}
}
void writedata(unsigned char j)
{
fbusy();
E=0;
RS=1;
RW=0;
E=1;
P0=j;
E=0;


}
void KeyDown(void)  //键盘扫描
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)         //读取按键是否按下
{
delay1ms(10);          //延时10ms进行消抖
if(GPIO_KEY!=0x0f)    //再次检测键盘是否按下
{

//测试列
GPIO_KEY=0X0f;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//测试行
GPIO_KEY=0Xf0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
delay1ms(10);
a++;
}
}
}
}
void delay1ms(unsigned int x)
{
   unsigned int i,j;
   for(i=0;i     for(j=0;j<120;j++);
}
void init1(void) interrupt 0
{
     for(i=0;i<=4;i++)
{
LEDBuffer[i]=0;         //清空数组中的数据
}
for(i=0;i<=8;i++)
{
numbuffer[i]=0;         //清空数组中的数据
}    
 result=0;
 i=0;
 x=0;
 temp=0;
      init();
      writecom(0x80);
}