stm32F103驱动lcd1602

接线

GPIOG0-7:D0-D7

RS:GPIOD13

RW:GPIOD14

EN:GPIOD15

程序

lcd.h

#ifndef _lcd_H
#define _lcd_H
#include "stm32f10x.h"
#include "SysTick.h"

#define RS GPIO_Pin_13
#define RW GPIO_Pin_14
#define EN GPIO_Pin_15

/**RS RW EN拉高*/
#define Set_RS GPIO_SetBits(GPIOD, RS)
#define Set_RW GPIO_SetBits(GPIOD, RW)
#define Set_EN GPIO_SetBits(GPIOD, EN)

/**RS RW EN拉低*/
#define	Reset_RS GPIO_ResetBits(GPIOD, RS)
#define	Reset_RW GPIO_ResetBits(GPIOD, RW)
#define	Reset_EN GPIO_ResetBits(GPIOD, EN)

#define GPIO0_7 GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7

/**GPIOG、GPIOD端口初始化**/
void GPIODG_Init(void);

/**lcd写指令函数**/
void Write_Cmd(u16 cmd);

/**lcd初始化函数**/
void Lcd_Init(void);

/**lcd写数据函数**/
void Write_Data(u16 address, u16 data);

#endif

lcd.c

#include "lcd.h"

void GPIODG_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOD,ENABLE); //使能GD管脚时钟
	GPIO_InitTypeDef GPIO_InitStructure;//定义gpio初始化结构体
	GPIO_InitStructure.GPIO_Pin = GPIO0_7;//GPIOG0-7对应D0-D7
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//选择输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	GPIO_Init(GPIOG, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = RS|RW|EN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//选择输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/**lcd写指令函数,按照写操作时序图编写**/
void Write_Cmd(u16 cmd)
{
	
	Reset_RS;
	Reset_RW;
	GPIO_Write(GPIOG, cmd);
	delay_ms(1);
	Set_EN;//拉高使能端
	delay_ms(1);
	Reset_EN;//拉低使能端
}


/**lcd初始化函数**/
void Lcd_Init(void)
{
	Write_Cmd(0x003C);//功能设置
	delay_ms(1);
	Write_Cmd(0x0001);//清屏指令
	delay_ms(1);
	Write_Cmd(0x0006);//输入模式设置
	delay_ms(1);
	Write_Cmd(0x000C);//显示开
}

/**lcd写数据函数,按照写操作时序图编写**/
void Write_Data(u16 address, u16 data)
{
	//地址设置
	Reset_RS;
	Reset_RW;
	//地址第八位为1即D7位为1,所以要加0x0080
	GPIO_Write(GPIOG, address + 0x0080);
	delay_ms(1);
	Set_EN;
	delay_ms(1);
	Reset_EN;
	delay_ms(500);
	
    //显示的数据
	Set_RS;
	Reset_RW;
	GPIO_Write(GPIOG, data);
	delay_ms(1); 
	Set_EN;
	delay_ms(1);
	Reset_EN;
}

main.c

#include "stm32f10x.h"
#include "lcd.h"
#include "SysTick.h"//引入延时函数, 用于形成准确的延时

int main()
{
	SysTick_Init(72);
	GPIODG_Init();
	Lcd_Init();
	delay_ms(500);
	Write_Data(0x0000, 0x0030);//在第一行第一位显示0
}

需要整个工程文件的,看我上传的文件。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于STM32F103驱动LCD1602的示例代码,仅供参考: ``` #include "stm32f10x.h" #include "delay.h" #define RS_GPIO GPIOA #define RS_PIN GPIO_Pin_1 #define E_GPIO GPIOA #define E_PIN GPIO_Pin_2 #define D_GPIO GPIOA #define D4_PIN GPIO_Pin_3 #define D5_PIN GPIO_Pin_4 #define D6_PIN GPIO_Pin_5 #define D7_PIN GPIO_Pin_6 void LCD_Init(void); void LCD_SendByte(uint8_t data, uint8_t rs); void LCD_SendCommand(uint8_t cmd); void LCD_SendData(uint8_t data); void LCD_SendString(char* str); int main(void) { LCD_Init(); LCD_SendString("Hello World!"); while(1); } void LCD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = RS_PIN | E_PIN | D4_PIN | D5_PIN | D6_PIN | D7_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RS_GPIO, &GPIO_InitStructure); GPIO_ResetBits(RS_GPIO, RS_PIN); GPIO_ResetBits(E_GPIO, E_PIN); delay_ms(20); LCD_SendCommand(0x02); // 回到Home位置 LCD_SendCommand(0x28); // 4位数据线,2行,5x8点阵 LCD_SendCommand(0x0c); // 开启显示,不显示光标,不闪烁 LCD_SendCommand(0x06); // 右移光标 LCD_SendCommand(0x01); // 清屏 delay_ms(2); } void LCD_SendByte(uint8_t data, uint8_t rs) { if(rs) { GPIO_SetBits(RS_GPIO, RS_PIN); } else { GPIO_ResetBits(RS_GPIO, RS_PIN); } GPIO_SetBits(E_GPIO, E_PIN); GPIO_WriteBit(D_GPIO, D4_PIN, (data >> 4) & 0x01); GPIO_WriteBit(D_GPIO, D5_PIN, (data >> 5) & 0x01); GPIO_WriteBit(D_GPIO, D6_PIN, (data >> 6) & 0x01); GPIO_WriteBit(D_GPIO, D7_PIN, (data >> 7) & 0x01); delay_us(2); GPIO_ResetBits(E_GPIO, E_PIN); delay_us(2); GPIO_SetBits(E_GPIO, E_PIN); GPIO_WriteBit(D_GPIO, D4_PIN, data & 0x01); GPIO_WriteBit(D_GPIO, D5_PIN, (data >> 1) & 0x01); GPIO_WriteBit(D_GPIO, D6_PIN, (data >> 2) & 0x01); GPIO_WriteBit(D_GPIO, D7_PIN, (data >> 3) & 0x01); delay_us(2); GPIO_ResetBits(E_GPIO, E_PIN); delay_us(50); } void LCD_SendCommand(uint8_t cmd) { LCD_SendByte(cmd, 0); } void LCD_SendData(uint8_t data) { LCD_SendByte(data, 1); } void LCD_SendString(char* str) { while(*str) { LCD_SendData(*str++); } } ``` 该代码使用4位数据线模式控制LCD1602,使用PA1和PA2分别控制RS和E引脚。在LCD_Init函数中初始化GPIO和LCD1602,并在main函数中调用LCD_SendString函数发送字符串"Hello World!"到LCD1602上显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值