📄 lcd1602.txt
字号:
/*********************LCD模块1602底层驱动库***********************
* LCD模块与单片机的硬件连接:
*
*!!!!!!!!!!!!!!!!!!!通过对头文件的宏定义可以适应各种端口连接!!!!!!!!!!!!!!!!!!!!
*
* *宏定义名称* *LCD端口* *端口意义*
* RS数据/指令选择线 RS LCD_RS_PORT 4 //RS端口选择
* LCD_RS //RS端口号选择
*
* R/W读写选择线 R/W NC 5
*
* EN写使能线 EN LCD_EN_PORT 6 //使能端口选择
* LCD_EN //使能端口号选择
*
* 三态双向数据总线 LCD_DATA_PORT D4-D7 //数据端口选择
* LCD_DATA //数据端口号选择
*
* 其他端口连接:
* 电源负 VSS 1
* 电源正+4.5--+5.5V VDD 2
* 对比度调节 VL 3
* 背光负 BLK 15
* 背光正 BLA 16
*
* 说明:*采用节省端口的4线线连接方式,即将8位的数据分两次传输;同
* 时将R/W接地RW(只用W不需要R,所以可以省一根线)
* *功能显示函数:
* Locate //显示定位
* LCD_Write_String //写入字符串
* Flash_String //字符串闪烁效果
* String_Run //字符串滚动效果
* DEC_Num_Disp //十进制数据显示
* HEX_Num_Disp //16进制数据显示
* Point_Disp //小数显示
* *为了避免程序"死等",故在功能函数中尽量避免调用Delay函数,
* 定义了Flash_Counter,String_Run_Counter.在使用本头文件时,
* 应将这些变量放在定时器中断里累加。
*****************************************************************/
/*****************定义MCU与LCD的接口******************/
#define LCD_EN_PORT P2 //写使能。高有效,下降沿时锁定数据
#define LCD_RS_PORT P2 //指令/数据选择
#define LCD_DATA_PORT P1 //数据总线
#define LCD_EN 0x04 //PORTD2 out 20
#define LCD_RS 0x08 //PORTD3 out 10
#define LCD_DATA 0xf0 //PORTD4/5/6/7 out
#define Data_Write LCD_RS_PORT |= LCD_RS //写数据模式
#define Command_Write LCD_RS_PORT &= ~LCD_RS //写指令模式
#define Write_En LCD_EN_PORT |= LCD_EN //写使能
#define Write_Lock LCD_EN_PORT &= ~LCD_EN //锁定数据
#define CLS LCD_Write_Char(0x01,0) //清屏
/********************数组定义区***********************/
const char CHR[] = {'0','1','2','3','4','5','6','7','8'
,'9','a','b','c','d','e','f','.'};
unsigned char LCD_Buff[] = {0,0,0,0,0,0,0,0};
/******************全局变量定义区*********************/
char Length = 0; //字符串长度值
char Flash_Counter = 0;
char String_Run_Counter = 0;
int Jump_Counter = 0;
/******************功能函数声明区*********************/
void Delay_nus(unsigned int j); //微秒级延时函数
void Delay_nms(unsigned int n); //毫秒级延时函数
void LCD_Write_Char(char Command,char Data); //写入单个字符或指令
void LCD_Init(void); //LCD模块初始化
char StringLenth(char *String); //字符串长度测量函数
void Locate( unsigned char x, unsigned char y ); //显示定位
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String); //写入字符串
void DEC_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit); //十进制数据显示
void HEX_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit); //16进制数据显示
void Point_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit,char Point); //小数显示
/*******************N us延时函数**********************/
void Delay_nus(unsigned int j)
{
unsigned int i=0;
for(i=j;i>0;i--)
{
;
}
}
/********************N ms延时函数*********************/
void Delay_nms(unsigned int n)
{
unsigned int m = 0;
unsigned int k = 0;
for (m=n;m>0;m--)
{
for (k=1140;k>0;k--)
{
Delay_nus(1);
}
}
}
/*************************************************************
* LCD_Write_Char :英文单字符显示函数
*
* 向LCD发送数据/指令。 Command=1 发送显示数据
* Command=0 发送指令数据
*
* 输入参数 :Command 数据/指令寄存器选择
* Data 显示内容
*
**************************************************************/
void LCD_Write_Char(char Command,char Data)
{
unsigned Command_Temp,Data_Temp;
Command_Temp = Command;
Data_Temp = Data;
Delay_nus(50); //延时1ms,以避开"写繁忙"时期
if (Command == 0) //数据输入模式
{
Write_En;
Data_Write;
LCD_DATA_PORT &= 0x0f;
LCD_DATA_PORT |= Data_Temp&0xf0; //先送高4位
Write_Lock;
}
else //指令输入模式
{
Write_En;
Command_Write;
LCD_DATA_PORT &= 0x0f;
LCD_DATA_PORT |= Command_Temp&0xf0;
Write_Lock;
}
Command_Temp=Command_Temp << 4;
Data_Temp=Data_Temp << 4;
LCD_DATA_PORT &= 0X0F;
if (Command==0) //再送低4位
{
Write_En;
LCD_DATA_PORT |= Data_Temp&0xf0;
Write_Lock;
}
else
{
Write_En;
LCD_DATA_PORT |= Command_Temp&0xf0;
Write_Lock;
}
}
/***********LCD模块初始化**************/
void LCD_Init(void)
{
Delay_nms(1);
LCD_Write_Char(0x28,0); //4位数据线格式
Delay_nus(10);
LCD_Write_Char(0x0c,0); //显示开
Delay_nus(10);
LCD_Write_Char(0x01,0); //清屏
Delay_nms(1);
LCD_Write_Char(0x06,0); //光标模式设置
}
/**************************************************************
* Locate : 设置LCD显示的起始位置
*
* 输入参数:x、y : 显示字符串的坐标,X:0-15,Y:0-1
* LCD第一行显示寄存器地址:0X80-0X8F
* LCD第一行显示寄存器地址:0XC0-0XCF
**************************************************************/
void Locate( unsigned char x, unsigned char y )
{
unsigned char Address;
if (y == 0)
{
Address = 0x80 + x; //第一行显示的地址
}
if (y == 1)
{
Address = 0xc0 + x; //第二行显示的地址
}
LCD_Write_Char(Address,0);
}
/**************************************************************
* LCD_Write_String : 英文字符串显示函数
*
* 输入参数:X、Y :显示字符串的坐标
* String :英文字符串指针
*
**************************************************************/
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String)
{
Locate(X,Y); //先送显示起始坐标
while (*String) //再依次送显示字符
{
LCD_Write_Char( 0, *String );
String ++;
}
}
/**************************************************************
* DEC_Num_Disp :10进制数值显示函数
*
* 输入参数 :X 字符起始显示行坐标
* Y 字符起始显示列坐标
* Num 需要显示的数值(最长8位)
* Bit 有效显示位数
* 输出 :
**************************************************************/
void DEC_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
unsigned char i = 0;
Locate( X, Y );
for (i=0 ; i<Bit ; i++)
{
LCD_Buff[i] = CHR[Num%10];
Num = Num/10;
}
for (i=0 ; i<Bit ; i++)
{
LCD_Write_Char(0,LCD_Buff[Bit-i-1]);
}
}
/*************************************************************
* HEX_Num_Disp :16进制数值显示函数
*
* 输入参数 :X 字符起始显示行坐标
* Y 字符起始显示列坐标
* Num 需要显示的数值(最长8位)
* Bit 有效显示位数
* 输出 :
**************************************************************/
void HEX_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
char a = 0;
Locate( X, Y );
for(a=8-Bit ; a<8 ; a++)
{
LCD_Write_Char(0,CHR[(Num<< (a << 2)) >>28]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -