/**************************************
LCD1602上用两行显示两个字符串
*************************************/
#include <reg52.h>
#define uchar unsigned char
#define LCD1602 P0
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6;
uchar code *str1 = "LCD1602";
uchar code *str2 = "Let us test it";
void LcdStatus();
void WriteData(uchar dat);
void WriteCom(uchar cmd);
void InitLcd();
void SetCursor(uchar x, uchar y);
void LcdDisplay(uchar x, uchar y, uchar *p_str);
void main()
{
InitLcd();
LcdDisplay(4,0,str1); //第0行的第四列显示
LcdDisplay(1,1,str2); //第1行的第一列显示
while (1);
}
//读状态
void LcdStatus()
{
uchar sta;
LCD1602 = 0xFF; //51端口要读取外部状态时,要先使端口输出高电平;
EN = 0;
RS = 0;
RW = 1;
do
{
EN = 1;
sta = LCD1602;
EN = 0;
}while (sta &= 0x80);
}
//写指令
void WriteCmd(uchar cmd)
{
LcdStatus(); //对控制器每次进行读写之前,都要进行状态检测,确定STA7为0;
RS = 0; //选择指令寄存器;
RW = 0; //执行写操作;
LCD1602 = cmd; //执行写操作时,一定总线上要先有数据;
EN = 1; //E升为高电平
EN = 0; //E在下降沿时,才将数据写入;
}
//写数据
void WriteData(uchar dat)
{
LcdStatus();
RS = 1; //选择数据寄存器;
RW = 0; //执行写操作;
LCD1602 = dat; //执行写操作时,一定总线上要先有数据;
EN = 1; //E升为高电平
EN = 0; //E在下降沿时,才将数据写入;
}
//对LCD1602进行初始化设置
void InitLcd()
{
WriteCmd(0x38); //设置16X2显示、5X7点阵、8位数据接口;
WriteCmd(0x0C); //设置开显示、不显示光标、光标不闪烁;
WriteCmd(0x06); //设置读/写一个字符时地址指针加一,且光标也加一;
WriteCmd(0x01); //清屏再显示;
}
//设置显示位置
void SetCursor(uchar x, uchar y) //x作为行坐标、y作为纵坐标;
{
uchar addr;
if (0 == y)
{
addr = 0x00 + x;
}
else
{
addr = 0x40 + x;
}
WriteCmd(addr + 0x80);
}
//显示内容
void LcdDisplay(uchar x, uchar y, uchar *p_str)
{
SetCursor(x,y);
while (*p_str != '\0') //遇到字符串结束标志停止显示;
{
WriteData(*p_str ++);
}
}
C51LCD1602
最新推荐文章于 2025-03-13 10:34:07 发布