LCD1602 初始化过程详解及代码示例
LCD1602 初始化后的运行过程如下:
-
首先,设置 GPIOA 和 GPIOC 的时钟,并初始化 GPIOA 的 Pin0-Pin7 和 GPIOC 的 Pin13-Pin15 为输出模式,用于控制 LCD1602 的各个引脚。
-
接着,向 LCD1602 写入初始化命令,包括三次 0x38 命令,0x08 命令(关闭显示),0x01 命令(清屏),0x06 命令(光标自动右移),0x0C 命令(开启显示,不显示光标和闪烁)。
-
初始化完成后,可以调用 LCD_Write_String 和 LCD_Write_Char 等函数向 LCD1602 显示数据,也可以调用 LCD_Clear 函数清屏。
#include 'LCD1602.h' #include 'delay.h' #include 'sys.h'
u8 Dao_xu(u8 data) { u8 i = 0 ,temp = 0;;
for(i = 0; i < 8; i++)
{
temp += (((data >> i) & 0x01) << (7 - i));
}
return temp;
}
/----------------------------------------------- 说明:LCD1602 作者:shifang 修改:无 功能:实现字符显示 备注:引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16- 背光控制 ------------------------------------------------/ void LCD_Check_Busy(void)
{
LCD1602_RS0;
delay_us(1);
LCD1602_RW1;
delay_us(1);
LCD1602_EN0;
delay_us(1);
GPIO_Write(GPIOC,0Xff);
delay_ms(1);
LCD1602_EN1;
delay_us(100);
}
/------------------------------------------------ 写入指令函数 ------------------------------------------------/ void LCD_Write_Com(unsigned char com) {
LCD1602_RS0;
delay_us(1);
LCD1602_RW0;
delay_us(1);
LCD1602_EN1;
delay_us(1);
GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(com));
delay_us(100);
LCD1602_EN0;
}
/------------------------------------------------ 写入数据函数 ------------------------------------------------/ void LCD_Write_Data(unsigned char Data) {
LCD1602_RS1;
delay_us(1);
LCD1602_RW0;
delay_us(1);
LCD1602_EN1;
delay_us(1);
GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(Data));
delay_us(100);
LCD1602_EN0;
}
/------------------------------------------------
写入字符串函数
------------------------------------------------/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
while (*s) {
LCD_Write_Data( s);
s ++;
}
}
/------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
void LCD1602_write_long(unsigned char x,unsigned char y,u32 data,unsigned char num)
{
unsigned char temp[12],i = 12;
while(i--)
{
temp[i] = ' ';
}
temp[num] = '\0';
while(num--)
{
if(data || data%10)
temp[num] = data % 10 + 0x30;
data = data/10;
}
LCD_Write_String(x,y,temp);
}
/------------------------------------------------ 清屏函数 ------------------------------------------------/ void LCD_Clear(void) { LCD_Write_Com(0x01); delay_ms(5); }
/------------------------------------------------/ void LCD_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOA GPIOB GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHZ
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14|GPIO_Pin_15; // LCD1602 RS-RW-EN?
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度50MHZ
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOC
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x38);
delay_ms(5);
LCD_Write_Com(0x08); /关闭显示/
delay_ms(5);
LCD_Write_Com(0x01); /清屏/
delay_ms(5);
LCD_Write_Com(0x06); /光标自动右移设置/
delay_ms(5);
LCD_Write_Com(0x0C); /开启显示,不显示光标和闪烁设置/
delay_ms(5);
}
原文地址: https://www.cveoy.top/t/topic/nRrQ 著作权归作者所有。请勿转载和采集!