LCD1602字符串显示(STM32F103)

一、概述

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=高脉冲

四、硬件连接

LCD1602字符串显示(STM32F103)_第1张图片

五、程序代码

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字符串显示(STM32F103)_第2张图片
完整程序及LCD1602液晶相关资料:
链接:https://pan.baidu.com/s/1Ok-P7IACpib_vLQX57ikVg
提取码:hcyp

如有错误还望指出,谢谢!

你可能感兴趣的:(stm32,stm32)