独立键盘设置加减乘除无法实现
求助独立部门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();
}
}
一周热门 更多>