#include "keycode.h"
#define Key_Net P3
#define uchar unsigned char
uchar code number[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2f-0x30 };
uchar value;
uchar fuhao,TABE; //fuhao 儲存+,-,*,/,clr,= ;TABE 標識 1是符0是數(shù)字,Table_A,Table_B 儲存輸入的兩個數(shù)字
float Table_A,Table_B;
long SUM,YU;
void delay10ms() //誤差 0us
{
unsigned char a,b,c;
for(c=5;c>0;c--)
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void Init() //main中用到的初始化
{
fuhao=0;
TABE=0;
Table_A=0;
Table_B=0;
}
void Keydown()
{
char a,i;
i=0;
Key_Net=0x0f;
if(Key_Net!=0x0f)
{
delay10ms();
if(Key_Net!= 0x0f)
{
Key_Net=0x0f; // 行列掃描 先進行列掃描,確定是那一列按下
switch(Key_Net)
{
case(0x07) : value = 0 ;break; //第一列
case(0x0b) : value = 1 ;break; //第二列
case(0x0d) : value = 2 ;break; //第三列
case(0x0e) : value = 3 ;break; //第四列
}
Key_Net = 0xf0;
delay10ms();
switch(Key_Net) // 行列掃描 再進行行掃描,確定是那一行按下
{
case(0x70) : value = value+0 ;break; //第一行 就是0 1 2 3個按鍵按下
case(0xb0) : value = value+4 ;break; //第二行
case(0xd0) : value = value+8 ;break; //第三行
case(0xe0) : value = value+12 ;break; //第四行 這里確定的是哪一個按鍵按下,還沒對按鍵賦值
}
while((a<100)&&(Key_Net!=0xf0))
{
delay10ms();
a++;
}
a=0;
}
if((0<=value)&&(value<=2)||(4<=value)&&(value<=6)||(8<=value)&&(value<=10)||value==12) //根據(jù)自己的鍵盤設(shè)計的數(shù)據(jù)這一條語句 對應(yīng)的是0-9這幾個數(shù)子對應(yīng)的按鍵
{
TABE=0;
if(fuhao==0)
{
Table_A=Table_A*10+number[value]; //按下一位儲存在個位,再按下一位原來的數(shù)*10加上剛按下的值
}
if((fuhao>0))
{
Table_B=Table_B*10+number[value]; //當有符號位按下后面的值儲存在Table_B中
}
lcd1602_write_data(0x30+number[value]); //顯示0-9中按下的值
}
if(value==3) // 也就是數(shù)組number中的第三位 鍵盤按下+ 都可以寫成SWITCH語句
{
TABE=1;
fuhao=1; // +號標志
lcd1602_write_data(0x30+number[value]); //顯示+號 value==3 就是數(shù)組中的 0x2b-0x30 在LCD中0x2b就是+號
}
if(value==7) // 也就是數(shù)組number中的第7位 鍵盤按下-
{
TABE=1;
fuhao=2; // -號標志
lcd1602_write_data(0x30+number[value]); //同理顯示-號
}
if(value==11) // 也就是數(shù)組number中的第11位 鍵盤按下*
{
TABE=1;
fuhao=3; // *號標志
lcd1602_write_data(0x30+number[value]); //同理顯示*號
}
if(value==15) // 鍵盤按下/
{
TABE=1;
fuhao=4; // /號標志
lcd1602_write_data(0x30+number[value]); //同理顯示/號
}
if(value==13) // 鍵盤按下CLR
{
TABE=1;
fuhao=5; // CLR標志
lcd1602_write_cmd(0x30+number[value]);
fuhao=0;
TABE=0;
Table_A=0;
Table_B=0;
}
if(value==14) // 鍵盤按下= 下面直接對各種特殊符號對應(yīng)的情況進行處理
{
if(fuhao==1) //加法
{
SUM=Table_A+Table_B; //計算SUM
lcd1602_write_cmd(0Xcf); //從第二行最右邊開始顯示
lcd1602_write_cmd(0X04); //控制指針左移
while(SUM!=0) //一位一位顯示 先從num的最低位開始
{
lcd1602_write_data(0x30+SUM%10); //num的最后一位在0x4f的位置也就是最右邊
SUM=SUM/10; //再取一位的結(jié)果數(shù)據(jù)
}
lcd1602_write_data(0x3d); //寫等于號
}
if(fuhao==2) //減法
{
if(Table_A>Table_B) //先判斷A B大小
{
SUM=Table_A - Table_B;
}
else
{
SUM=Table_B - Table_A;
}
lcd1602_write_cmd(0Xcf); //從第二行最右邊開始顯示
lcd1602_write_cmd(0X04); //控制指針左移
while(SUM!=0) //一位一位顯示 先從num的最低位開始
{
lcd1602_write_data(0x30+SUM%10); //顯示結(jié)果的最后一位在0x4f的位置
SUM=SUM/10; //取前面的結(jié)果數(shù)據(jù)
}
if(Table_A < Table_B) //如果A<B 在結(jié)果顯示完后需要給一個負號
{
lcd1602_write_data(0x2d); //lcd顯示負號
}
lcd1602_write_data(0x3d); //寫等于號
}
if(fuhao==3) //乘法
{
SUM=(Table_A)*(Table_B);
lcd1602_write_cmd(0Xcf); //第二行最后一位顯示
lcd1602_write_cmd(0X04); //指針左移
while(SUM!=0) //一位一位顯示
{
lcd1602_write_data(0x30+SUM%10); //顯示結(jié)果的最后一位在0x4f的位置
SUM=SUM/10; //取前面的結(jié)果數(shù)據(jù)
}
lcd1602_write_data(0x3d); //寫等于號
}
if(fuhao==4) //除法 重點!
{
uchar i;
SUM=((Table_A/Table_B)*1000); //sum放大1000倍 例如 sum=42/2689=0.01561919 放大1000倍 sum=15
lcd1602_write_cmd(0Xcf); //lcd從第二行最后一位顯示
lcd1602_write_cmd(0X04); //指針左移
if((Table_A < Table_B)&&SUM<100) //當兩個數(shù)的值相差不到前面的數(shù)字的100倍
//例如 42和2689 2689<4200 計算器可以算出準確結(jié)果 也可以試著自己直接改一改
{
while(SUM!=0) //一位一位顯示 例如 sum=42/2689=0.01561919 放大1000倍 sum=15
{
i++;
lcd1602_write_data(0x30+SUM%10); //顯示結(jié)果的最后一位在0x4f的位置
SUM=SUM/10; //SUM取余
if(i==2) //此時已經(jīng)輸出了15這兩個數(shù)字 正確的值為0.01561919
{
lcd1602_write_data(0x30); //寫一個0
lcd1602_write_data(0x2e); //寫小數(shù)點
i=0;
}
}
}
if(Table_A < Table_B)
{
lcd1602_write_data(0x30); //上面寫完小數(shù)點再寫一個0 輸出0.015
}
if((Table_A > Table_B)) //A>B就沒有那么多事情了 例如1589/33=48.1515 sum放大1000倍 sum=48151
{
while(SUM!=0) //SUM*1000是保留三位小數(shù)
{
i++;
lcd1602_write_data(0x30+SUM%10); //顯示結(jié)果的最后一位在0x4f的位置
SUM=SUM/10;
if(i==3) //i=3的時候就該輸出小數(shù)點了 因為小數(shù)部分已經(jīng)輸出完畢
{
lcd1602_write_data(0x2e); //輸出小數(shù)點
}
}
}
if(Table_A < Table_B)
{
lcd1602_write_data(0x30); //上
}
lcd1602_write_data(0x3d); //最后寫等于號
}
}
}
}
這是原程序 |