想把照片中划线的按键设置为清零和等于
#include<reg52.h>
#include<string.h>
#define GPIO_KEY P1
#define GPIO_SMG P0
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef bit bool;
sbit LSA=P2^2; //38译码器相关设定
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit LED0=P2^0;
sbit LED1=P2^1;
sbit ITRP0=P3^2; //中断0
sbit ITRP1=P3^3; //中断1
u8 currentValue=0,delayCounter=0;
u32 sum;
u8 i;
u8 segSel[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选数据
u8 str[8];
bool opr_sign=0; //判断键入数据是否为操作按键
u8 opr_num=0; //判断按键种类
void delay(int t) //简略的延时函数
{
while(t) t--;
}
void clear() //清零函数
{
sum=0;
}
void key_scan() //主循环使用的按键扫描函数
{
u16 a=0;
GPIO_KEY=0x0f; //矩阵键盘行列扫描
if(GPIO_KEY!=0x0f)
{
opr_sign=0;
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY) //列选
{
case(0x07):
currentValue=1;break; //一列
case(0x0b):
currentValue=2;break; //二列
case(0x0d):
currentValue=3;break; //三列
case(0x0e):
currentValue='#';break;//字符列
}
GPIO_KEY=0xf0;
if(currentValue!='#')
switch(GPIO_KEY) //行选
{
case(0x70): break; //一行
case(0xb0):
currentValue+=3;break; //二行
case(0xd0):
currentValue+=6;break; //三行
case(0xe0):
currentValue=0;break; //四行
}
if(currentValue=='#')
{
switch(GPIO_KEY)
{
case(0x70):
currentValue='+';break;
case(0xb0):
currentValue='-';break;
case(0xd0):
currentValue='*';break;
case(0xe0):
currentValue='/';break;
}
opr_sign=1; //确定输入了符号
}
if(opr_sign==1) ITRP1=0; //进入中断1
if(currentValue<=9) //键入数字时操作
{
sum*=10;
sum+=currentValue;
}
currentValue=0; //复位
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0f;
while((a<250)&&(GPIO_KEY!=0xf0)) //按键松手检测
{
delay(200);
a++;
}
a=0;
}
}
}
}
void ITRP_key_scan() //中断用按键扫描,与主函数所用函数相同(防止重复调用同一段造成数据混乱)
{
u16 a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
opr_sign=0;
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY) //列选
{
case(0x07):
currentValue=1;break; //一列
case(0x0b):
currentValue=2;break; //二列
case(0x0d):
currentValue=3;break; //三列
case(0x0e):
currentValue='#';break;
}
GPIO_KEY=0xf0;
if(currentValue!='#')
switch(GPIO_KEY) //行选
{
case(0x70): break; //一行
case(0xb0):
currentValue+=3;break; //二行
case(0xd0):
currentValue+=6;break; //三行
case(0xe0):
currentValue=0; break; //四行
}
if(currentValue=='#')
switch(GPIO_KEY)
{
opr_sign=1;
case(0x70):
currentValue='+';break;
case(0xb0):
currentValue='-';break;
case(0xd0):
currentValue='*';break;
case(0xe0):
currentValue='/';break;
}
if(currentValue<=9)
{
sum*=10;
sum+=currentValue;
}
if(opr_sign==1) ITRP1=0;
currentValue=0;
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0f;
while((a<250)&&(GPIO_KEY!=0xf0)) //按键松手检测
{
delay(200);
a++;
}
a=0;
}
}
}
}
void bitSel(u8 x) //位选(38译码器用,具体翻看74HC138芯片手册)
{
switch(x)
{
case(0):
LSA=1;LSB=1;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
case(4):
LSA=1;LSB=1;LSC=0; break;
case(5):
LSA=0;LSB=1;LSC=0; break;
case(6):
LSA=1;LSB=0;LSC=0; break;
case(7):
LSA=0;LSB=0;LSC=0; break;
}
}
void decon(u32 num) //数位分解函数(将数字分解后送至每一位的数码管点亮)
{
i=7;
memset(str,0,sizeof(str));
while(num>0)
{
str[i]=num%10;
num/=10;
i--;
}
}
u32 tmp;
void display(u32 dig) //显示函数
{
if(opr_sign==0)
{
decon(dig);
for(i=1;i<=7;i++)
{
bitSel(i);
P0=segSel[str[i]];
delay(100);
P0=0x00;
}
}
}
void ITRP1_interrupt() interrupt 2 //中断一程序
{
LED0=~LED0;
if(opr_sign==1)
{
tmp=sum;
if(currentValue=='+')
{
opr_num=1;
clear();
opr_sign=0;
while(ITRP0==1)
{
ITRP_key_scan();
display(sum);
}
}
if(currentValue=='-')
{
opr_num=2;
clear();
opr_sign=0;
while(ITRP0==1)
{
ITRP_key_scan();
display(sum);
}
}
if(currentValue=='*')
{
opr_num=3;
clear();
opr_sign=0;
while(ITRP0==1)
{
ITRP_key_scan();
display(sum);
}
}
if(currentValue=='/')
{
opr_num=4;
clear();
opr_sign=0;
while(ITRP0==1)
{
ITRP_key_scan();
display(sum);
}
}
opr_sign=0;
}
ITRP1=1;
}
void ITRP0_interrupt() interrupt 0 //中断0程序
{
delay(1000);
if(ITRP0==0)
{
LED1=~LED1;
if(opr_num==1)
sum+=tmp;
if(opr_num==2)
{
if(tmp>=sum)
tmp-=sum;
else
{
while(1)
{
u8 j;
for(j=7;j>0;j--)
{
bitSel(j);
GPIO_SMG=segSel[14];
}
}
}
sum=tmp;
}
if(opr_num==3)
sum*=tmp;
if(opr_num==4)
{
tmp/=sum;
sum=tmp;
}
}
}
void int0_init()
{
EA=1;
IT0=1;
EX0=1;
}
void int1_init()
{
EA=1;
IT1=1;
EX1=1;
}
int main()
{
int0_init();
int1_init();
ITRP0=1;
ITRP1=1;
while(1)
{
key_scan();
display(sum);
}
}