📄 液晶显示.c
字号:
#include<reg52.h>
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit EN=P3^5; //定义LCM接口
sbit RW=P3^4;
sbit RS=P3^3;
sbit LB=P3^2; //背光灯控制
#define LCD P0 //数据口
#define uchar unsigned char
uchar code line[]={"hello world!"};
uchar code num[]={"0123456789:'. "};
/***********1602"忙"检测*************/
void checkbf()
{
for(; ;)
{
RS=0; //FOR IR
RW=1; // READ
EN=1;
ACC=LCD;//读出液晶数据引脚(D0-D7)值,D7=0表示液晶“不忙”
EN=0;
if(ACC7==0) break;//不断检测,直到液晶不“忙”
}
}
/*************写命令字节,flag决定是否在写之前检测"忙"状态********/
void wir(uchar cc,bit flag)
{
if(flag) checkbf(); //如果flag=1,则发命令前先进行“忙”检测
RS=0; //把命令字节(cc)写入到1602的IR(指令寄存器)
RW=0; // WRITE
EN=1;
LCD=cc;//写入命令字节cc
EN=0;
}
/********* 往1602发数据字节,发之前先进行“忙”检测 *************/
void wdat(uchar dat)
{
checkbf();
RS=1; //把这个字节(dat)写入1602的DR(数据寄存器)
RW=0; // WRITE
EN=1;
LCD=dat; //往1602写入用来显示的数据(1个字节)
EN=0;
}
/****************在1602显示屏(X,Y)坐标处显示数据dd(占屏幕一个字的位置)***********/
void wbyte(uchar X,uchar Y,uchar dd)
{
if(Y==1) X|=0xc0;// second line
else X|=0x80;// first line 对坐标进行处理
wir(X,1);//先写坐标
wdat(dd);//再送要显示的数据
}
/****************从1602显示屏(X,Y)坐标处开始显示一连串数据***********/
void wstr(uchar X,uchar Y,uchar *da)//da为待显示的字符串数组名
{
if(Y==1) X|=0xc0;//second line
else X|=0x80; //first line
wir(X,1); //先写坐标
while(*da>0) wdat(*da++); //不断往1602送字符串数据,直到字符串尾(字符串以“/0”结尾)
}
/*********5毫秒延时程序**********************/
void delay5ms()
{
uchar i,j=250;
for(i=10;i>0;i--)
while(--j);
}
/***********初始化1602**********************/
void init()
{
delay5ms();
delay5ms();
delay5ms();//初始化一般发生在上电复位后不久,延时15ms,待系统稳定下来
wir(0x38,0);
delay5ms();
wir(0x38,0);
delay5ms();
wir(0x38,0);//重复三次写入命令字节0X38,不检测忙信号
//下面命令字节的含义参照课本1602命令字表(RS=0,RW=0的)
wir(0x38,1);//功能设定:8位数据,双列字,5*7字型
wir(0x08,1);//turn off light
wir(0x01,1);// clean the screen
wir(0x0c,1);// 开显示屏,不开游标和闪烁功能
wir(0x06,1);//设定AC+1
}
/*************主函数main**************************/
/*************主函数main**************************/
/*************主函数main**************************/
void main()
{
LB=0; //开背光灯
init();//初始化1602
for(;;)
{
wstr(0,0,line);//以字符串写入方式显示字符串line内容
wir(0xc0,1); //写入第二行首坐标0xc0
wdat(num[1]); //之后不断往1602送数据,每送一个字节,1602地址会自动加1
wdat(num[2]); //这样后面的数据才不会覆盖前面的
wdat(num[12]);
wdat(num[1]);
wdat(num[8]);
wdat(num[13]);
wir(0xc7,1); //改变1602内部地址寄存器值,即自己挑选显示位置
wdat(num[1]);
wir(0xca,1);
wdat(num[3]);
wdat(num[10]);
wdat(num[1]);
wdat(num[9]);
wdat(num[11]);
//控制1602显示可以采用“写坐标+写数据”,“写坐标+写数据”在屏上特定位置显示一个字,
//也可以写入一个坐标后不断写入数据,直到该屏幕的最末(如上例)。
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -