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

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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • STM32——PS2遥控手柄[通俗易懂]

    STM32——PS2遥控手柄[通俗易懂]本问介绍了PS2手柄通信原理及使用方法,文末有STM32F1独取手柄数据的例程。

    2022年5月13日
  • php小皮怎么用_搭建php环境

    php小皮怎么用_搭建php环境本文主要和大家分享php环境搭建wampserver、Apache、Mysql和phpphp环境搭建csdnphp环境搭建详解,希望能帮助到大家。wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-32b搭建php环境。在win下,下载wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-32b.e…

    2022年9月22日
  • 深度学习 CNN卷积神经网络 LeNet-5详解

    深度学习 CNN卷积神经网络 LeNet-5详解卷积神经网络(ConvolutionalNeuralNetwork,CNN):是一种常见的深度学习架构,受生物自然视觉认知机制(动物视觉皮层细胞负责检测光学信号)启发而来,是一种特殊的多层前馈神经网络。它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。一般神经网络VS卷积神经网络:相同点:卷积神经网络也使用

    2022年5月22日
  • goland 2021.5激活码【注册码】[通俗易懂]

    goland 2021.5激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
  • 通达OA 工作流运行异常情况的紧急处理(图文)[通俗易懂]

    通达OA 工作流运行异常情况的紧急处理(图文)[通俗易懂]本文整理自通达OA技术交流群(QQ群号:378591362)群友交流内容。一位朋友的工作流设计和运行突然出现故障,显示的数据部分都不正常,如下图:经过重启所有服务(包括缓存服务)现象依旧。清理了cache下workflow里面的文件,没用后经查找,是前一天把cache下的workflow文件夹清掉了,缓存服务不会自动重建。重新手动建立文件夹后恢复正常。

    2022年6月23日
  • java静态全局变量和全局变量的区别_java静态全局变量

    java静态全局变量和全局变量的区别_java静态全局变量Java的面向对象的代码结构会使在多个位置引用变量更加困难。有时也很难确定给定变量应属于哪个类,尤其是当它是一个广泛使用的值(例如数据库连接器或数学常数)时。Java全局变量怎么定义?在许多语言中,当遇到这样的问题时,我们可以声明一个全局变量。但是,不幸的是,Java从技术上不允许在全局范围内创建变量。在本文中,我们将介绍如何在Java中模拟和使用全局变量。什么是全局变量?全局变量是可以从任何范围访问的变量。许多编程语言都具有用于声明全局变量的特殊语法,例如,Python使我们可以使

    2022年8月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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