1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不可以显示汉字,内置1128个字符的ASCII字符集,并行通信方式。本验是通过STM32F103C8T6最小系统驱动液晶显示一串字符。
1、STM32F103C8T6最小系统
2、LCD1602液晶
3、杜邦线若干
状态 | 输入 | 输出 |
---|---|---|
读状态 | RS=L,RW=H,E=H | D0-D7=状态 |
写指令 | RS=L,RW=L,D0-D7=指令码,E=高脉冲 | 无 |
读数据 | RS=H,RW=H,E=H | D0-D7=数据 |
写数据 | RS=H,RE=L,D0-D7=数据,E=高脉冲 | 无 |
1、GPIO初始化
void Lcd1602_Pin_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_8 |
GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 |
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
2、LCD1602初始化
void Lcd1602_Init(void)
{
Lcd1602_Pin_Init();
delay_ms(15);
Lcd1602_Write_Cmd(0X38);
Lcd1602_Write_Cmd(0X0C);//开显示不显示光标
Lcd1602_Write_Cmd(0X06);//写一个指针加1
Lcd1602_Write_Cmd(0X01);//清屏
Lcd1602_Write_Cmd(0X80);//设置数据指针起点
}
3、检测忙碌状态
void Lcd1602_Check_Busy(void)
{
u8 signal;
LCD_RS = 0;
LCD_RW = 1;
do
{
LCD_EN = 1;
signal = LCD_BUSY;
LCD_EN = 0;
}while(signal);
}
4、写指令
void Lcd1602_Write_Cmd(int cmd)
{
Lcd1602_Check_Busy();//检测忙碌状态
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
cmd=cmd<<8;
GPIOB->ODR=((GPIOB->ODR & 0x00FF)|(cmd&0xFF00));//PB15-8是数据位,PB0-7的数据不能变
delay_us(2);
LCD_EN = 1;
delay_us(2);
LCD_EN = 0;
delay_ms(15);
}
5、写数据
void Lcd1602_Write_Data(int data)
{
Lcd1602_Check_Busy();//检测忙碌状态
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
data<<= 8;
GPIOB->ODR = ((GPIOB->ODR & 0X00FF) | (data& 0XFF00));
delay_us(2);
LCD_EN = 1;
delay_us(2);
LCD_EN = 0;
delay_ms(15);
}
6、显示字符
// @u8 row:行
// @u8 col:列
// @int ch:字符
void Lcd1602_DisplayChar(u8 row,u8 col,int ch)
{
//显示位置
int add = 0;
//判断是那一行
if(row == 2)
{
//第二行的首地址 0x40
add += 0x40;
}
//第一行的首地址 0x80
add += 0x80 + col - 1;
Lcd1602_Write_Cmd(add);
//显示内容
Lcd1602_Write_Data(ch);
}
7、显示字符串
// @u8 row:行
// @u8 col:列
// @u8 *str:字符串首地址
void Lcd1602_DisplayString(u8 row,u8 col,u8 *str)
{
while(*str != '\0')
{
Lcd1602_DisplayChar(row,col,*str);
col += 1;
str++;
}
}
8、主程序
int main(void)
{
u8 buf[] = {"I Love You!"};
u8 date[] = {"2021/2/7"};
u8 author[] = {"Qing"};
Sys_Delay_Init();
Lcd1602_Init();
//单个字符
// Lcd1602_DisplayChar(2,2,'A');
//字符串
Lcd1602_DisplayString(1,1,buf);
Lcd1602_DisplayString(2,1,date);
Lcd1602_DisplayString(2,13,author);
while(1)
{
}
}
完整程序及LCD1602液晶相关资料:
链接:https://pan.baidu.com/s/1Ok-P7IACpib_vLQX57ikVg
提取码:hcyp
如有错误还望指出,谢谢!