stm32f103c8t6怎么接lcd1602
时间: 2023-09-03 20:12:19 浏览: 150
首先需要了解LCD1602的接口,通常有16个引脚,其中8个为数据线,RS、RW、E三个为控制线,VSS、VDD、VO为电源线。
接口对应的引脚说明如下:
LCD1602引脚 | 说明 | STM32F103C8T6引脚
----|----|----
VSS | 电源地 | GND
VDD | 电源正 | 5V
VO | 对比度调节 | 可接10K电位器调节
RS | 数据/命令选择 | PB0
RW | 读/写选择 | GND
E | 使能信号 | PB1
D0-D7 | 数据线 | PB8-PB15
接线完成后,需要使用STM32的GPIO口来控制LCD1602,使用C语言编写程序控制1602的显示。程序主要分为以下几个步骤:
1. 初始化GPIO口,设置为输出模式
2. 通过GPIO口控制RS、RW、E及数据线的电平,发送指令或数据
3. 在发送数据之前需要等待LCD1602的状态准备好,然后再发送
4. 发送完数据后需要等待一段时间,让1602完成操作
下面是一个简单的程序示例,可以在Keil或者其他IDE中进行编译和调试。
```c
#include "stm32f10x.h"
#define LCD_RS GPIO_Pin_0 //RS控制线
#define LCD_E GPIO_Pin_1 //E使能线
#define LCD_D0 GPIO_Pin_8 //D0~D7数据线
#define LCD_D1 GPIO_Pin_9
#define LCD_D2 GPIO_Pin_10
#define LCD_D3 GPIO_Pin_11
#define LCD_D4 GPIO_Pin_12
#define LCD_D5 GPIO_Pin_13
#define LCD_D6 GPIO_Pin_14
#define LCD_D7 GPIO_Pin_15
#define LCD_GPIO GPIOB //使用的GPIO口
void LCD_Init(void);
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteData(unsigned char dat);
void LCD_WriteString(unsigned char x,unsigned char y,unsigned char *s);
int main(void)
{
LCD_Init(); //LCD初始化
LCD_WriteString(0, 0, "Hello"); //显示Hello
LCD_WriteString(1, 0, "World"); //显示World
while(1);
}
void LCD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB时钟使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LCD_RS | LCD_E | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_GPIO, &GPIO_InitStructure);
GPIO_SetBits(LCD_GPIO, LCD_RS | LCD_E | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7); //所有引脚输出高电平
delay_ms(20); //等待20ms
LCD_WriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口
delay_ms(5); //等待5ms
LCD_WriteCmd(0x0c); //开启显示,关闭光标
delay_ms(5); //等待5ms
LCD_WriteCmd(0x01); //清屏
delay_ms(5); //等待5ms
}
void LCD_WriteCmd(unsigned char cmd)
{
while((LCD_GPIO->IDR & LCD_D7) != 0); //等待LCD1602准备好
GPIO_ResetBits(LCD_GPIO, LCD_RS); //RS置低,选择指令模式
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
GPIO_Write(LCD_GPIO, (cmd << 8)); //写入高8位
GPIO_SetBits(LCD_GPIO, LCD_E); //E置高,发出指令
delay_ms(1); //等待1ms
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
GPIO_Write(LCD_GPIO, (cmd << 4)); //写入低4位
GPIO_SetBits(LCD_GPIO, LCD_E); //E置高,发出指令
delay_ms(1); //等待1ms
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
}
void LCD_WriteData(unsigned char dat)
{
while((LCD_GPIO->IDR & LCD_D7) != 0); //等待LCD1602准备好
GPIO_SetBits(LCD_GPIO, LCD_RS); //RS置高,选择数据模式
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
GPIO_Write(LCD_GPIO, (dat << 8)); //写入高8位
GPIO_SetBits(LCD_GPIO, LCD_E); //E置高,发出数据
delay_ms(1); //等待1ms
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
GPIO_Write(LCD_GPIO, (dat << 4)); //写入低4位
GPIO_SetBits(LCD_GPIO, LCD_E); //E置高,发出数据
delay_ms(1); //等待1ms
GPIO_ResetBits(LCD_GPIO, LCD_E); //E置低
}
void LCD_WriteString(unsigned char x,unsigned char y,unsigned char *s)
{
unsigned char addr;
if(y == 0)
addr = 0x80 + x; //第一行地址
else
addr = 0xc0 + x; //第二行地址
LCD_WriteCmd(addr); //设置显示地址
while(*s)
{
LCD_WriteData(*s++);
}
}
void delay_ms(uint32_t ms)
{
uint32_t i;
while(ms--)
{
i = 12000;
while(i--);
}
}
```
阅读全文