STC89c52单片机计算器C语言程序.docxVIP

  • 0
  • 0
  • 约2.52千字
  • 约 8页
  • 2026-01-29 发布于山东
  • 举报

STC89c52单片机计算器C语言程序

c

//执行运算

voidcalculate(void)

{

overflow_flag=0;

div_zero_flag=0;

switch(operator)

{

case+:result_num=first_num+second_num;break;

case-:result_num=first_num-second_num;break;

case*:result_num=first_num*second_num;break;

case/:

if(second_num==0)

{

div_zero_flag=1;

}

else

{

result_num=first_num/second_num;//整数除法

}

break;

default:break;

}

//此处可根据实际情况添加溢出判断逻辑

}

//按键处理与状态机管理

voidkey_process(void)

{

if(new_key_flag)

{

new_key_flag=0;

if(key_value==C)//清除

{

first_num=0;

second_num=0;

result_num=0;

operator=0;

state=STATE_FIRST_NUM;

lcd_clear();

lcd_show_string(0,0,Clear);

delay_ms(500);

lcd_clear();

return;

}

switch(state)

{

caseSTATE_FIRST_NUM:

if(key_value=0key_value=9)//数字键

{

first_num=first_num*10+(key_value-0);

lcd_clear();

lcd_show_num(0,0,first_num);

}

elseif(key_value==+||key_value==-||key_value==*||key_value==/)//运算符

{

operator=key_value;

state=STATE_OPERATOR;

lcd_show_string(10,0,operator);//在第一行末尾显示运算符

}

break;

caseSTATE_OPERATOR:

if(key_value=0key_value=9)//数字键

{

second_num=second_num*10+(key_value-0);

lcd_show_num(0,1,second_num);//第二行显示第二个数

state=STATE_SECOND_NUM;

}

elseif(key_value==C)

{

//已在前面处理

}

//忽略其他键或提示错误

break;

caseSTATE_SECOND_NUM:

if(key_value=0key_value=9)//数字键

{

second_num=second_num*10+(key_value-0);

lcd_clear();

lcd_show_num(0,0,first_num);

lcd_show_string(10,0,operator);

lcd_show_num(0,1,second_num);

}

elseif(key_value===)//等号,执行运算

{

calculate();

state=STATE_RESULT;

lcd_clear();

lcd_show_num(0,0,first_num);

lcd_show_string(10,0,operator);

lcd_show_num(0,1,second_num);

lcd_show_string(10,1,=);

if(div_zero_flag)

{

lcd_show_string(12,1,Err);

}

elseif(overflow_flag)

{

lcd_show_string(12,1,OVF);

}

else

{

lcd_show_num(12,1,result_num);

}

}

elseif(key_value==C)

{

//已在前面处理

}

//忽略其他键或提示错误

break;

caseSTATE_RESULT:

if(key_value=0key_value=9)//输入新的第

文档评论(0)

1亿VIP精品文档

相关文档