stm32f103c8t6与lcd1602接线
时间: 2023-09-26 21:14:50 浏览: 88
以下是STM32F103C8T6与LCD1602的接线方法:
STM32F103C8T6 | LCD1602
------------ | -------------
PB0 | RS
PB1 | RW
PB2 | EN
PA0-PA7 | D0-D7
其中,RS为寄存器选择引脚,高电平为写数据,低电平为写指令;RW为读写控制引脚,高电平为读,低电平为写;EN为使能引脚,高电平有效,当EN由低电平变为高电平时,数据被写入LCD1602;D0-D7为数据引脚,用于传输数据。
需要注意的是,STM32F103C8T6的输出电压为3.3V,而LCD1602的工作电压为5V,因此需要使用电压转换器或者通过电阻分压的方法将STM32F103C8T6的输出电压降低至5V。
相关问题
STM32F103C8T6驱动LCD1602
要驱动LCD1602需要使用STM32F103C8T6的GPIO口,首先需要确定使用的是4位还是8位数据总线。接线图如下:
```
LCD1602 STM32F103C8T6
----------------------------------
RS PA0
RW GND
E PA1
D0 NC
D1 NC
D2 NC
D3 NC
D4 PA2
D5 PA3
D6 PA4
D7 PA5
```
其中,RS为寄存器选择,RW为读写控制,E为操作使能,D0-D7为数据总线。
接线好后,需要编写STM32F103C8T6的驱动程序,以下是一个简单的4位数据总线驱动程序示例:
```c
#include "stm32f10x.h"
#include "lcd1602.h"
void delay_us(uint32_t us)
{
volatile uint32_t i = 7 * us;
while (i--) {}
}
void delay_ms(uint32_t ms)
{
volatile uint32_t i = 7000 * ms;
while (i--) {}
}
void lcd1602_send_byte(uint8_t data, uint8_t mode)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // RS: 0
GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(data & 0x10)); // D4
GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(data & 0x20)); // D5
GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(data & 0x40)); // D6
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(data & 0x80)); // D7
GPIO_SetBits(GPIOA, GPIO_Pin_1); // E: 1
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // E: 0
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_2); // D4: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_3); // D5: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // D6: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // D7: 0
delay_us(50);
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // RS: 0
GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(data << 4 & 0x10)); // D4
GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(data << 4 & 0x20)); // D5
GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(data << 4 & 0x40)); // D6
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(data << 4 & 0x80)); // D7
GPIO_SetBits(GPIOA, GPIO_Pin_1); // E: 1
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // E: 0
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_2); // D4: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_3); // D5: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_4); // D6: 0
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // D7: 0
delay_us(50);
}
void lcd1602_init(void)
{
delay_ms(100);
lcd1602_send_byte(0x33, 0); // 初始化
delay_ms(5);
lcd1602_send_byte(0x32, 0); // 初始化
delay_us(100);
lcd1602_send_byte(0x28, 0); // 设置数据位数、显示行数
delay_us(100);
lcd1602_send_byte(0x06, 0); // 设置输入模式
delay_us(100);
lcd1602_send_byte(0x0C, 0); // 开启显示
delay_us(100);
lcd1602_send_byte(0x01, 0); // 清屏
delay_ms(5);
}
void lcd1602_puts(uint8_t x, uint8_t y, char* str)
{
uint8_t i = 0;
if (y == 0) {
lcd1602_send_byte(0x80 + x, 0);
} else {
lcd1602_send_byte(0xC0 + x, 0);
}
while (str[i]) {
lcd1602_send_byte(str[i], 1);
i++;
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
lcd1602_init();
while (1) {
lcd1602_puts(0, 0, "Hello, world!");
delay_ms(1000);
lcd1602_send_byte(0x01, 0); // 清屏
delay_ms(5);
}
}
```
在程序中,`lcd1602_send_byte()`函数用来发送数据或指令,`lcd1602_init()`函数用来初始化LCD1602,`lcd1602_puts()`函数用来在指定位置打印字符串。`delay_us()`和`delay_ms()`函数用来进行延时,可以根据需要进行调整。
该程序通过GPIO控制LCD1602,可以在LCD上显示Hello, world!。你可以根据需要修改代码,添加更多功能。
stm32f103c8t6驱动lcd12864接线通常
通常,将LCD模块的引脚与STM32F103C8T6控制器的引脚连接如下:
LCD模块引脚 | STM32F103C8T6控制器引脚
---|---
RS | PB12
RW | GND
E | PB13
D0 | 不连接
D1 | 不连接
D2 | 不连接
D3 | 不连接
D4 | PB8
D5 | PB9
D6 | PB10
D7 | PB11
CS1 | 3.3V
CS2 | 3.3V
RST | PB14
VSS | GND
VDD | 3.3V
VO | 可变电阻
需要注意的是,这只是一种通用的接线方式,具体的接线方式可能因不同的LCD模块而有所不同,请根据具体的LCD模块的引脚定义进行接线。
阅读全文