#include <reg52.h>
#include<math.h>
#include<key.h>
#define uchar unsigned char
#define uint unsigned int
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLR 0x01
#define BUSY 0x80 //LCD Busy Tag
#define LCDIO P1
sbit LCD1602_RS=P3^5; //Data Command Pin 1 data 0 command pin 4
sbit LCD1602_RW=P3^4; //Read Write Pin 1 read 0 write pin 5
sbit LCD1602_EN=P3^7; //LCD Enable Signal pin 6
/****************************************************************/
void LCD_command(unsigned char command,unsigned char BusyC); //write command function
void LCD_data(unsigned char temp,unsigned char BusyC); //write data function
void LCD_set_xy( unsigned char x, unsigned char y ); //set display address function
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd a character function
void LCD_init(void); //lcd initize function
uchar flag=1,pfu=0,fu=0,position1=0,position2=0,kind=0,yes=0,yes1=0,flag1=0,dian1=0,dian2=0,k=0,kind1,yym=1,kind2=0;
unsigned long xdata data1=0,data2=0,data3=0,ddata=0;
double dd1,dd2,dd3,dda;
uchar key11=0x99;
uchar rrr=0xff;
uchar t=0;
unsigned char ReadStatus(void);
void delay_400ms(void); //delay function
uchar xdata alldata[15]={0};
uchar xdata love[13]={0};
void prodis(void);
unsigned long shi(uchar n);
void dy(void);
void xianshi(void);
void xiaoshu(void);
void remove0(void);
void remove1(void);
void error(void);
uchar xdata tab_num[]="0123456789. ";
/********************************************************************/
void main(void)
{uint key;
uint t=0;
LCD_init();
while(1)
{
key=kbscan();
switch(key)
{
case 0xee: key11=0x00;break; // 1110 1110
case 0xde: key11=0x01;break; // 1101 1110
case 0xbe: key11=0x02;break; // 1011 1110
case 0x7e: key11=0x03;break; // 0111 1110
case 0xed: key11=0x04;break; // 1110 1101
case 0xdd: key11=0x05;break; // 1101 1101
case 0xbd: key11=0x06;break; // 1011 1101
case 0x7d: key11=0x07;break; // 0111 1101
case 0xeb: key11=0x08;break; // 1110 1011
case 0xdb: key11=0x09;break; // 1101 1011
case 0xbb: key11=0x10;break; // 1011 1011
case 0x7b: key11=0x11;break; // 0111 1011
case 0xe7: key11=0x12;break; // 1110 0111
case 0xd7: key11=0x13;break; // 1101 0111
case 0xb7: key11=0x14;break; // 1011 0111
case 0x77: key11=0x15;break; // 0111 0111
default: break;
}
prodis();
if(key11==0x01){LCD_write_char(rrr,LINE1,tab_num[0]);alldata[rrr]=0;key11=0x99;}
if(key11==0x04){LCD_write_char(rrr,LINE1,tab_num[1]);alldata[rrr]=1;key11=0x99;}
if(key11==0x05){LCD_write_char(rrr,LINE1,tab_num[2]);alldata[rrr]=2;key11=0x99;}
if(key11==0x06){LCD_write_char(rrr,LINE1,tab_num[3]);alldata[rrr]=3;key11=0x99;}
if(key11==0x08){LCD_write_char(rrr,LINE1,tab_num[4]);alldata[rrr]=4;key11=0x99;}
if(key11==0x09){LCD_write_char(rrr,LINE1,tab_num[5]);alldata[rrr]=5;key11=0x99;}
if(key11==0x10){LCD_write_char(rrr,LINE1,tab_num[6]);alldata[rrr]=6;key11=0x99;}
if(key11==0x12){LCD_write_char(rrr,LINE1,tab_num[7]);alldata[rrr]=7;key11=0x99;}
if(key11==0x13){LCD_write_char(rrr,LINE1,tab_num[8]);alldata[rrr]=8;key11=0x99;}
if(key11==0x14){LCD_write_char(rrr,LINE1,tab_num[9]);alldata[rrr]=9;key11=0x99;}
if(key11==0x00){LCD_write_char(rrr,LINE1,0x2e);alldata[rrr]=0x2e;yym=0;key11=0x99;}
if(key11==0x03){LCD_write_char(rrr,LINE1,0x2b);position1=rrr;kind1=1;kind=1;key11=0x99;}
if(key11==0x07){LCD_write_char(rrr,LINE1,0x2d);position1=rrr;kind1=2;kind=2;key11=0x99;}
if(key11==0x11){LCD_write_char(rrr,LINE1,0x2a);position1=rrr;kind1=3;kind=3;key11=0x99;}
if(key11==0x15){LCD_write_char(rrr,LINE1,0x2f);position1=rrr;kind1=4;kind=4;kind2=4;key11=0x99;}
if(key11==0x02){LCD_write_char(rrr,LINE1,0x3d);position2=rrr;if(yym==0){xiaoshu();}else{dy();}if(yes==1||yes1==1){error();}else{xianshi();}if(flag1==1){remove1();}else{remove0();}key11=0x99;}
delay_400ms();delay_400ms();
}
}
//
void LCD_command(unsigned char command,unsigned char BusyC)//写指令
{
if (BusyC) ReadStatus(); //Test it busy or not
LCDIO=command;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=0;
LCD1602_EN=1;
}
//
//
//
void LCD_data(unsigned char dat,unsigned char BusyC)//写数据
{
if (BusyC) ReadStatus(); //Test it busy or not
LCDIO=dat;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=0;
LCD1602_EN=1;
}
void LCD_set_xy( unsigned char x, unsigned char y )//显示位置
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_command(address,1);
}
//
//
//
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_data(dat,1);
}
//
//
void LCD_init(void)
{
delay_400ms();
LCD_command(CLR,0);//clear screen
LCD_command(DATA_MODE,1);//set 8 bit data transmission mode
LCD_command(OPEN_SCREEN,1);//open display (enable lcd display)
LCD_command(DISPLAY_ADDRESS,1);//set lcd first display address
LCD_command(CLR,1);
//clear screen
}
//
//
void delay_400ms(void)
{
unsigned char i = 5;
unsigned int j;
while(i--){
j=7269;
while(j--);
};
}
//
//
unsigned char ReadStatus(void)//读状态
{
LCDIO = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_EN = 0;
LCD1602_EN = 0;
LCD1602_EN = 1;
while (LCDIO & BUSY); //Test Busy State
return(LCDIO);
}
void prodis(void)
{if((P2&0xf0)!=0xf0)
{delays(); //延时去抖动(10ms)
if((P2&0xf0)!=0xf0) //再次判断列中是否是干扰信号,不是则向下执行
{
rrr++;
if(rrr==15)
{rrr=15;}
}
}
}
void dy(void)
{uchar k;
if((position1==0) || (position2==(position1+1)))
yes=1;
else
{
for(k=0;k<position1;k++)
{
ddata=shi(position1-1-k);
data1=data1+(alldata[k])*ddata;
}
for(k=position1+1;k<position2;k++)
{
ddata=shi(position2-1-k);
data2=data2+(alldata[k])*ddata;
}
}
if(kind==1){data3=data1+data2;}
if(kind==2){if(data1<data2){ddata=data1;data1=data2;data2=ddata;fu=1;data3=data1-data2;}else data3=data1-data2;}
if(kind==3){data3=data1*data2;if(data1>65535||data2>65535){yes=1;}}
if(kind==4){data3=data1/data2;flag1=1;}
love[0]=data3 / 1000000000;
love[1]=data3 % 1000000000/100000000;
love[2]=data3 % 100000000/10000000;
love[3]=data3 % 10000000/1000000;
love[4]=data3 % 1000000/100000;
love[5]=data3 % 100000/10000;
love[6]=(data3 % 10000)/1000;
love[7]=(data3 % 1000)/100;
love[8]=(data3 % 100)/10;
love[9]= data3 % 10;
if(kind==4)
{
love[10]=10;
love[11]=((data1 % data2)*10)/data2;
love[12]=((((data1 % data2)*10)%data2)*10)/data2;
love[13]=((((((data1 % data2)*10)%data2)*10)%data2)*10)/data2;
}
}
void xiaoshu(void)
{uchar k,t=0;
int i;
position1=position1-1;
position2=position2-1;
for(k=0;k<position1;k++)
{
if(alldata[k]==0x2e)
{dian1=k;
for(i=k;i<position1;i++)
{alldata[i]=alldata[i+1];}
}
}
if(dian1!=0)
{
for(k=0;k<position1;k++)
{
ddata=shi(position1-1-k);
data1=data1+(alldata[k])*ddata;
}
ddata=shi(position1-dian1);
dd1=( double )data1/ddata;
}
if(dian1==0){
for(k=0;k<position1+1;k++)
{
ddata=shi(position1-k);
data1=data1+(alldata[k])*ddata;
}
dd1=(double)data1;}
for(k=position1+1;k<position2;k++)
{
if(alldata[k]==0x2e){
dian2=k;
for(i=k;i<position2;i++)
{alldata[i]=alldata[i+1];}
}
}
if(dian2!=0)
{
for(k=position1+1;k<position2;k++)
{
ddata=shi(position2-1-k);
data2=data2+(alldata[k])*ddata;
}
ddata=shi(position2-dian2);
dd2=( double )data2/ddata;
}
if(d
评论0