sbit R_W=P3^5; sbit RS=P3^6;
/******************主函数*****************/ main() { EA=1; EX0=1; IT0=1; P2=0xff; display(0); init_LCM(); write_data(0x30); while(1) { } }
2、分块程序设计:
(1)键盘输入检测程序设计:
有键按下时,单片机响应外部中断0,转入外部中断0中断处理函数,在中断处理函数中完成对按键的判断,以进行下一步的程序处理。 /**********键值转化为键盘上按键值函数*************/ char translate(int keycode) {
switch(keycode) { case 0: return '7'; break; case 1: return '4'; break; case 2:
- 17 -
return '1'; break; case 3:
return 'c'; break; case 4:
return '8'; break; case 5:
return '5'; break; case 6:
return '2'; break; case 7:
return '0'; break; case 8:
return '9'; break; case 9:
return '6'; break; case 10:
return '3'; break; case 11:
return '='; break; case 12:
return '/';
break;
case 13:
基于单片机控制的简单计算器设计与仿真
- 18 -
}
return '*'; break; return '-'; break; return '+'; break; }
case 14:
case 15:
/***********外部中断0处理函数*************/ void INT_0(void) interrupt 0 using 0 {
key=translate(P2&0x0f);
if(key<='9'&&key>='0') //判断按下的键是否为数值 {
num=num*10+(key-'0'); if (operators>0) { y=num; iny=1; } else x=num;
if(num<134217728&&num>-134217728) //当前数值是否超出限定范围 {
display(num); } else
dataoverflow(); } else {
- 19 -
基于单片机控制的简单计算器设计与仿真
switch(key) { case 'c': x=0; y=0; num=0; iny=0; operators=0; display(num); break; case '=':
arithmetic(); iny=0; operators=0; num=0;
break;
case '+':
if (operators) arithmetic(); operators=1; num=0;
break;
case '-':
if (operators) arithmetic(); operators=2; num=0;
break;
case '*':
if (operators) arithmetic(); operators=3;
num=0;
- 20 -
} }
break; if (operators) arithmetic(); operators=4; num=0; break;
case '/':
}
(2)算术运算程序设计:
/**********算术运算函数*************/ void arithmetic() { if (iny) {
switch(operators) { case 1: x=x+y; num=x;
if(num<134217728&&num>-134217728) {
display(num); } else
dataoverflow(); break; case 2: x=x-y; num=x;
if(num<134217728&&num>-134217728) {
- 21 -