?? text1.c
字號(hào):
#include <reg51.h>
#include<math.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dc=0xa0; /*P2.0 LCD的RS 21*/
sbit rw=0xa1; /*P2.1 LCD的R/W 22*/
sbit cs=0xa4; /*P2.4 LCD的E 25*/
sfr lcdbus=0x80; /*p0 LCD數(shù)據(jù) D0=P0.0*/
void soft_nop(){}
void lcd_wr(char a);
void lcd_wrdata(uchar a);
void lcd_init(void);
void lcd_cls(void);
void soft_10ms()/***********12MHZ提供10MS軟件延時(shí)************/
{ register int i;
for(i=0;i<711;i++);
}
void soft_20ms()/***********12MHZ提供20MS軟件延時(shí)************/
{ soft_10ms();
soft_10ms();
}
uchar keyscan( )
{uchar rcode , lcode;
uint i;
P1=0xf0;
if((P1 & 0xf0)!=0xf0)
{for(i=1;i<16;i++)
soft_20ms();
if((P1 & 0xf0)!=0xf0)
{rcode = 0xfe;
while((rcode & 0x10)!=0)
{P1 = rcode;
if((P1 & 0xf0)!=0xf0)
{lcode = (P1 & 0xf0);
rcode = (rcode & 0x0f);
return(rcode + lcode);
}
else
rcode = (rcode<<1)|0x01;
}
}
}
return(0);
}
uchar data lcdcounter;
bit lcdusing1,lcdusing2;
bit lcd_checkbusy()/*檢查L(zhǎng)CD忙*/
{ register lcdstate;
dc=0; /*dc=1為數(shù)據(jù),=0為命令.*/
rw=1; /*rw=1為讀,=0為寫.*/
cs=1; /*cs=1選通.*/
soft_nop();
lcdstate=lcdbus;
cs=0;
return((bit)(lcdstate&0x80));
}
void lcd_string(char *strpoint) /*在當(dāng)前顯示位置顯示LCD字符串*/
{ register i=0;
while(strpoint[i]!=0){
lcd_wrdata(strpoint[i]);
i++;
}
}
void lcd_wrcmd(uchar lcdcmd) /*寫LCD命令*/
{ lcdusing1=1;
while(lcd_checkbusy());
lcdbus=lcdcmd;
dc=0; /*dc=1為數(shù)據(jù),=0為命令.*/
rw=0; /*rw=1為讀,=0為寫.*/
cs=1; /*cs=1選通.*/
soft_nop();
cs=0;
lcdbus=0xff;
lcdusing1=0;
}
void lcd_wrdata(uchar lcddata) /*在當(dāng)前顯示位置顯示數(shù)據(jù)*/
{ //char i;
lcdusing2=1;
//while(lcd_checkbusy());
if(lcdcounter==8){
// lcd_moveto(20);
lcd_wrcmd(0xC0);
while(lcd_checkbusy());
}
if(lcdcounter==16){
// lcd_moveto(0);
lcd_wrcmd(0x80);
while(lcd_checkbusy());
lcdcounter=0;
} /*為通用而如此*/
lcdcounter++;
lcdbus=lcddata;
dc=1; /*dc=1為數(shù)據(jù),=0為命令.*/
rw=0; /*rw=1為讀,=0為寫.*/
cs=1; /*cs=1選通.*/
soft_nop();
cs=0;
lcdbus=0xff;
lcdusing2=0;
}
void calc( float* a,int k)
{ long int out,i=0,out3;
float out1,out2;
switch(k)
{
case 0:out1=a[0];break;
case 1:out1=a[0]+a[1];break;
case 2:out1=a[0]-a[1];break;
case 3:out1=a[0]*a[1];break;
case 4:out1=a[0]/a[1];break;
default:break;
}
if(k==4&&a[1]==0)
{
lcd_string("error!");
}
else
{out=(long int)out1;
if(out<0)
{lcd_wrdata('-');out=abs(out);}
if(out/10000)
{lcd_wrdata(out/10000+'0');i++;}
if(out%10000/1000)
{lcd_wrdata(out%10000/1000+'0');i++;}
else if(i!=0)
lcd_wrdata('0');
if(out%1000/100)
{lcd_wrdata(out%1000/100+'0');i++;}
else if(i!=0)
lcd_wrdata('0');
if(out%100/10)
lcd_wrdata(out%100/10+'0');
else if
(i!=0)lcd_wrdata('0');
lcd_wrdata(out%10+'0');
i=0;
if((out2=out1-out)>=0.001)
{lcd_wrdata('.');
out3=(int)(out2*1000);
lcd_wrdata(out3%1000/100+'0');
lcd_wrdata(out3%100/10+'0');
lcd_wrdata(out3%10+'0');
}
}
}
void lcd_init()/*初始化*/
{ lcd_wrcmd(0x38); /*設(shè)置8位格式,2行,5*7*/
lcd_wrcmd(0x0c); /*整體顯示,關(guān)光標(biāo),不閃爍*/
lcd_wrcmd(0x06); /*設(shè)定輸入方式,增量不移位*/
//lcd_wrcmd(0x01); /*清除顯示*/
lcdcounter=0;
}
void lcd_cls()/*清除顯示*/
{ lcd_wrcmd(0x01);
lcdcounter=0;
}
void main(void)
{uchar key;
int j=0,k=0;
float a[2]={0,0};
lcd_init();
while(1)
{
key = keyscan();
switch(key)
{
case 0x7e:lcd_wrdata('0');a[j]=a[j]*10+0;break;
case 0xbe:lcd_wrdata('1');a[j]=a[j]*10+1;break;
case 0xde:lcd_wrdata('2');a[j]=a[j]*10+2;break;
case 0xee:lcd_wrdata('3');a[j]=a[j]*10+3;break;
case 0x7d:lcd_wrdata('4');a[j]=a[j]*10+4;break;
case 0xbd:lcd_wrdata('5');a[j]=a[j]*10+5;break;
case 0xdd:lcd_wrdata('6');a[j]=a[j]*10+6;break;
case 0xed:lcd_wrdata('7');a[j]=a[j]*10+7;break;
case 0x7b:lcd_wrdata('8');a[j]=a[j]*10+8;break;
case 0xbb:lcd_wrdata('9');a[j]=a[j]*10+9;break;
case 0xdb:lcd_wrdata('+');k=1;j=1;break;
case 0xeb:lcd_wrdata('-');k=2;j=1;break;
case 0x77:lcd_wrdata('*');k=3;j=1;break;
case 0xb7:lcd_wrdata('/');k=4;j=1;break;
case 0xd7:lcd_wrdata('=');calc(a,k);a[0]=0;a[1]=0;j=0,k=0;break;
case 0xe7:lcd_cls();break;
default :break;
}
soft_20ms();
soft_20ms();
soft_20ms();
soft_20ms();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -