发布时间:2025-12-09 13:42:15 浏览次数:4
IO接线:
RS PA8
RW PB6
E PB7
LCD1602_IO PB8-PB15
所有的口都配置成开漏输出,并且所有的口都通过10k电阻上拉至5V,部分电路图如下:
程序代码
LCD1602.C
#include"lcd1602.h"void LCD1602_GPIO_Init_Out()//LCD1602端口初始化,配置为输出{ GPIO_InitTypeDef GPIO_InitStructrue;RCC_APB2PeriphClockCmd(LCD1602_Timer_GPIOA | LCD1602_Timer_GPIOB, ENABLE);//使能端口时钟GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStructrue.GPIO_Pin = LCD1602_RS; GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;//低速输出GPIO_Init(LCD1602_GPIOA, &GPIO_InitStructrue);//初始化GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStructrue.GPIO_Pin = LCD1602_RW | LCD1602_E | LCD1602_IO ; GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;// 低速输出GPIO_Init(LCD1602_GPIOB, &GPIO_InitStructrue);//初始化}void LCD1602_GPIO_Init_Inupt()//LCD1602端口初始化,配置为输入{ GPIO_InitTypeDef GPIO_InitStructrue;RCC_APB2PeriphClockCmd(LCD1602_Timer_GPIOB, ENABLE);//使能端口时钟GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_15; GPIO_Init(LCD1602_GPIOB, &GPIO_InitStructrue);//初始化}void LCD1602_WaitReady(void)//用于LCD忙检测{ u8 sta = 0;LCD1602_GPIO_Init_Out();//LCD1602端口初始化,配置为输出GPIOB->ODR =0xff00;LCD1602_RS_RESET();LCD1602_RW_SET();//读状态LCD1602_GPIO_Init_Inupt();//LCD1602端口初始化,配置为输入do{ LCD1602_E_SET();sta = GPIO_ReadInputDataBit(LCD1602_GPIOB, GPIO_Pin_15);LCD1602_E_RESET();}while(sta);LCD1602_GPIO_Init_Out();//LCD1602端口初始化,配置为输出}void LCD1602_WriteCmd(u16 cmd)//用于写指令{ LCD1602_WaitReady();//等待液晶准备好LCD1602_RS_RESET();LCD1602_RW_RESET();//写指令GPIOB->ODR &=((cmd<< 8)|0x0000);LCD1602_E_SET();LCD1602_E_RESET();//高脉冲}void LCD1602_WriteDate(u16 date)//用于写数据{ LCD1602_WaitReady();//等待液晶准备好LCD1602_RS_SET();LCD1602_RW_RESET();//写数据GPIOB->ODR &=((date << 8)|0x0000);LCD1602_E_SET();LCD1602_E_RESET();//高脉冲}void LCD1620_SetAddress(unsigned char x,unsigned char y){ if(y == 0)LCD1602_WriteCmd(0x80 | x);//从第一行开始显示else LCD1602_WriteCmd(0x80 | 0x40 | x);//从第二行开始显示}void LCD1602_ShowStr(unsigned char x,unsigned char y,unsigned char *str)//LCD1602显示字符串{ LCD1620_SetAddress(x,y);//设置数据地址指针while(*str != '\0')LCD1602_WriteDate(*str++);//写数据 }void LCD1602_ShowChar(unsigned char x,unsigned char y,unsigned char date)//LCD1602显示字符{ LCD1620_SetAddress(x,y);//设置数据地址指针LCD1602_WriteDate(date);//写数据 }void LCD1602_ShowNum(unsigned char x,unsigned char y,unsigned char *str,unsigned char i)//LCD1602显示数字{ LCD1620_SetAddress(x,y);//设置数据地址指针str = str+ i;LCD1602_WriteDate(*str);//写数据}void LCD1602_Init(void)//液晶初始化函数{ LCD1602_GPIO_Init_Out();LCD1602_WriteCmd(0x38);//设置16*2显示,5*7点阵,8位数据接口LCD1602_WriteCmd(0x0c);//开显示,显示光标,光标不闪烁LCD1602_WriteCmd(0x06);//光标加1,屏幕显示不移动LCD1602_WriteCmd(0x01);//清屏}LCD1602.h
#ifndef __LCD1602_H#define __LCD1602_H#include"sys.h"#include"stm32f10x.h"#define LCD1602_Timer_GPIOA RCC_APB2Periph_GPIOA#define LCD1602_Timer_GPIOB RCC_APB2Periph_GPIOB#define LCD1602_GPIOA GPIOA#define LCD1602_GPIOB GPIOB#define LCD1602_RS GPIO_Pin_8#define LCD1602_RW GPIO_Pin_6#define LCD1602_E GPIO_Pin_7#define LCD1602_IO GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15#define LCD1602_I0_SET() GPIO_SetBits(GPIOB, LCD1602_IO)#define LCD1602_RS_SET() GPIO_SetBits(GPIOA,LCD1602_RS)#define LCD1602_RS_RESET() GPIO_ResetBits(GPIOA,LCD1602_RS)#define LCD1602_RW_SET() GPIO_SetBits(GPIOB,LCD1602_RW)#define LCD1602_RW_RESET() GPIO_ResetBits(GPIOB,LCD1602_RW)#define LCD1602_E_SET() GPIO_SetBits(GPIOB,LCD1602_E)#define LCD1602_E_RESET() GPIO_ResetBits(GPIOB,LCD1602_E)void LCD1602_Init(void);//液晶初始化函数void LCD1602_ShowNum(unsigned char x,unsigned char y,unsigned char *str,unsigned char i);//LCD1602显示数字void LCD1602_ShowStr(unsigned char x,unsigned char y,unsigned char *str);//LCD1602显示字符串#endif程序移植时,只需要改.h文件程序,以及.c文件中的
sta = GPIO_ReadInputDataBit(LCD1602_GPIOB, GPIO_Pin_15);GPIOB->ODR &=((cmd<< 8)|0x0000);GPIOB->ODR &=((date << 8)|0x0000);将其配置成你所需要的管脚即可。