文档视界 最新最全的文档下载
当前位置:文档视界 › 简易计算器C51源程序

简易计算器C51源程序

#include<reg51.h>
//unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //共阳显示码
unsigned char buf[8]={0,16,16,16,16,16,16,16}; //显示缓冲区
unsigned char ss[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位控制码
unsigned char key_value=0; //存放当前按下按键的键值
bit key_flag=0; //标志位,表示当前是否有按键按下
unsigned int num=0,num1; //计算所用的变量
unsigned char cal_sty=16; //计算类型变量
unsigned char n=0; //数字键按下的次数
void delay (void)
{unsigned char j,k;
for (j=4;j>0;j--)
for (k=250;k>0;k--);
}
void disp(void)
{unsigned char i;
for(i=0;i<=7;i++)
{P2=ss[i];
P0=table[buf[i]];
delay();
}
}
void disp_num(unsigned int x) //x为不确定的位数的根据
{if(x>1000 && x<10000)
{buf[0]=(x%1000%100)%10;buf[1]=(x%1000%100)/10;buf[2]=(x%1000)/100;buf[3]=x/1000;buf[4]=16;buf[5]=16;buf[6]=16;buf[7]=16;}
if(x>100 && x<1000)
{buf[0]=(x%100)%10;buf[1]=(x%100)/10;buf[2]=x/100;buf[3]=16;buf[4]=16;buf[5]=16;buf[6]=16;buf[7]=16;}
if(x>10 && x<100)
{buf[0]=x%10;buf[1]=x/10;buf[2]=16;buf[3]=16;buf[4]=16;buf[5]=16;buf[6]=16;buf[7]=16;}
if(x<10)
{buf[0]=x;buf[1]=16;buf[2]=16;buf[3]=16;buf[4]=16;buf[5]=16;buf[6]=16;buf[7]=16;}
disp();
}
void key1 (void) //判断按键是否按下
{P1=0Xf0; //4行全部送0
if(P1!=0Xf0) {disp();
{if(P1!=0Xf0) {key_flag=1;}
else {key_flag=0;}
}
}
else {key_flag=0;}
}
void key2 (void) //判断按键的键值
{if(key_flag==1) {P1=0xfe;
if(P1==0xee) key_value=0;
else if(P1==0xde) key_value=1;
else if(P1==0xbe) key_value=2;
else if(P1==0x7e) key_value=3;
P1=0xfd;
if(P1==0xed) key_value=4;
else if(P1==0xdd) key_value=5;
else if(P1==0xbd) key_value=6;
else if(P1==0x7d) key_value=7;
P1=0xfb;
if(P1==0xeb) key_value=8;
else if(P1==0xdb) key_value=9;
else if(P1==0xbb) key_value=10;
else if(P1==0x7b) key_value=11;
P1=0xf7;
if(P1==0xe7) key_value=12;
else if(P1==0xd7) key_value=13;
else if(P1==0xb7) key_value=14;
else if(P1==0x77) key_value=15;


P1=0xf0;
while(P1!=0xf0) disp(); //等待按键释放
}
}
void cal(void)
{if(key_flag==1)
{switch(key_value)
{case 0:if(n<2) {num=num*10+7;n++;} break; //7
case 1:if(n<2) {num=num*10+8;n++;}
break; //8
case 2:if(n<2) {num=num*10+9;n++;} break; //9
case 4:if(n<2) {num=num*10+4;n++;} break; //4
case 5:if(n<2) {num=num*10+5;n++;} break; //5
case 6:if(n<2) {num=num*10+6;n++;} break; //6
case 8:if(n<2) {num=num*10+1;n++;} break; //1
case 9:if(n<2) {num=num*10

+2;n++;} break; //2
case 10:if(n<2) {num=num*10+3;n++;} break; //3
case 13:if(n<2) {num=num*10+0;n++;} break; //0
case 3: num1=num; num=0;cal_sty=0;n=0; break; //除法
case 7: num1=num; num=0;cal_sty=1;n=0; break; //乘法
case 11: num1=num; num=0;cal_sty=2;n=0; break; //减法
case 15: num1=num; num=0;cal_sty=3;n=0; break; //加法
case 14: if(cal_sty!=16) //如果cal_sty=16,表示没有运算符,“=”不起作用
{switch(cal_sty)
{
case 0: num=num1/num;break; //除法
case 1: num=num*num1;break; //乘法
case 2: num=num1-num;break; //减法
case 3: num=num+num1;break; //加法
}
cal_sty=16; //返回到cal_sty的初值
n=3;
}
break;
case 12:num=0;num1=0;cal_sty=0;n=0;break; // 清零
}
}
}
void main (void)
{ while(1) {disp_num(num);
//buf[0]=key_value;disp();
key1();key2();
cal();
}
}

相关文档
相关文档 最新文档