You are on page 1of 7

<REGX51.

H>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define RS P3_0
#define RW P3_1
#define EN P3_2

//RW=0 => ghi


//RW=1 => doc
//RS=0 => code
//RS=1 => data

#define LCD_PORT P0
sbit cot0=P2^0;
sbit cot1=P2^1;
sbit cot2=P2^2;
sbit cot3=P2^3;
sbit hang0=P2^4;
sbit hang1=P2^5;
sbit hang2=P2^6;
sbit hang3=P2^7;
int sttphim;
unsigned char dau;
\***************************Cac hm x? l LCD************************/
void wait(void)
{
long n = 0;
EN=1;// Dua chan cho fep len cao
RS=0;// Chon thanh ghi lenh
RW=1;// Doc tu LCD
LCD_PORT=0xFF;// Gia tri 0xFF
while(1){n++; if(n>100) break;}// Kiem tra co ban
// Neu ban dem n den 100 roi thoat khoi while
EN=0;// Dua xung cao xuong thap de chot
RW=0;// Doc tu LCD
}
void delay(long time) /* ham delay */
{
long n;
for(n=0;n<time;n++)
{;}
}
void delay_5ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
void delay_15ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
void LCDWriteCmd(unsigned char c)
{
RS=0;
RW=0;
LCD_PORT=c;
EN=1;

EN=0;
delay_5ms();
}
void LCDWriteData(unsigned char c)
{
RS=1;
RW=0;
LCD_PORT=c;
EN=1;
EN=0;
delay(1000);
}
void LCD_init()
{
delay_15ms();
LCDWriteCmd(0x30);
LCDWriteCmd(0x30);
LCDWriteCmd(0x30);
LCDWriteCmd(0x38);
LCDWriteCmd(0x0C);
// LCDWriteCmd(0x06);
LCDWriteCmd(0x01);
}

//che do 8 bit

//hien thi 2 dong


//bat con tro
//dich con tro sang ben phai
// Xoa man hinh LCD

void LCD_clear()
{
LCDWriteCmd(0x01);
}
void LCD_home()
{
LCDWriteCmd(0x80);
}

//ep con tro ve dau dong

void LCD_putstr(unsigned char *s)


{
while (*s)
{
LCDWriteData(*s);
s++;
}
}
void LCDwritei(long d)
{ unsigned int i,j;
unsigned char a[7];
a[6]=d%10;
d=d/10;
a[5]=d%10;
d=d/10;
a[4]=d%10;
d=d/10;
a[3]=d%10;// Chia lay phan du, duoc chu so hang don vi
d=d/10;// Chia lay phan nguyen, duoc nhung chu so da bo hang don vi

a[2]=d%10;// Duoc chu so hang chuc


d=d/10;// Nhung chu so da bo hang don vi va hang chuc
a[1]=d%10;// Duoc hang tram
d=d/10;// Duoc chu so da bo hang don vi, chuc, tram
a[0]=d%10;// Duoc hang ngan
for(i=0;i<7;i++)
{
if(a[i]!=0)
break;
}
for(j=i;j<7;j++)
{
LCDWriteData(48+a[j]);
}
}
/***************************Ham quet phim************************/
void quetphim()
{
int y;
P2=0x0f;
if((!cot0)|(!cot1)|(!cot2)|(!cot3))
{
for(y=0;y<5000;y++){
if(cot0==0)
//neu la hang 0
{
hang0=1;
hang1=1;
hang2=1;
hang3=1;
cot0=0;
if(!hang0) sttphim=0;
if(!hang1) sttphim=1;
if(!hang2) sttphim=2;
if(!hang3) sttphim=3;
}
else if(cot1==0)
{
hang0=1;
hang1=1;
hang2=1;
hang3=1;
cot1=0;
if(!hang0)
if(!hang1)
if(!hang2)
if(!hang3)

//neu la hang 1

sttphim=4;
sttphim=5;
sttphim=6;
sttphim=7;

}
if(cot2==0)
{
hang0=1;
hang1=1;
hang2=1;
hang3=1;
cot2=0;
if(!hang0) sttphim=8;
if(!hang1) sttphim=9;
if(!hang2) dau='+';

if(!hang3) dau='-';
}
if(cot3==0)
{
hang0=1;
hang1=1;
hang2=1;
hang3=1;
cot3=0;
if(!hang0)
if(!hang1)
if(!hang2)
if(!hang3)

dau='*';
dau='/';
dau='C';
dau='=';

}
}
}
}
/**************************Chuong trnh chnh***********************/
void main(void)
{
long fnumber;
long lnumber;
long result,sodu,dev;
unsigned char sign;
unsigned char hienthi;
int i,kt,j;
kt=0;
i=0;
LCD_init();
LCDWriteCmd(0x01);
LCDWriteCmd(0x80);
LCD_putstr("CALCULATOR VER 1");
while(1)
{
dau='w';
sttphim=10;
quetphim();
if(sttphim!=10)
{
if(kt==0){
if(i==0)
{LCD_clear();}
fnumber=fnumber*10+sttphim;
i=1;
}
else{
lnumber=lnumber*10+sttphim;
}
hienthi=sttphim+48;
LCDWriteData(hienthi);
}
else

{
switch(dau)
{
case 'C':
{
LCDWriteCmd(0x01);
break;
}
case '+':
{
LCDWriteData(dau);
kt=1;
sign='+';
break;
}
case '-':
{
LCDWriteData(dau);
kt=1;
sign='-';
break;
}
case '*':
{
LCDWriteData(dau);
kt=1;
sign='*';
break;
}
case '/' :
{
LCDWriteData(dau);
kt=1;
sign='/';
break;
}
case '=' :
{
if(sign=='+')
{
LCDWriteData(dau);
result = fnumber+lnumber;
LCDwritei(result);
kt=0;
fnumber=0;
lnumber=0;
i=0;
}
else if(sign=='-')
{

LCDWriteData(dau);
if(fnumber>lnumber)
result = fnumber-lnumber
;
else{
LCDWriteData('-');
result = lnumber-fnumber
;
}
LCDwritei(result);
kt=0;
fnumber=0;
lnumber=0;
i=0;
}
else if(sign=='*')
{
LCDWriteData(dau);
result = fnumber*lnumber;
LCDwritei(result);
kt=0;
fnumber=0;
lnumber=0;
i=0;
}
else if(sign=='/')
{
LCDWriteData(dau);
if(lnumber==0)
{
LCDWriteCmd(0x01);
LCD_putstr("ERROR");
}
else
{
result = fnumber/lnumber
;
LCDwritei(result);
sodu = fnumber%lnumber;
}
if(sodu!=0)
{
LCDWriteData(',');
for(j=0;j<5;j++)
{
dev=(sodu*10)/ln
umber;
LCDwritei(dev);
dev=(sodu*10)%ln
umber;
sodu=dev;
}
kt=0;
fnumber=0;
lnumber=0;
i=0;
}
else
{

kt=0;
fnumber=0;
lnumber=0;
i=0;
}
}
else
break;
}
default :
break;
}
}
}
}

You might also like