文档库 最新最全的文档下载
当前位置:文档库 › 简单计算器 C语言程序

简单计算器 C语言程序

//普中HC6800-EM3 开发板测试
//P0口接数码管 J12插针 P2口接矩阵按键 P1.0 P1.1 P1.2 接38译码器 J6插针A B C
#include
sbit keyint1=P2^3;//矩阵键盘
sbit keyint2=P2^2;
sbit keyint3=P2^1;
sbit keyint4=P2^0;
sbit keyout1=P2^7;
sbit keyout2=P2^6;
sbit keyout3=P2^5;
sbit keyout4=P2^4;
sbit ADDR0=P1^0;//38译码器A
sbit ADDR1=P1^1;//38译码器B
sbit ADDR2=P1^2; //38译码器C
unsigned char keysta[4][4]={//按键状态暂存变量
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char LedBuff[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char code LedChar[]={//数码管真值表0-F
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char code keytab[4][4]={//标准键盘真值表
{0x31,0x32,0x33,0x26},//数字键1,2,3,加号
{0x34,0x35,0x36,0x27},//数字键4,5,6,减号
{0x37,0x38,0x39,0x28},//数字键7,8,9,乘号
{0x30,0x24,0x25,0x29} //数字键0,清除,等于,除号
};
void inttimer0();//定时器初始化
void keydriver();//按键驱动
void KeyScan();//按键扫描
void ledscan();//LED动态扫描
void ShowNumber(unsigned long num);//数字分离,高位0消隐
void KeyAction(unsigned char keycode);//加减运算函数
void main()
{
inttimer0();
LedBuff[0] =LedChar[0];
while(1)
{
keydriver();
}
}
void inttimer0()
{
EA=1;
TMOD=0x01;
TH0=0Xfc;
TL0=0X67;
ET0=1;
TR0=1;
}
void ShowNumber(unsigned long num)
{
signed char j;
unsigned char buf[8];

for(j=0; j<8; j++)
{
buf[j] = num % 10;
num = num / 10;
}

for(j=7; j>=1; j--)
{
if(buf[j] == 0)
{
LedBuff[j] = 0xff;
}
else
break;
}

for(; j>=0; j--)
{
LedBuff[j] = LedChar[buf[j]];
}

}
void KeyAction(unsigned char keycode)//加减运算函数
{
static unsigned long result = 0;
static unsigned long addend = 0;
static unsigned char fuhao=0;
static unsigned long addend1=0;
if((keycode >= 0x30) &&(keycode <= 0x39))
{
addend = (addend *10) + (keycode - 0x30);
ShowNumber(addend);
}
else if((keycode>=0x24)&&(keycode<=0x29))
{
if( keycode==0x24)
{
result=0;
addend=0;
fuhao=0;
ShowNumber(result);
}
else if((keycode>=0x26)&&(keycode<=0x29))
{
switch(fuhao)
{
case 0x00:addend1=addend;break;
case 0x26:addend1+=addend;break;
case 0x27:addend1-=addend;break;
case 0x28:addend1*=addend;break;
case 0x29:addend1/=addend;break;
default: break;
}
fuhao=keycode;
addend=0;
switch(fuhao)
{
case 0x26:result=addend1+addend;ShowNumber(result);break;
case 0x27:result=addend1-addend;ShowNumber(result);break;
case 0x28:result=addend1*addend;ShowNumber(addend1);break;
case 0x29:result=addend1/addend;ShowNumber(addend1);break;
default: break;
}

}
else
{
switc

h(fuhao)
{
case 0x26:result=addend1+addend;break;
case 0x27:result=addend1-addend;break;
case 0x28:result=addend1*addend;break;
case 0x29:result=addend1/addend;break;
default: break;
}
ShowNumber(result);
}
}

}

void keydriver()//按键驱动
{
static unsigned char backup[4][4]={//按键状态变量
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keysta[i][j]!=backup[i][j])
{
if(backup[i][j]==0)
{
KeyAction(keytab[i][j]);
}
backup[i][j]=keysta[i][j];
}
}
}
}
void ledscan()//LED动态扫描
{
static unsigned char i = 0; //动态扫描的索引

P0 = 0x00; //显示消隐
switch (i)
{
case 0: ADDR2=1; ADDR1=1; ADDR0=1; i++; P0=~LedBuff[0]; break;
case 1: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=~LedBuff[1]; break;
case 2: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=~LedBuff[2]; break;
case 3: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=~LedBuff[3]; break;
case 4: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=~LedBuff[4]; break;
case 5: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=~LedBuff[5]; break;
case 6: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=~LedBuff[6]; break;
case 7: ADDR2=0; ADDR1=0; ADDR0=0; i=0; P0=~LedBuff[7]; break;
default: break;
}
}
void KeyScan()//按键扫描
{
unsigned char i;
static unsigned char keyout=0;
static unsigned char keybuf[4][4]={
{0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff},
{0xff,0xff,0xff,0xff}
};
keybuf[keyout][0] = (keybuf[keyout][0] <<1) | keyint1;
keybuf[keyout][1] = (keybuf[keyout][1] <<1) | keyint2;
keybuf[keyout][2] = (keybuf[keyout][2] <<1) | keyint3;
keybuf[keyout][3] = (keybuf[keyout][3] <<1) | keyint4;

for(i=0; i<4; i++)
{
if((keybuf[keyout][i] & 0x0F) == 0x00)
{
keysta[keyout][i]=0;
}
else if((keybuf[keyout][i] & 0x0F) == 0x0F)
{
keysta[keyout][i] = 1;
}
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case 0: keyout4=1;keyout3=1;keyout2=1;keyout1=0;break;
case 1: keyout4=1;keyout3=1;keyout2=0;keyout1=1;break;
case 2: keyout4=1;keyout3=0;keyout2=1;keyout1=1;break;
case 3: keyout4=0;keyout3=1;keyout2=1;keyout1=1;break;
default: break;
}
}
void interrupttimer0() interrupt 1
{

TH0=0Xfc;
TL0=0X67;
ledscan();
KeyScan();

}


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