⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mian._c

📁 通过单片机实现计算器的功能
💻 _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 + -