📄 lcd1602.h
字号:
/*--------------------------------------------------------------------------
LCD1602.H
The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __LCD1602_H__
#define __LCD1602_H__
/*连接线图:
---------------------------------------------------
| LCM-----51 | LCM-----51 | LCM------51 |
| ----------------------------------------------- |
| DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
| DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------
//*********** 引脚定义引脚********************************/
#define LCM_RS P2_0 // 数据/命令选择信号
#define LCM_RW P2_1 // 读/写选择信号
#define LCM_E P2_2 // 使能信号
#define LCM_Data P0 // 显示数据端口
#define Busy 0x80 // 用于检测LCM状态字中的Busy标识
#define uchar unsigned char
#define uint unsigned int
//================================ LCM1602控制部分 =========================================================
/*****************************************************
函 数 名:void Delay_LCD(void)
功 能:5ms延时
说 明:LCD显示延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_LCD(void)
{
uint TempCyc = 5552; // 放入延时数据
while(TempCyc--);
}
/*****************************************************
函 数 名:uchar ReadStatusLCM()
功 能:读忙状态
说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
入口参数:无
返 回 值:LCM_Data
*****************************************************/
//读状态
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF; // LCM数据口先置1
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); // 检测忙信号.如果忙,则不执行
return(LCM_Data); // 不忙返回读取数据
}
/*****************************************************
函 数 名:void WriteDataLCM()
功 能:向LCM1602中写入数据
说 明:将形参WDLCM中的数据写入LCM中
入口参数:WDLCM
返 回 值:无
*****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); // 检测忙
LCM_Data = WDLCM; // 写入数据到LCM
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}
/*****************************************************
函 数 名:void WriteCommandLCM()
功 能:向LCM1602中写入指令
说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
入口参数:WCLCM,BuysC
返 回 值:无
*****************************************************/
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); // 根据需要检测忙
LCM_Data = WCLCM; // 写入指令
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*****************************************************
函 数 名:void LCMInit()
功 能:初始化LCM1602
说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
入口参数:无
返 回 值:无
*****************************************************/
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
Delay_LCD();
WriteCommandLCM(0x38,0); // 0x38指令表示:8位数据显示模式,俩行多显示
Delay_LCD();
WriteCommandLCM(0x38,0);
Delay_LCD();
WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); // 关闭显示
WriteCommandLCM(0x01,1); // 显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
/*****************************************************
函 数 名:void DisplayOneChar()
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标,DData为ASCII值
入口参数:X,Y,DData
返 回 值:无
*****************************************************/
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x01;
X &= 0x0F; // 限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; // 当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
/*****************************************************
函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
功 能:向指定坐标中写入字符串
说 明:X-横坐标,Y-纵坐标
入口参数:X,Y,*DData
返 回 值:无
*****************************************************/
//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength,j;
ListLength = strlen(DData); // strlen:读取字符串的长度
Y &= 0x1;
X &= 0xF; // 限制X不能大于15,Y不能大于1
if (X <= 0xF) // X坐标应小于0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); // 显示单个字符
X++; // 横坐标加1,纵坐标不变
}
}
}
/*****************************************************
函 数 名:void Mychar()
功 能:自定义字符--CGRAM
说 明:LCM1602字符库中没有温度符号,自定义温度符号
入口参数:无
返 回 值:无
/*****************************************************/
void Mychar(void)
{
//---------自定义字符代码--00H------闹铃符号-------------
WriteCommandLCM(0x40,0); //第1行
WriteDataLCM(0x01);//
WriteCommandLCM(0x41,0); //第2行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x42,0); //第3行
WriteDataLCM(0x1d);//
WriteCommandLCM(0x43,0); //第4行
WriteDataLCM(0x19);//
WriteCommandLCM(0x44,0); //第5行
WriteDataLCM(0x1d);//
WriteCommandLCM(0x45,0); //第6行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x46,0); //第7行
WriteDataLCM(0x01);//
WriteCommandLCM(0x47,0); //第8行
WriteDataLCM(0x00);//
//---------自定义字符代码--01H-------温度符号------------
WriteCommandLCM(0x48,0); //第1行
WriteDataLCM(0x02);//
WriteCommandLCM(0x49,0); //第2行
WriteDataLCM(0x05);//
WriteCommandLCM(0x4a,0); //第3行 1------**--
WriteDataLCM(0x05);// 2----**--**
WriteCommandLCM(0x4b,0); //第4行 3----**--**
WriteDataLCM(0x02);// 4------**--
WriteCommandLCM(0x4c,0); //第5行 5----------
WriteDataLCM(0x00);// 6----------
WriteCommandLCM(0x4d,0); //第6行 7----------
WriteDataLCM(0x00);// 8----------
WriteCommandLCM(0x4e,0); //第7行
WriteDataLCM(0x00);//
WriteCommandLCM(0x4f,0); //第8行
WriteDataLCM(0x00);//
//---------自定义字符代码--02H-------当前时间------------
WriteCommandLCM(0x50,0); //第1行
WriteDataLCM(0x1f);//
WriteCommandLCM(0x51,0); //第2行
WriteDataLCM(0x11);//
WriteCommandLCM(0x52,0); //第3行
WriteDataLCM(0x15);//
WriteCommandLCM(0x53,0); //第4行
WriteDataLCM(0x11);//
WriteCommandLCM(0x54,0); //第5行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x55,0); //第6行
WriteDataLCM(0x0a);//
WriteCommandLCM(0x56,0); //第7行
WriteDataLCM(0x1f);//
WriteCommandLCM(0x57,0); //第8行
WriteDataLCM(0x00);//
//-----------------------------------------------
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -