#define uint unsigned int #define uchar unsigned char bit keydown;
uchar flag=0,scancode=0x0ff,temp=0,t=0; uint data count[4];
uchar data dis_buf[4]={0,0,0,0}; uchar
code
dis_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/******************************************************************** * 名称 : init_t0() * 功能 : 定时器
***********************************************************************/
void init_t0() {
TMOD=0xf1; ET0=1; EA=1;
TH0=0x06; TL0=0x06; TR0=1; }
/******************************************************************** * 名称 : display()
* 功能 : 显示,利用4位数码管显示数值,为0的高位不显示 * 输出 : 仅最少的位数显示计算得到的数值
***********************************************************************/
void display(void) {
dis_buf[0]=t/1000; dis_buf[1]=t%1000/100; dis_buf[2]=t%100/10; dis_buf[3]=t%10; }
/******************************************************************** * 名称 : display1()
* 功能 : 清零显示,利用4位数码管显示数值,仅最低位显示0
***********************************************************************/
void display1(void) {
dis_buf[0]=dis_buf[1]=dis_buf[2]=dis_buf[3]=0; count[0]=count[1]= count[2]= count[3]=0; flag=0; temp=0; t=0; }
/******************************************************************** * 名称 : Convert_Scancode()
* 功能 : 实现按键的读取。下面这个子程序是按处理矩阵键盘的基本方法处理的。
* 输出 : 按键值
***********************************************************************/
uchar Convert_Scancode(uchar s) {
uchar c;
switch(s&0x0f) {
case 1: c=0; break; case 2: c=1; break; case 4: c=2; break; case 8: c=3; break; default: c=0xff; return c; }
switch(s&0x0f0) {
case 0x10: c+=0; break; case 0x20: c+=4; break; case 0x40: c+=8; break; case 0x80: c+=12; break; default: c=0xff; return c; }
return c;
}
/******************************************************************** * 名称 : t0()
* 功能 : 定时器中进行数据位选
***********************************************************************/
void int_t0(void) interrupt 1 using 2 {
uchar key;
static bit down=0;
static uchar data index=0;
TH0=0xf8;
key=P2;
if((key&0x0f)!=0x0f){ down=1;
scancode=(~key); }
P0=0xff;
switch(index) {
case 0: P2=~0x10; break; case 1: P2=~0x20; break; case 2: P2=~0x40; break; default: P2=~0x80; }
P0=~dis_code[dis_buf[index]&0x0f];
index++;
if(index==4) {
index=0;
keydown=down; down=0; } }
/******************************************************************** * 名称 : Main()
* 功能 : 主函数,读取键值;设置键值功能,如加减乘除 进行显示的数值处理,调用显示函数 * 输出 : 计算结果
***********************************************************************/ main() {
init_t0(); while(1) { while(!keydown); while(keydown);
temp=Convert_Scancode(scancode); if(temp==12) display1();
if(flag==0&&temp>9) {flag=1;t=0;} if(flag==2&&temp>9) {flag=3;t=0;} switch(flag) {
case 0: {
t=t*10+temp; display(); count[0]=t; break;
}
case 1: {
switch(temp) {
case 11:{count[1]=1;break;} case 15:{count[1]=2;break;} case 10:{count[1]=3;break;} case 14:{count[1]=4;break;} default: ; } flag=2;
t=0; break; }
case 2: {
t=t*10+temp; display(); count[2]=t; break; }
case 3:
{ switch(count[1]) {
case 1:{count[3]=count[0]+count[2];break;} case 2:{count[3]=count[0]-count[2];break;} case 3:{count[3]=count[0]*count[2];break;} case 4:{count[3]=count[0]/count[2];break;} default: ; }
t=count[3]; count[0]=t; display(); flag=1; break; }
case 4: flag=0; break; default: ; } } }
五、 实验总结
将程序下载到单片机实验板上,可以完整的实现功能。
1、可以进行四则运算,利用4位数码管显示运算的两数及其运算结果 2、键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键。通过不同的按键执行运算过程。
3、开机显示零,等待键入数值,当键入数字,通过数码管显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。