📄 lcd.c
字号:
#include <reg51.h>
#include <intrins.h>
/*定义管脚*/
sbit RS = P2^7;
sbit RW = P2^6;
sbit E = P2^5;
sbit RES = P2^2;
sbit PSB = P2^4;
sbit EOC=P
sbit start=P3^1;
sbit clk=P3^5;
#define Lcd_Bus P0 //MCU P2<------> LCM ;
#define FIRST_ADDR 0 //定义字符/汉字显示起始位置 ;
#define uint unsigned int
unsigned int disbuff1[]={0,0,0,0,0} ; // 显示缓存 1
unsigned char disbuff2[]; //显示缓存 2
int a=254;
int x=0,h=0; //行车距离 高度
int ad=0;
void delay(uint t) //延时程序 ;
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
void adc()
{ //P0=0xff;
start=1;
delay(1000);
start=0;
ad=P1;
}
//=========T0初始化函数=============
void init(void)
{
EA=1;
ET1=1;
TMOD=0X10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
TR1=1;
}
void timer1(void) interrupt 2
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
clk=~clk;
}
void check_busy() //查忙子程序 不忙跳出 ;
{
RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80) ;
E=0;
}
void write_comd (uint cmdcode ) //写指令到LCD ,E下降沿送数据 ;
{
check_busy();
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
delay(5);
E=0;
delay(5) ; //延时使LCD有时间处理数据 ;
}
void write_data(uint cmddata) //写数据到LCD,
{
check_busy();
RS=1;
RW=0;
E=1;
Lcd_Bus=cmddata;
delay(5);
E=0;
delay(5);
}
void lcdinit()
{
write_comd(0x30); //8位数据 基本指令集 ;
delay(5);
write_comd(0x0c); //开显示 无游标 不反白 ;
delay(5);
write_comd(0x01); //清屏 AC置零 ;
delay(5);
write_comd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code *s) //汉字库显示
{ while(*s>0)
{ write_data(*s);
s++;
delay(10);
}
}
void ceshi()
{
write_comd(0x01);//清除显示,并且设定地址指针为00H
delay(5);
a=11;
write_comd(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("行车距离:");
delay(1000);
write_comd(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
hzkdis(" CM");
delay(1000);
write_comd(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
hzkdis("高 度:");
delay(8000);
write_comd(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
hzkdis(" M");
delay(8000);
}
void display(uint a,unsigned char b,unsigned long c) //显示函数 显示位置为第a行第b位 显示c所代表的数
{
int cc,i;
int m,n,o,p,q;
uint disaddr=0x80 ;
if(a==2) disaddr=0x90+b;
else if(a==3) disaddr=0x88+b ;
else if(a==4) disaddr=0x98+b ;
else disaddr=0x80+b ;
cc=(int)(c*100) ;
m=cc/10000;
n=(cc%10000 )/1000;
o=(cc%1000)/100;
p=(cc%100)/10;
q=(cc%10);
disbuff1[0]=(m+48); //存储时 变为ASCII码
disbuff1[1]=(n+48);
disbuff1[2]=(o+48);
disbuff1[3]=(p+48);
disbuff1[4]=(q+48);
write_comd(disaddr);
for(i=0;i<5;i++)
{
write_data(disbuff1[i]);
}
}
void main()
{ //unsigned char i;
while(1)
{
PSB=0;
delay(300);
PSB=1;
RW=0;
lcdinit(); //初始化LCD屏
// CGRAM();
ceshi(); //显示测试字样
display(2,4,x);
delay(10000);
display(4,4,h);
delay(10000);
while(1)
{
adc();
display(2,4,ad);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -