1、能实现三位数的加减乘除。
2、键盘输入计算数据,数码管显示输入值。
3、使用8255扩展接线驱动数码管和键盘。
define PA XBYTE[0x70ff]//定义8255端口
#define PB XBYTE[0x71ff]
#define PC XBYTE[0x72ff]
#define PD XBYTE[0x73ff]
unsigned int a=0,b=0; //输入
unsigned char fuhao=0;//符号
unsigned int c=0;//结果
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
unsigned char disp[]={0,0,0,0,0,0,0,0};
void delay(unsigned int i)//延时
{
while(i--);
}
unsigned char key=0;
unsigned char key_scan()//按键检测
{
unsigned char i,j,k=0;
i=0;
j=0;
PD=0X81;
PC=0x0f;
k=PC;
if(k!=0x0f) //检测有无按下
{
switch(k)//检测行
{
case 0x0e:i=3;break;
case 0x0d:i=2;break;
case 0x0b:i=1;break;
case 0x07:i=0;
}
PD=0X88;
PC=0xf0;
k=PC;
switch(k)//检测列
{
case 0xe0:j=13;break;
case 0xd0:j=9;break;
case 0xb0:j=5;break;
case 0x70:j=1;
}
}
if(key!=i+j)
{
key=i+j;
return key;
}
else
return 0;
}
void main()//主函数
{
unsigned char i;
unsigned int m=0;
PD=0x80;
while(1)
{
//显示
if(fuhao<5)
{
PA=0;
PB=0XFE;
PA=smgduan[a%1000/100];
delay(100);
PA=0;
PB=0XFD;
PA=smgduan[a%100/10];
delay(100);
PA=0;
PB=0XFB;
PA=smgduan[a%10];
delay(100);
PA=0;
PB=0XF7;
switch(fuhao)//符号
{
case 1:PA=0x01;break;
case 2:PA=0x40;break;
case 3:PA=0x08;break;
case 4:PA=0x80;break;
default:PA=0;
}
delay(100);
PA=0;
PB=0XEF;
PA=smgduan[b%1000/100];
delay(100);
PA=0;
PB=0XDF;
PA=smgduan[b%100/10];
delay(100);
PA=0;
PB=0XBF;
PA=smgduan[b%10];
delay(100);
}
else//显示结果
{
PA=0;
PB=0XEF;
PA=smgduan[c%1000/100];
delay(100);
PA=0;
PB=0XDF;
PA=smgduan[c%100/10];
delay(100);
PA=0;
PB=0XBF;
PA=smgduan[c%10];
delay(100);
}
//==================================================
i=key_scan();//检测
if((i>0)&&(i<11))//输入数值
阅读全文