📄 lcd1602模块8线.c
字号:
#include <reg51.h>
#include <intrins.h>
/*********************************************************************/
/* lcd1602 */
/*/
/*********************************************************************/
#define LCD_1602_Data P1
#define LCD_1602_sign_Busy 0x80 //用于检测LCM状态字中的LCD_1602_sign_Busy标识
#define uchar unsigned char
#define uint unsigned int
sbit LCD_1602_RW = P2^0; /*实时LCD线引脚定义 */
sbit LCD_1602_RS = P2^1;
sbit LCD_1602_EN = P2^2;
sbit LCD_1602_Led = P2^3;
unsigned char DData;
/*********************************************************************/
/* lcd1602函数的声明*/
/*********************************************************************/
void LCD_1602_Write_Data(unsigned char LCD_1602_Transfer_Data);
void LCD_1602_Write_Command(unsigned char LCD_1602_Command,BuysC)reentrant;
unsigned char LCD_1602_Read_Data(void);
unsigned char LCD_1602_Read_Status(void);
void LCD_1602_Init(void);
void LCD_1602_Display_One_Char(unsigned char LCD_1602_X_Coordinate, unsigned char LCD_1602_Y_Coordinate, unsigned char DData);
void LCD_1602_Display_List_Char(unsigned char LCD_1602_X_Coordinate, unsigned char LCD_1602_Y_Coordinate, unsigned char *DData);
void Delay5Ms(void);
void Delay400Ms(void);
/********************************************************************
* 名称: LCD_1602_Write_Data
* 说明:
* 功能: 往lcd1602写数据
* 调用: LCD_1602_Read_Status()
* 输入: LCD_1602_Data 写入的数据
* 返回值: 无
***********************************************************************/
void LCD_1602_Write_Data(unsigned char LCD_1602_Transfer_Data)
{
LCD_1602_Read_Status(); //检测忙
LCD_1602_Data=LCD_1602_Transfer_Data;
LCD_1602_RS = 1;
LCD_1602_RW = 0;
LCD_1602_EN = 0; //若晶振速度太高可以在这后加小的延时
LCD_1602_EN = 0; //延时
LCD_1602_EN = 1;
}
/********************************************************************
* 名称: LCD_1602_Write_Command
* 说明:
* 功能: 往lcd1602写指令
* 调用: LCD_1602_Read_Status()
* 输入: LCD_1602_Command 写入的指令
* 返回值: 无
***********************************************************************/
void LCD_1602_Write_Command(unsigned char LCD_1602_Command,BuysC)reentrant //BuysC为0时忽略忙检测
{
if (BuysC) LCD_1602_Read_Status(); //根据需要检测忙
LCD_1602_Data = LCD_1602_Command;
LCD_1602_RS = 0;
LCD_1602_RW = 0;
LCD_1602_EN = 0;
LCD_1602_EN = 0;
LCD_1602_EN = 1;
}
/********************************************************************
* 名称: LCD_1602_Read_Data
* 说明:
* 功能: lcd1602读数据
* 调用:
* 输入:
* 返回值: LCD_1602_Data
***********************************************************************/
unsigned char LCD_1602_Read_Data(void)
{
LCD_1602_RS = 1;
LCD_1602_RW = 1;
LCD_1602_EN = 0;
LCD_1602_EN = 0;
LCD_1602_EN = 1;
return(LCD_1602_Data);
}
/********************************************************************
* 名称: LCD_1602_Read_Status
* 说明:
* 功能: lcd1602读状态
* 调用:
* 输入:
* 返回值: LCD_1602_Data
***********************************************************************/
unsigned char LCD_1602_Read_Status(void)
{
LCD_1602_RS = 0;
LCD_1602_RW = 1;
LCD_1602_EN = 0;
Delay5Ms(); //延时不够,可以再加
LCD_1602_EN = 1;
while (LCD_1602_Data & LCD_1602_sign_Busy); //检测忙信号
return(LCD_1602_Data);
}
/********************************************************************
* 名称: LCD_1602_Init
* 说明:
* 功能: lcd1602初始化
* 调用: LCD_1602_Write_Command,Delay5Ms()
* 输入:
* 返回值:
***********************************************************************/
void LCD_1602_Init(void)
{
LCD_1602_Data = 0;
LCD_1602_Write_Command(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
LCD_1602_Write_Command(0x38,0);
Delay5Ms();
LCD_1602_Write_Command(0x38,0);
Delay5Ms();
LCD_1602_Write_Command(0x38,1); //显示模式设置,开始要求每次检测忙信号
LCD_1602_Write_Command(0x08,1); //关闭显示
LCD_1602_Write_Command(0x01,1); //显示清屏
LCD_1602_Write_Command(0x06,1); // 显示光标移动设置
LCD_1602_Write_Command(0x0C,1); // 显示开及光标设置
}
/********************************************************************
* 名称: LCD_1602_Display_One_Char
* 说明:
* 功能: lcd1602按指定位置显示一个字符
* 调用: LCD_1602_Write_Command,LCD_1602_Write_Data(DData)
* 输入:
* 返回值:
***********************************************************************/
void LCD_1602_Display_One_Char(unsigned char LCD_1602_X_Coordinate, unsigned char LCD_1602_Y_Coordinate, unsigned char DData)
{
LCD_1602_Y_Coordinate &= 0x1;
LCD_1602_X_Coordinate &= 0xF; //限制LCD_1602_X_Coordinate不能大于15,LCD_1602_Y_Coordinate不能大于1
if (LCD_1602_Y_Coordinate) LCD_1602_X_Coordinate |= 0x40; //当要显示第二行时地址码+0x40;
LCD_1602_X_Coordinate |= 0x80; //算出指令码
LCD_1602_Write_Command(LCD_1602_X_Coordinate, 0); //这里不检测忙信号,发送地址码
LCD_1602_Write_Data(DData);
}
//************************************************************************************按指定位置显示一串字符
/********************************************************************
* 名称: LCD_1602_Display_List_Char
* 说明:
* 功能: lcd1602按指定位置显示一串字符
* 调用: LCD_1602_Write_Command,LCD_1602_Write_Data(DData)
* 输入:
* 返回值:
***********************************************************************/
void LCD_1602_Display_List_Char(unsigned char LCD_1602_X_Coordinate, unsigned char LCD_1602_Y_Coordinate, unsigned char * DData)
{
unsigned char LCD_1602_List_Length;
LCD_1602_List_Length = 0;
LCD_1602_Y_Coordinate &= 0x1;
LCD_1602_X_Coordinate &= 0xF; //限制LCD_1602_X_Coordinate不能大于15,LCD_1602_Y_Coordinate不能大于1
while (DData[LCD_1602_List_Length]>0x20) //若到达字串尾则退出
{
if (LCD_1602_X_Coordinate <= 0xF) //LCD_1602_X_Coordinate坐标应小于0xF
{
LCD_1602_Display_One_Char(LCD_1602_X_Coordinate, LCD_1602_Y_Coordinate, DData[LCD_1602_List_Length]); //显示单个字符
LCD_1602_List_Length++;
LCD_1602_X_Coordinate++;
}
}
}
//************************************************************5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//************************************************************400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -