#include<reg51.h> //包含單片機寄存器的頭文件
#define uchar unsigned char
#define uint unsigned int
#define KEY 0xff
sbit RS=P3^2; //寄存器選擇位
sbit RW=P3^3; //讀寫選擇位
sbit E=P3^4; //使能信號位
//sbit BF=P1^7; //忙碌標志位
uchar code KEY_TABLE[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};
uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};
long num1,num2,res;
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void Write_com (uchar com) //將指令或顯示地址寫入液晶顯示器 入口 com
{
RS=0; //RS和RW同時為低電平,(寫指令)
RW=0;
E=0;
delay(3);
P0=com; //將數據送入P1口
delay(3);
E=1;
delay(3);
E=0; //E先置0 E=1 -> E=0 液晶顯示器開始執行命令
}
void Write_data(uchar date) //將數據寫入液晶顯示器 入口 data
{
RS=1; //RS為高電平,RW為低電平,(寫數據)
RW=0;
E=0;
P0=date; //數據送入P1口,將數據寫入液晶顯示器
delay(3);
E=1;
delay(3);
E=0; //E先置0 E=1 -> E=0 液晶顯示器開始執行命令
}
void LCDinit(void) //對LCD進行初始化
{
delay(10); //首次寫指令給LCD一段反應時間
Write_com(0x38); //顯示模式設置
delay(3);
Write_com(0x0e); //顯示模式設置:顯示開,有光標,光標不閃爍 P157
delay(3);
Write_com(0x06); //顯示模式設置:光標右移,字符不移
delay(3);
Write_com(0x01); //清屏幕指令
delay(3);
Write_com(0x80+0x00);
delay(3);
}
uchar keyscan() //鍵盤掃描,返回掃描值
{
uchar temp1,temp2,key;
P2=0xf0; //置行為0,列為1
if(P2!=0xf0) //有無按鍵被按下
{
delay(10);
if(P2!=0xf0) //語句仍為真 則有按鍵被按下
{
temp1=P2; //讀入列值
P2=0x0f; //列 0, 行 1
delay(3);
temp2=P2; //讀入行值
key=temp1|temp2;
while(P2!=0x0f);
return key;
}
}
return KEY;
}
uchar key_IN() //對鍵盤掃描值譯碼并顯示
{
uchar i,key;
key=keyscan();
if(key!=KEY) //確定讀入的按鍵值
{
switch(key)
{
case 0x7e:Write_data('+');return '+';
case 0x7d:Write_data('-');return '-';
case 0x7b:Write_data('*');return '*';
case 0x77:Write_data('/');return '/';
case 0xd7:Write_com(0x80+0x40); Write_data('=');return '=';
case 0xe7:Write_com(0x01); num1=0;num2=0;break; //清零
default:
break;
}
for(i=0;i<10;i++)
{
if(key==KEY_TABLE[i]) //確定讀入的按鍵值
{
Write_data(num[i]);
return i;
}
}
}
return KEY;
}
void count() //對計算進行處理,并顯示計算結果
{
uchar key,i=0,a[9];
long num0;
key=key_IN();
if((key=='+')||(key=='-')||(key=='*')||(key=='/'))
{
num2=num1; // num1=50 num2=50 num1=0 輸入了50
num1=0;
res=key;
}
if(key<10)
{
num1=num1*10+key; //num1=2 num1=2*10+0= 20
}
if(key=='=')
{
Write_com(0x80+0x41);
switch(res) //對算法進行處理
{
case '+':num0=num1+num2; break;
case '-':
if(num2>num1)
num0=(num2-num1);
if(num2<num1)
{
Write_data('-');
num0=num1-num2;
}
break;
case '*':num0=(num1*num2);break;
case '/':
if(num1>0)
num0=(num2/num1);
else
Write_data('0');
break;
default:num0=0;
break;
}
/////顯示計算結果
if(0==num0)
{
if(0!=res)
Write_data('0');
}
while(num0>0)
{
i++;
a[i]=num0%10;
num0=num0/10;
}
for(;i>0;i--)
{
Write_data(num[a[i]]);
}
num1=0;num2=0;res=0;
}
}
void main(void) //主函數
{
num1=0;num2=0;
LCDinit(); //調用LCD初始化函數
Write_com(0x00);
while(1)
{
count();
}
}
|