STM32驱动LCD1602程序(调试已成功)「建议收藏」

STM32驱动LCD1602程序(调试已成功)「建议收藏」IO接线:RSPA8RWPB6EPB7LCD1602_IOPB8-PB15所有的口都配置成开漏输出,并且所有的口都通过10k电阻上拉至5V,部分电路图如下:程序代码LCD1602.C#include”lcd1602.h”voidLCD1602_GPIO_Init_Out()//LCD1602端口初始化,配置为输出{ GPIO_InitTypeDefGPIO_InitStructrue; RCC_APB2PeriphClockCmd(LCD1602_Timer_GPI

大家好,又见面了,我是你们的朋友全栈君。

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);

将其配置成你所需要的管脚即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160124.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)
blank

相关推荐

  • Cocos2d-x lua游戏开发之安装Lua到mac系统

    Cocos2d-x lua游戏开发之安装Lua到mac系统

  • ISAPI Rewrite实现iis防盗链

    ISAPI Rewrite实现iis防盗链为了实现图片防盗链,根据网络上搜集的资料加上自己的实践,终于实现了iis下的图片防盗链功能。服务器系统windows2003server,参考资料来源:http://www.hua-lin.net/blog/isapi_rewrite-stop-leeching-39实施步骤:1.下载比较出名的www.helicontech.com提供的ISAPIRewrite软件的免费版本(免

  • html导航栏下拉,实现代码[通俗易懂]

    html导航栏下拉,实现代码[通俗易懂]代码如下(示例):<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″> <title></title> <styletype=”text/css”> *{padding:0px;margin:0px;box-sizing:border-box;} ul,ol{list-style-type:none;} a{text-decora

  • 数据仓库之DWD层

    数据仓库之DWD层DWD(DataWareHouseDetail)数据明细层,主要是将从业务数据库中同步过来的ODS层数据进行清洗和整合成相应的事实表。事实表作为数据仓库维度建模的核心,需要紧紧围绕着业务过程来设计。在拿到业务系统的表结构后,进行大概的梳理,再与业务方沟通整个业务过程的流转过程,对业务的整个生命周期进行分析,明确关键的业务步骤,在能满足业务需求的前提下,尽可能设计出更通用的模型。业务方有时只仅仅只是考虑了当下的情况。例如业务想要一个审核通过人员的明细数据,我们设计了一个全量的审核明细表,过了几天,业务

  • 适合做回归分析的数据_时序数据库与实时数据库

    适合做回归分析的数据_时序数据库与实时数据库JTSGeometry关系分析:缓冲区分析(Buffer)包含所有的点在一个指定距离内的多边形和多多边形凸壳分析(ConvexHull)包含几何形体的所有点的最小凸壳多边形(外包多边形)交叉分析(Intersection)A∩B交叉操作就是多边形AB中所有共同点的集合联合分析(Union)AUBAB的联合操作就是AB所有点的集合差异分析(Diff…

  • javascript操作元素的css样式

    javascript操作元素的css样式

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号