#include "reg51.h"
#include <absacc.h>
#include<intrins.h>
#define ulong unsigned long
#define uchar unsigned char
#define uint unsigned int
#define COM 0 //定义命令为0
#define DATA 1
#define LINE1 0x80
#define LINE2 0xC0 //定义数据为1
sbit LCD_E=P2^7;
sbit LCD_RS=P2^5;
sbit LCD_RW=P2^6;
long int n;
long int gw,sw,bw,qw,ww,qww;
char LCD_READ(void); //读LCD状态
void LCD_CSH(void); //LCD模块初始化
void LCD_BUSY(void); //检测LCD是否忙
void LCD_WRITE(char R1,char FLAG);
void LCD_WRITE_4(char R1,char FLAG);
void DELAY(uint z); //延时(n×10)us
void DELAY_US(char n); //延时(n)ms
void inter0() interrupt 0
{
TH0 = 0;
TL0 = 0;
}
void main()
{ LCD_CSH();
EA=1;
EX0=1;
IT0=1;
TMOD = 0X05;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(1)
{
n=TH0*256+TL0;
gw=n%10;
sw=n%100/10;
bw=n%1000/100;
qw=n%10000/1000;
ww=n%100000/10000;
qww=n%1000000/100000;
LCD_WRITE(LINE1+0,COM);
LCD_WRITE(0x30+qww,DATA);
LCD_WRITE(0x30+ww,DATA);
LCD_WRITE(0x30+qw,DATA);
LCD_WRITE(0x30+bw,DATA);
LCD_WRITE(0x30+sw,DATA);
LCD_WRITE(0x30+gw,DATA);
}
}
//LCD模块初始化
void LCD_CSH(void)
{
DELAY(20); //延时20ms
LCD_WRITE_4(0x03,COM); //发送控制序列
DELAY(5); //延时1ms
LCD_WRITE_4(0x03,COM); //发送控制序列
DELAY_US(50); //延时100us
LCD_WRITE_4(0x03,COM); //发送控制序列
DELAY_US(50); //延时100us
LCD_WRITE_4(0x2,COM); //4位数据格式
LCD_BUSY(); //LCD忙检测
LCD_WRITE(0x28,COM); //4位数据格式,4行,5×7点阵
LCD_WRITE(0x0C,COM); //D(d2)=1:打开显示,C(d1)=1:光标打开,B(d0)=1:光标闪烁
LCD_WRITE(0x01,COM); //清除显示
DELAY(10); //延时2ms
LCD_WRITE(0x06,COM); //输入模式,I/D(d1)=1:地址加1,S(d0)=1:显示移位关闭
}
//========读LCD状态
char LCD_READ(void)
{ char R1;
LCD_RS=0; //寄存器选择
LCD_RW=1; DELAY(5); //读为1
LCD_E=1;DELAY(5); //使能
R1=0; //短延时
R1=P0&0xF0; //读数据的高4位给R1
LCD_E=0;DELAY(5); //读数据结束
LCD_E=1;DELAY(5); //使能
R1=(P0>>4) & 0x0F; //读PORTD的低4位,R1的高4位不变!
LCD_E=0;DELAY(5); //读数据结束
LCD_RW=0;
return (R1);
}
//写一字节数R1,FLAG为写命令或数据选择,0为写命令,1为写数据
//写之前先检查是否忙,写完后延时100us,分二次写4位数据/命令
void LCD_WRITE(char R1,char FLAG)
{ char R2;
LCD_BUSY(); //忙检测
R2=R1&0xF0; //低4位清0
R2=R2>>4; //取高4位
LCD_WRITE_4(R2,FLAG); //先写高4位
R2=R1&0x0F; //高4位清0,取低4位
LCD_WRITE_4(R2,FLAG); //再送低4位
DELAY_US(10); //延时100us
}
//写R1的低4位,FLAG为寄存器选择,1为命令,0为数据
void LCD_WRITE_4(char R1,char FLAG)
{ LCD_RW=0;DELAY(5); //写模式
LCD_RS=FLAG;DELAY(5); //寄存器选择
P0&=0x0F;DELAY(5); //高4位先清0
LCD_E=1;DELAY(5); //使能
R1=R1<<4;
P0|=R1;DELAY(5); //送4位
LCD_E=0;DELAY(5); //数据送入有效
LCD_RS=0;DELAY(5);
P0&=0x0F; //RD低4位清0
}
//========检测LCD是否忙
void LCD_BUSY(void)
{ char R1;
while(1)
{ R1=LCD_READ(); //读寄存器
if ((R1&0x80)==0x00) //最高位为忙标志位
break;
};
}
//====延时子程序
void DELAY(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//======延时(n×10)us
void DELAY_US(char n)
{ char j;
for (j=0;j<n;j++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}
评论0