#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3; //beep用于控制蜂鸣器(每按一次键就为0并且叫一下)
sbit dula=P2^6; //dula通过控制锁存器1来控制数码管段选
sbit wela=P2^7; //wela通过控制锁存器2来控制数码管位选
uchar code table[]={ //数码管的显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x79};
uchar fuhao=0,scan=0; //全局变量fuhao用来存放运算符的值 scan作为是否按键的标志位(按下就为1没按为0)
void delay(uint z); //延时Z毫秒
void display(long n); //用六位数码管显示long值
uchar keyscan(); //键盘扫描并把扫描得到的值返回
void displayerror(); //显示错误操作提示信息
void main()
{
uchar val=0,j=0,i=0,jie,e=0; //i,j用于判断每次输入的数是否超过六位,e为错误操作标志位(为1表示已错误操作),jie为显示计算结果标志位(为1表示要显示结果)
long a=0,b=0,c=0; //a存放第一次输入的数,b存放第二次输入的数,c存放计算的结果
display(0); //初始化显示
delay(1000); //延时1000毫秒
while(1)
{
beep=1; //关闭蜂鸣器
val=keyscan(); //把扫描得到的值赋给val
if(scan==1) //一旦按下键我就对其操作
{
scan=0; //把按键标志位scan复位
if(val==10) //如果按下的为复位键
{
a=0;b=0;c=0;fuhao=0;jie=0;e=0;i=0;j=0;display(0);
//复位操作(初始化) (显示是不能停)
continue; //直接进入下一次循环
}
else if(val>=11&&val<=15&&i==0&&fuhao==0)//如果第一次按下的不是数字键
{
display(0); //数码管显示不能停
continue; //直接进入下一次循环
}
else if(val>=12&&val<=15&&fuhao==0&&i!=0)//输入数字之后按下的第一个运算符
{
fuhao=val; //把扫描得到运算符值赋给fuhao标志位
i=0; //一旦输入运算符就把数字输入计数i清零
display(0); //数码管显示不能停
}
else if(fuhao!=0&&val>=11&&val<=15) //只要按下等于或者运算符之前按了数字键和运算符就显示计算结果
{
jie=1; //计算结果标志位jie为1(表示要显示计算结果c)
if(fuhao==12) //如果输入的是运算符‘+’
{
c=a+b; //把运算的结果赋给c
if(c>999999) //如果计算结果超出数码管的显示范围
{
displayerror(); //显示出错信息
e=1; //出错信息标志位置1
}
else
{
display(c); //不超出显示范围就显示结果
}
}
else if(fuhao==13) //如果输入的运算符是‘-’