64,653
社区成员
发帖
与我相关
我的任务
分享
//现在这个程序只能进行两个无符号十进制的加减乘除运算
//怎么改成可以进行两个有符号的十进制的运算
//并且结果为负数是在最高位显示负数
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //段选引脚
sbit wela=P2^7; //位选引脚
int flag,inputnum1,inputnum2,displaynum,mathsign,outputnum,keynum;
int sign1,sign2,state,displaysign;
uchar address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //6位数码管地址数组
uchar table[]={ //0-F共阴型数码管字形码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40 };
void delayms(uint xms) //延时函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
uchar temp,temph,templ,k;
P3=0xf0;
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
delayms(10);
temp=P3;
temph=temp&0xf0;
if(temph!=0xf0)
{
P3=0x0f;
temp=P3;
templ=temp&0x0f;
k=temph^templ;
switch(k)
{
case 0xee: keynum=0;break; //数字'0'
case 0xde: keynum=1;break; //数字'1'
case 0xbe: keynum=2;break; //数字'2'
case 0x7e: keynum=3;break; //数字'3'
case 0xed: keynum=4;break; //数字'4'
case 0xdd: keynum=5;break; //数字'5'
case 0xbd: keynum=6;break; //数字'6'
case 0x7d: keynum=7;break; //数字'7'
case 0xeb: keynum=8;break; //数字'8'
case 0xdb: keynum=9;break; //数字'9'
case 0xbb: keynum=10;break; // '='
case 0x7b: keynum=11;break; // 清零'C'
case 0xe7: keynum=12;break; // '+'
case 0xd7: keynum=13;break; // '-'
case 0xb7: keynum=14;break; // '*'
case 0x77: keynum=15;break; // '/'
}
while(temph!=0xf0)
{
P3=0xf0;
temp=P3;
temph=temp&0xf0;
}
}
}
}
void display()
{
int a;
a=5;
if(displaysign==-1) //显示'-'
{
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[16]; dula=0; delayms(1);
}
if(displaynum<10) //显示1位数,0~9
{
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum]; dula=0; delayms(1);
}
else if (displaynum<100) //显示2位数,10~99
{
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum%10]; dula=0; delayms(1);
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum/10]; dula=0; delayms(1);
}
else //显示3位数,100~999
{
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum%10]; dula=0; delayms(1);
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum%100/10]; dula=0; delayms(1);
P0=0xff; wela=1; P0=address[a--]; wela=0; P0=0x00; dula=1; P0=table[displaynum/100]; dula=0; delayms(1);
// wela=1; P0=address[a ]; wela=0; P0=0x00; dula=1; P0=0x40; dula=0; delayms(1);
}
}
void main()
{
while(1)
{
keyscan();
if(keynum<10) //'0'..'9'
{
if(flag==0)
{
inputnum1=keynum;
displaynum=inputnum1;
}
if(flag==1)
{
inputnum2=keynum;
displaynum=inputnum2;
}
}
if(keynum==10) //'='
{
switch(mathsign)
{
case 12: outputnum=sign1*inputnum1 + sign2*inputnum2 ;break;
case 13: outputnum=sign1*inputnum1 - sign2*inputnum2 ;break;
case 14: outputnum=sign1*inputnum1 * sign2*inputnum2 ;break;
case 15: outputnum=sign1*inputnum1 /(sign2*inputnum2);break;
}
if (outputnum>=0) {
displaysign=0;
displaynum=outputnum;
} else {
displaysign=-1;
displaynum=-outputnum;
}
}
if(keynum==11) //'C'
{
displaynum=0;
inputnum1=0;
inputnum2=0;
outputnum=0;
flag=0;
keynum=16;
mathsign=0;
sign1=1;
sign2=1;
state=0;
displaysign=0;
}
if((keynum>=12)&&(keynum<=15)) //'+','-','*','/'
{
if (state==0) {
if (keyname==13) {//'-'
if (flag==0) {
sign1=-1;
displaysign=-1;
} else {
sign2=-1;
displaysign=-1;
}
state=1;
}
} else {
flag=1;
mathsign=keynum;
displaynum=0;
state=0;
}
}
display();
}
}