#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//sbit E=P0^5;
//sbit RW=P0^6;
//sbit RS=P0^7;
sbit E=P1^4;
sbit RW=P1^5;
sbit RS=P1^6;
sbit P00=P3^2;
sbit P13=P1^3;
uint s1,s2,s3,s4,s5,s6,s7,s8;
uint count=0;
uint i=0;
uint j;
void Delay1ms(uchar m) //誤差 0us
{
uchar a,b,c;
for(c=1;c<m;c++)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
Delay1ms(1);
}
bit BusyTest(void)
{
bit result;
RS=0;//根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬件反應時間
E=0;
return result;
}
void LcdWriteData(unsigned char dat)
{
while(BusyTest()==1); //如果忙就等待
RS=1;
RW=0;
P2=dat;
Delay1ms(10);
E=1;
Delay1ms(10);
E=0;
}
void LcdWriteCom(unsigned char com)
{
while(BusyTest()==1); //如果忙就等待
RS=0;
RW=0;
P2=com;
Delay1ms(10);
E=1;
Delay1ms(10);
E=0;
}
void CSH() //LCD1602初始化
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
void lcd() //lcd1602第一行顯示
{
uint i;
uchar a[16]={"The number is : "};
CSH();
LcdWriteCom(0x00); //第二行第一個為C0;
for(i=0;i<16;i++)
{
LcdWriteData(a[i]);
}
}
void lcd2() //lcd1602第二行顯示
{
uint i;
uchar a[16]={" Beyond"};
CSH();
LcdWriteCom(0xC0); //第二行第一個為C0;
for(i=0;i<16;i++)
{
LcdWriteData(a[i]);
}
}
void int_0() interrupt 0 //設置外部中斷,記滿9999個數清零
{
if(count==9999)
{
count=0;
}
else count++;
}
void main()
{
CSH();
lcd();
while(1)
{
// if(P00==0)
// {
// Delay1ms(10);
// if(P00==0)
// j++;
// }
EX0=1; //設置外部中斷0,
IT0=1; //設置為負跳變沿檢測模式
EA=1;
j=count;
if(count==9999) //超出測量范圍顯示"ERROR"
{
LcdWriteCom(0x80+0x40+10);
LcdWriteData('B'); delay(5);
LcdWriteData('E'); delay(5);
LcdWriteData('Y'); delay(5);
LcdWriteData('O'); delay(5);
LcdWriteData('N'); delay(5);
LcdWriteData('D'); delay(5);
while(1);
}
s4=j%10000/1000;
s1=j%1000/100;
s2=j%1000%100/10;
s3=j%1000%10%10;
LcdWriteCom(0xC0+15); //第二行第一個為C0;
LcdWriteData(0x30+s3);
LcdWriteCom(0xC0+14);
LcdWriteData(0x30+s2);
LcdWriteCom(0xC0+13);
LcdWriteData(0x30+s1);
LcdWriteCom(0xC0+12);
LcdWriteData(0x30+s4);
}
}