#include "reg51.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef unsigned char uint8;
typedef int uint16;
#define over_result_h 10000
#define over_result_l -10000
#define key P1
#define key2 P3//...............新按鈕加p3口
sbit beep=P2^3;
sbit rw=P2^1;
sbit rs=P2^0;
sbit e=P2^2;
sbit k1=P3^0;//...............新加P3.0按鈕鍵
uint8 flag;
uint8 flag_denghao=0;
uint8 flag_result=0;
char zifu[30];
int k=0;
long p=0;
uint8 anjian,num,i;
long jieguo=0;
//........................................//
unsigned char addflag=0,subflag=0,mulflag=0,divflag=0,changeflag=0;
long sum1=0;
//........................................//
void delay(uint16 z)
{
while(z--);
}
void delayms(uint16 x)
{
int i=0,j=0;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
//.................寫命令函數.....................
void lcdwrc(uint8 c)
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
}
//...............寫數據函數........................
void lcdwrd(uint8 dat)
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
}
//..............LCD1602初始化函數...................
void lcdinit()
{
delay(1500);
lcdwrc(0x38);//設置功能模式
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
lcdwrc(0x08);//初始地址
lcdwrc(0x01);//清屏
lcdwrc(0x06);//寫一位指針加一
lcdwrc(0x0c);// 開顯示
}
void keyscan()
{
key=0xfe;//令第一行為0,然后判斷是哪一列按下
if(key!=0xfe)
{
delay(1000);
if(key!=0xfe)
{ flag=0;
anjian=P1&0xf0;
switch(anjian)
{
case 0xe0: num=0;zifu[i]='1';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
case 0xd0: num=1;zifu[i]='2';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
case 0xb0: num=2;zifu[i]='3';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
case 0x70: num=3;zifu[i]='+';while(key!=0xfe);lcdwrd(zifu[i]);i++;break;
}
}
}
key=0xfd;//令第二行為0,判斷是哪一列按下
if(key!=0xfd)
{
delay(1000);
if(key!=0xfd)
{ flag=0;
anjian=P1&0xf0;
switch(anjian)
{
case 0xe0: num=4;zifu[i]='4';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
case 0xd0: num=5;zifu[i]='5';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
case 0xb0: num=6;zifu[i]='6';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
case 0x70: num=7;zifu[i]='-';while(key!=0xfd);lcdwrd(zifu[i]);i++;break;
}
}
}
key=0xfb;//令第三行為0,判斷哪一列按下
if(key!=0xfb);
{delay(1000);
if(key!=0xfb)
{ flag=0;
anjian=P1&0xf0;
switch(anjian)
{
case 0xe0: num=8;zifu[i]='7';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
case 0xd0: num=9;zifu[i]='8';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
case 0xb0: num=10;zifu[i]='9';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
case 0x70: num=11;zifu[i]='*';while(key!=0xfb);lcdwrd(zifu[i]);i++;break;
}
}
}
key=0xf7;//令第四行為0,判斷哪一列按下
if(key!=0xf7)
{
delay(1000);
if(key!=0x07)
{ flag=1;
anjian=P1&0xf0;
switch(anjian)
{
case 0xe0:num=12;zifu[i]='0';while(key!=0xf7);lcdwrd(zifu[i]);i++;break;
case 0xd0:num=13;while(key!=0xf7);memset(zifu,0,sizeof(zifu));i=0;lcdwrc(0x01);flag_denghao=0;break;
case 0xb0:num=14;zifu[i]='=';while(key!=0xf7);
// lcdwrd(zifu[i]);
i++;
zifu[i]='\0';break;
case 0x70:num=15;zifu[i]='/';while(key!=0xf7);lcdwrd(zifu[i]);i++;break;
}
}
}
//..............十進制轉二進制..............
P3=0x01;
key2=P3; //原始P3.0=0x01
if(key2=0x00)//是否已按下
{
delay(500);// 消抖延時
if(key2=0x00)//是否抖動
{ flag=0;
anjian=key2&0x00;
switch(anjian)
{
case 0x00:num=16;while(key2=0x01);break;//case按鍵值=P3口的電位信息,在此處P3.0口被按下后(沒按前P3.0=1,P3=0x01),P3.0=0,P3=0x00
}
}
}
}
//..............十進制轉二進制..............
void zhuanhuan()
{
changeflag++;
subflag=mulflag=divflag=addflag=0;
}
//........................................//
long caculate(uint8* zifu)
{
uint8 lable[10]={0};
long int num[10];
uint16 len=strlen(zifu);
uint8 cnt=0;
uint8 index=0;
long int tmp;
long int result;
int t,y,m;
for(y=len-1;y>=0;y--)//錯誤使用
{
if( ( zifu[len-2]>0x39||zifu[len-2]<0x30 )//最后一位為符號位
|| ( zifu[0]>0x39||zifu[0]<0x30 )//第一位為符號位
|| ( ( zifu[y]>0x39||zifu[y]<0x30)&&( zifu[y-1]>0x39||zifu[y-1]<0x30) )//連續兩個符號
|| ( zifu[y]=='0'&& zifu[y-1]=='/')
)
{
if ( (zifu[0]=='+') || (zifu[0]=='-') )
flag_result=0;
else
flag_result=1;
break;
}
else
{
flag_result=0;
}
}
for(k=0;k<len;k++)
{
if(zifu[k]>0x39||zifu[k]<0x30)
{
lable[cnt]=zifu[k];
zifu[k]='\0';
num[cnt]=atol(zifu+index);
cnt++;
index=k+1;
}
}
num[cnt++]=atol(zifu+index);
for(k=0;k<=len-1;k++)
{
if(lable[k]=='*'||lable[k]=='/')//判斷加減乘除優先級
{
if(lable[k]=='*')
tmp=num[k]*num[k+1];
else if(lable[k]=='/')
tmp=num[k]/num[k+1];
lable[k]='%';
num[k+1]=tmp;
num[k]=0;
}
}
for(k=0;k<=len-1;k++)
{
if(lable[k]=='%')//判斷加減乘除優先級
{
m=k;//記錄下第一個%位置
while(lable[k]=='%')
{
lable[k]='+';
k++;
num[m]=num[m]+num[k];
}
num[k]=0;
}
}
result=num[0];
// lcdwrc(0x45+0x80);
// lcdwrc(0x04);
// m=0;
// while(lable[m]!=0)
// {lcdwrd(lable[m]);
// m++;
// }
for(t=0;t<len-1;t++)
{
if(lable[t]=='+')
{
result+=num[t+1];
}
if( lable[t]=='-')
{
result-=num[t+1];
}
}
return result;
}
void display(long jieguo)
{
p=jieguo;
if(p==0)
lcdwrd('0');
if(p<0)
jieguo=-jieguo;
while(jieguo!=0)
{lcdwrd(0x30+jieguo%10);
jieguo=jieguo/10;
}
if(p<0)
lcdwrd('-');//如果為負數,顯示負號
//memset(zifu,0,sizeof(zifu));
//i=0;
flag_denghao=1;
//........................................//
if(changeflag) //十進制轉換二進制
{
lcdwrc(0X4f+0x80);//從第二行最末向前顯示
lcdwrc(0x04);//指針光標自動減1 整屏不移動
while(sum1!=0)
{
lcdwrd(0x30+sum1%2);
sum1/=2;
}
lcdwrd('=');
changeflag=0;
}
//........................................//
}
void main()
{
beep=0;
lcdinit();
while(1)
{
while(flag_denghao)
{keyscan();}
{
keyscan();
}
if(anjian==0xb0&&flag==1)
{
jieguo=caculate(zifu);
lcdwrc(0x4f+0x80);
lcdwrc(0x04);
if(flag_result==0)//
{
if(( jieguo>100000000 )||(jieguo<-100000000))//高溢出 100000000 9個位
{
lcdwrc(0x45+0x80);
lcdwrd('r');
lcdwrd('e');
lcdwrd('v');
lcdwrd('o');
beep=1;
delayms(1000);
beep=0;
}
else
{
display(jieguo);
}
}
else
{
lcdwrc(0x45+0x80);
lcdwrd('r');
lcdwrd('o');
lcdwrd('r');
lcdwrd('r');
lcdwrd('e');
beep=1;
delayms(1000);
beep=0;
}
flag=0;
}
}
}
|