📄 mian._c
字号:
/*****************************************
* 计算器程序设计 *
* 功 能:计算器 *
* 时钟频率:内部1M *
* 设 计:莫锦攀 *
* 修改日期:2007年07月16日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:M16学习板 *
* 使用端口:1602: PC6,PC7,PA4~PA7, *
44KEY: PB0~PB7 *
*****************************************/
#include <iom16v.h>
#include "1602.h"
#include "key.h"
unsigned char a1[5]={32,32,32,32,0};//第一个数的显示数组
unsigned char a2[5]={32,32,32,32,0};//第二个数的显示数组
unsigned char result_dp[7]={32,32,32,32,32,32,0};//结果的显示数组
int data1,data2;//两个要运算的数
long int result;//结果
unsigned char flag_a1=1,flag_a2=1;//两个数的输入完成标志位
unsigned char key=0x00;//按键值
unsigned char flag_count=32;//符号存放变量
unsigned char ok=32;//等号的显示符
unsigned char error=0;//错误标志位
//----------函数声明-------------------
void key_display(void);//按键显示函数
void process_key(void);//输入接收函数
void process_data(void);//数字处理函数
void process_count(void);//运算函数
void process_count(void);//运算函数
void display_result(void);//结果处理函数
//--------------------------------------
void process_key(void)//输入接收函数
{static unsigned char i=0;
if(key>='0'&&key<='9')//如果按下的是数字键着存放到a1或a2数组中
{if(flag_a1==1)
{
if(a1[i]==32)a1[i]=key;//限制输入的数字不能超过4位
i++;//i用来确定存放的位,应为输入是连续的所以需要静态局部变量
if(a1[3]!=32){flag_a1=0;i=0;}
}
else if(flag_a2==1&&flag_count!=32)
{
if(a2[i]==32)a2[i]=key;
i++;
if(a2[3]!=32){flag_a2=0;i=0;}
}
}
else if(key=='+'||key=='-'||key=='*'||key=='/'){flag_a1=0;flag_count=key;i=0;}
//运算符号记录,按下运算符号表示第一个数输入完成
else if(key=='=')
{
ok='=';
if(flag_a2==1&&a2[0]==32)
{error=1;
LCD_write_string(10,1,"ERROR");
}//如果第二个数没有输入着输入有错
else
{process_data();
flag_a2=0;}//按下等于号表示第二个数输入完成
}
else if(key=='R')i=0;//如果复位着数字位标志也要复位
key_display();//输入接受完毕,调用显示函数显示输入值
}
void key_display(void)//按键显示函数
{unsigned char i;
if(key!=0x00&&key!='R')//如果不是按下复位按键着显示,没有输入到的地方都是空格(ASCII=32)
{LCD_write_char(0,1,a1[0]);
LCD_write_char(1,1,a1[1]);
LCD_write_char(2,1,a1[2]);
LCD_write_char(3,1,a1[3]);
LCD_write_char(4,1,flag_count);
LCD_write_char(5,1,a2[0]);
LCD_write_char(6,1,a2[1]);
LCD_write_char(7,1,a2[2]);
LCD_write_char(8,1,a2[3]);
LCD_write_char(9,1,ok);
key=0x00;
}
if(key!=0x00&&key=='R')//复位按键
{
LCD_write_string(0,1," ");
for(i=0;i<5;i++)a1[i]=32;
for(i=0;i<5;i++)a2[i]=32;
for(i=0;i<7;i++)result_dp[i]=32;
flag_a1=1;
flag_a2=1;
key=0x00;
flag_count=32;
ok=32;
error=0;
}
}
void process_data(void)//数字处理函数
{if(a1[3]!=32){data1=(a1[0]-48)*1000+(a1[1]-48)*100+(a1[2]-48)*10+(a1[3]-48);}
else if(a1[2]!=32){data1=(a1[0]-48)*100+(a1[1]-48)*10+(a1[2]-48);}
else if(a1[1]!=32){data1=(a1[0]-48)*10+(a1[1]-48);}
else if(a1[0]!=32){data1=a1[0]-48;}
else data1=0;//ASCII-48才是对应的数字
if(a2[3]!=32){data2=(a2[0]-48)*1000+(a2[1]-48)*100+(a2[2]-48)*10+(a2[3]-48);}
else if(a2[2]!=32){data2=(a2[0]-48)*100+(a2[1]-48)*10+(a2[2]-48);}
else if(a2[1]!=32){data2=(a2[0]-48)*10+(a2[1]-48);}
else if(a2[0]!=32){data2=a2[0]-48;}
else data2=0;
process_count();//数据处理完毕调用运算函数
}
void process_count(void)//运算函数
{if(flag_count=='+')result=data1+data2;
if(flag_count=='-')result=data1-data2;
if(flag_count=='*')result=data1*data2;
if(flag_count=='/')result=data1/data2;
display_result();//运算完毕调用结果处理函数
}
void display_result(void)//结果处理函数
{if(result>9999)error=1;//溢出
if(result<0&&flag_count=='-'){result_dp[0]='-';result=result*(-1);}//符号处理
if(result<0&&flag_count!='-')error=1; //只有减法有可能出现负数
if(flag_count=='/'&&data2==0)error=1;//除法时除数不能为0
result_dp[1]=result/10000+48;//显示处理
result_dp[2]=result/1000%10+48;
result_dp[3]=result/100%10+48;
result_dp[4]=result/10%10+48;
result_dp[5]=result%10+48;
if(result_dp[1]==48)//显示修正,首位不能显示0
{result_dp[1]=32;
if(result_dp[2]==48)
{result_dp[2]=32;
if(result_dp[3]==48)
{result_dp[3]=32;
if(result_dp[4]==48)
{result_dp[4]=32;
if(result_dp[5]==48)
result_dp[5]=32;
}
}
}
}
if(error==1)//错误显示
LCD_write_string(10,1,"ERROR");
else LCD_write_string(10,1,result_dp);
}
void main(void)
{ unsigned char i;
LCD_init();//液晶初始化
LCD_write_string(1,0,"COUNTER BY MJP");//显示欢迎信息
while(1)
{key=get_key();//按键扫描
if(key!=0x00)
{
process_key();//调用按键处理函数
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -