51单片机c语言设计计算器,独立键盘设置加减乘除无法实现

2019-07-15 07:36发布

独立键盘设置加减乘除无法实现
求助独立部门c语言写法

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit key4=P3^5;
sbit key3=P3^4;
sbit key2=P3^3;
sbit key1=P3^2;



unsigned char code table[]={
        0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0};

ulong dat;       //??
ulong datA;      //????
uchar addflag;   //?????
uchar subflag;   //?????
uchar mulflag;   //?????
uchar divflag;   //?????
uchar overflow;  //?????
uchar clrflag;   //???????
uchar illegal;   //????????

uchar keynum;    //????
uchar keycode;   //??IO????   
uchar scanok;
uchar checkok;

void delay_ms(uint z)                      //1ms?????   
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

void  scankeyboard()                  //scankeyboard()??(??????)
{                                     //?????????
    uchar a,b;
P1=0x0f;                     
keycode=P1;
if(keycode!=0x0f)
{
  delay_ms(10);                 //????????
  a=keycode;
  P1=0xf0;
  b=P1;
  keycode=a|b;
  while(P1!=0xf0);
  delay_ms(10);//????????
     P1=keycode;
  scanok=1;//???????scanok?1???
}

}

void checkkeycode(void)      
{                        if(key1==0)
                        {delay_ms(10);
                                if(key1==0)
                                {
                                        keynum=10 ;
                                        while(key1==0)delay();
                                        delay();
                                }
                        }
                        if(key2==0)
                        {
                                delay_ms(10);
                                if(key2==0)
                                {
                                        keynum=11 ;
                                        while(key1==0)delay();
                                        delay();
                                        checkok=1;
                        }
                        }
                        if(key3==0)
                        {
                                delay_ms(10);
                                if(key3==0)
                                {
                                        keynum=12 ;
                                        while(key1==0)delay();
                                        delay();
                                }
                        }
                        
    if(scanok)                                //???????,????????
{
     scanok=0;                             //scanok???????????
  switch(keycode)                       //????????????????...
  {
   case 0xee: keynum=1  ;break;
   case 0xde: keynum=2  ;break;
   case 0xbe: keynum=3 ;break;          //???
   case 0xed: keynum=4  ;break;
   case 0xdd: keynum=5  ;break;
   case 0xbd: keynum=6  ;break;
   case 0xeb: keynum=7  ;break;
   case 0xdb: keynum=8  ;break;
   case 0xb7: keynum=14 ;break;   // =
   case 0xe7: keynum=15 ;break;
           return keynum;
          //??
  }
  checkok=1;
  }
}

void datpros(void)                     //????????
{
   if(keynum==15)                      //???15  ???????  ????
   {
     dat=0;
   }
   else                                //????????? ???? ?? ???
   {
  if(clrflag)                    //?????1,??????
  {        
   dat=0;
   clrflag=0;                 //????????
  }
  dat=dat*10+(ulong)keynum;     //???????????????????"1","2","3"???????"123"
  if(dat>1000000000) overflow=1; //???????65535(????int???,???65535)????????1,???????????"EEEEEEE"
  if(divflag&&!dat) illegal=1;   //?????????,??????1,???????
   }
}

void add(void)
{
   addflag++;                          //?????1???
   subflag=mulflag=divflag=0;          //???????????(?????????)
   clrflag=1;                          //?????1,(??????,????????,???????????????????????)
   if(addflag>1)                       //????????
   {                                   //????????????????????
       dat=dat+datA;                   //???
    datA=dat;                       //???,?????????
   }                                   //??:????"1+2+3"?,???????,?????1+2????
   else datA=dat;                      //??????,?????????????(?????????dat?????)

}

void sub(void)
{
   subflag++;
   addflag=mulflag=divflag=0;
   clrflag=1;
   if(subflag>1)                //????
   {
       dat=datA-dat;
    datA=dat;
   }
   else datA=dat;
}

void mul(void)
{
   mulflag++;
   addflag=subflag=divflag=0;
   clrflag=1;
   if(mulflag>1)                //??
   {
  dat=datA*dat;
  datA=dat;
   }
   else datA=dat;

}

void div(void)
{
   divflag++;
   addflag=subflag=mulflag=0;
   clrflag=1;
   if(divflag>1)
   {
     dat=datA/dat;
  datA=dat;
   }
   else datA=dat;
}

void equ(void)
{

   if(addflag)                           //???????????
   {
   dat=dat+datA;                     //?????dat(??????dat?????)
   }
   if(subflag)
   {
   dat=datA-dat;
   }
   if(mulflag)
   {
      dat=datA*dat;
   }
   if(divflag)
   {
      dat=datA/dat;
   }
   addflag=subflag=mulflag=divflag=0;    //??????????????????????????
}

void display(void)
{
uchar ge=0,shi=0,bai=0,qian=0,wan=0,shiwan=0,baiwan=0,qianwan=0;

if(!overflow&&!illegal)
{
  qian=dat/1000;
                bai=(dat%1000)/100;
                shi=(dat%100)/10;
                ge=dat%10;


  P0=table[ge];
  P2=0x7f;
  delay_ms(2);

  P0=table[shi];
  P2=0xbf;         //????
  delay_ms(2);

  P0=table[bai];
  P2=0xdf;         //????
  delay_ms(2);

  P0=table[qian];
  P2=0xef;         //?????
  delay_ms(2);   


  P0=0xff;
}
else
{
  P0=table[0];
  P2=0x7f;
  delay_ms(2);
}
}

void calculate_handle(void)//???????
{
if(checkok)//?????????????????
{
  checkok=0;//???????..
  switch (keynum)//???+,-,*,/,=??????????
  {
   case 10 : add(); break;    //?????"+",????????
   case 11 : sub(); break;    //?????"-",????????
   case 12 : mul(); break;    //?????"*",????????
   case 13 : div(); break;      //????,???(????),??????????
   case 14 : equ(); break;
   default : datpros();       //????,???(????),??????????
  }
}
}



void main(void)
{
P0=0xff;
while(1)
{
  scankeyboard();         
  checkkeycode();
  calculate_handle();
  display();
}
}


0条回答

一周热门 更多>