?? mian._c
字號:
/*****************************************
* 計算器程序設(shè)計 *
* 功 能:計算器 *
* 時鐘頻率:內(nèi)部1M *
* 設(shè) 計:莫錦攀 *
* 修改日期:2007年07月16日 *
* 編譯環(huán)境:ICC-AVR6.31 *
* 實(shí)驗環(huán)境:M16學(xué)習(xí)板 *
* 使用端口: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};//第一個數(shù)的顯示數(shù)組
unsigned char a2[5]={32,32,32,32,0};//第二個數(shù)的顯示數(shù)組
unsigned char result_dp[7]={32,32,32,32,32,32,0};//結(jié)果的顯示數(shù)組
int data1,data2;//兩個要運(yùn)算的數(shù)
long int result;//結(jié)果
unsigned char flag_a1=1,flag_a2=1;//兩個數(shù)的輸入完成標(biāo)志位
unsigned char key=0x00;//按鍵值
unsigned char flag_count=32;//符號存放變量
unsigned char ok=32;//等號的顯示符
unsigned char error=0;//錯誤標(biāo)志位
//----------函數(shù)聲明-------------------
void key_display(void);//按鍵顯示函數(shù)
void process_key(void);//輸入接收函數(shù)
void process_data(void);//數(shù)字處理函數(shù)
void process_count(void);//運(yùn)算函數(shù)
void process_count(void);//運(yùn)算函數(shù)
void display_result(void);//結(jié)果處理函數(shù)
//--------------------------------------
void process_key(void)//輸入接收函數(shù)
{static unsigned char i=0;
if(key>='0'&&key<='9')//如果按下的是數(shù)字鍵著存放到a1或a2數(shù)組中
{if(flag_a1==1)
{
if(a1[i]==32)a1[i]=key;//限制輸入的數(shù)字不能超過4位
i++;//i用來確定存放的位,應(yīng)為輸入是連續(xù)的所以需要靜態(tà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;}
//運(yùn)算符號記錄,按下運(yùn)算符號表示第一個數(shù)輸入完成
else if(key=='=')
{
ok='=';
if(flag_a2==1&&a2[0]==32)
{error=1;
LCD_write_string(10,1,"ERROR");
}//如果第二個數(shù)沒有輸入著輸入有錯
else
{process_data();
flag_a2=0;}//按下等于號表示第二個數(shù)輸入完成
}
else if(key=='R')i=0;//如果復(fù)位著數(shù)字位標(biāo)志也要復(fù)位
key_display();//輸入接受完畢,調(diào)用顯示函數(shù)顯示輸入值
}
void key_display(void)//按鍵顯示函數(shù)
{unsigned char i;
if(key!=0x00&&key!='R')//如果不是按下復(fù)位按鍵著顯示,沒有輸入到的地方都是空格(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')//復(fù)位按鍵
{
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)//數(shù)字處理函數(shù)
{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才是對應(yīng)的數(shù)字
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();//數(shù)據(jù)處理完畢調(diào)用運(yùn)算函數(shù)
}
void process_count(void)//運(yùn)算函數(shù)
{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();//運(yùn)算完畢調(diào)用結(jié)果處理函數(shù)
}
void display_result(void)//結(jié)果處理函數(shù)
{if(result>9999)error=1;//溢出
if(result<0&&flag_count=='-'){result_dp[0]='-';result=result*(-1);}//符號處理
if(result<0&&flag_count!='-')error=1; //只有減法有可能出現(xiàn)負(fù)數(shù)
if(flag_count=='/'&&data2==0)error=1;//除法時除數(shù)不能為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();//調(diào)用按鍵處理函數(shù)
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -