LCD1602使用4线方式驱动

先介绍硬件环境:
MCU:STM32F030F4,主频16Mhz
显示器:LCD1602A,黄绿屏
软件环境:STM32CUBE_MX
编译器:keil MDK;

不多说了,直接上代码:

头文件

/**
硬件连接:

DB4–PA0
DB5–PA1
DB6–PA3
DB7–PA4

RW—PA9
RS—PA10
E----PB1

/
/

读状态。输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。

读数据。输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。

写命令。输入RS=0,RW=0,E=高脉冲。输出:无。

写数据。输入RS=1,RW=0,E=高脉冲。输出:无。

**/
#ifndef __LCD_1602_H
#define __LCD_1602_H

#include “main.h”

#define COM 0
#define DAT 1
#define LCD_RS_H() HAL_GPIO_WritePin(LCD_RS_GPIO_Port,LCD_RS_Pin,GPIO_PIN_SET)
#define LCD_RS_L() HAL_GPIO_WritePin(LCD_RS_GPIO_Port,LCD_RS_Pin,GPIO_PIN_RESET)
#define LCD_RW_H() HAL_GPIO_WritePin(LCD_RW_GPIO_Port,LCD_RW_Pin,GPIO_PIN_SET)
#define LCD_RW_L() HAL_GPIO_WritePin(LCD_RW_GPIO_Port,LCD_RW_Pin,GPIO_PIN_RESET)
#define LCD_E_H() HAL_GPIO_WritePin(LCD_E_GPIO_Port,LCD_E_Pin,GPIO_PIN_SET)
#define LCD_E_L() HAL_GPIO_WritePin(LCD_E_GPIO_Port,LCD_E_Pin,GPIO_PIN_RESET)
#define LCD_BusySta() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)

void LCD1602_Init(void);
void LCD1602_ClearScreen(void);

void LCD1602_Show_Str(uint8_t x, uint8_t y, uint8_t *str);

#endif

//

C文件

#include “lcd1602.h”
void LCD1602_Set_Cursor(uint8_t x, uint8_t y);

///4线LCD1602
//函数名: delay
//函数功能:LCD1602延时
//注释:
void delay(unsigned char z)
{
unsigned char x,y,j;
for(j=0;j<4;j++)
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}

//
void Send2Lcd(uint8_t data,uint8_t rs)
{
uint8_t i;

if(rs)  LCD_RS_H();
else    LCD_RS_L();LCD_RW_L();for(i=0;i<2;i++)
{GPIOA->ODR = (GPIOA->ODR & 0xfff0) | ((data>>4) & 0x0f);LCD_E_H();delay(50);LCD_E_L();data <<= 4;
}

}

//void LCD_CheckBusy(void)
//{
//
// uint16_t portValue;
// portValue = GPIOA->ODR;
// GPIOA->ODR= portValue | 0X000F;
//
// LCD_RS_L();
// LCD_RW_H();
// LCD_E_H();
//
// while(LCD_BusySta());
// LCD_E_L();
//}

/*向1602写入一字节命令,cmd-待写入命令 */
//写入指令PA4-7 RS-0 RW-0
void LCD1602_Write_Cmd(uint8_t cmd)
{
// LCD_CheckBusy();
Send2Lcd(cmd,COM);
}

/* 向1602写入一字节数据*/
void LCD1602_Write_Dat(uint8_t dat)
{
// LCD_CheckBusy();
Send2Lcd(dat,DAT);
}

/清屏/
void LCD1602_ClearScreen(void)
{
LCD1602_Write_Cmd(0x01);
HAL_Delay(2);
}

/* 设置RAM其实地址,即光标位置,(X,Y)对应屏幕上的字符坐标 */
void LCD1602_Set_Cursor(uint8_t x, uint8_t y)
{
// uint8_t addr;
//
// if (y == 0)
// addr = 0x00 + x;
// else
// addr = 0x40 + x;
// LCD1602_Write_Cmd(addr | 0x80);
switch(x)
{
case 0:
y|=0x80;
break;
case 1:
y|=0xc0;
break;
}
LCD1602_Write_Cmd(y);
}

/* 在液晶上显示字符串,(X,Y)-对应屏幕上的其实坐标,str-字符串指针 */
void LCD1602_Show_Str(uint8_t x, uint8_t y, uint8_t *str)
{
LCD1602_Set_Cursor(x, y);
while(*str != ‘\0’)
{
LCD1602_Write_Dat(*str++);
}
}

/* 初始化液晶 */
void LCD1602_Init(void)
{
HAL_Delay(50);
LCD1602_Write_Cmd(0x33);
HAL_Delay(5);
LCD1602_Write_Cmd(0x32);
HAL_Delay(1);

LCD1602_Write_Cmd(0x28); //16*2显示,5*7点阵,4位数据口
HAL_Delay(1); LCD1602_Write_Cmd(0x01);  //清屏
HAL_Delay(1);LCD1602_Write_Cmd(0x06);   //文字不动,地址自动+1
HAL_Delay(1);
LCD1602_Write_Cmd(0x0c);

}
//
//

注意项点:

1、在发送数据的时候,因为硬件是直接在PA低四位,所以采用了寄存器直接输出,如果不是,请调整数据发送。
2、初始化命令要按上面程序的来,我之前用其他初始化程序,在debug完成后,能正常显示,但是直接上电就总是显示不正常。

最后来个图片验证一下吧。

LCD1602的四线驱动相关推荐

  1. STC单片机LCD1602四线驱动模式显示ADC采样电压和温度

    STC单片机LCD1602四线驱动模式显示ADC采样电压和温度

  2. PIC16F877A与Proteus仿真-LCD1602并口驱动

    LCD1602并口驱动 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块.它是由字符型液晶显示屏(LCD).控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻.电容元件 ...

  3. LCD1602显示屏的驱动设置及例程

    一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚).我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条 ...

  4. STM32F103驱动HCSR04超声波测距显示

    STM32F103驱动HCSR04超声波测距显示 目录 超声波模块介绍 ①实物图 ②产品说明 ③电气参数 ④超声波工作原理 驱动代码 ①STM32配置初始化代码 ①超声波驱动应用代码 ②超声波距离计算 ...

  5. 液晶LCD1602使用介绍

    液晶LCD1602简介 LCD1602液晶也叫1602字符型液晶模块,LCD1602液晶是一种专门用来显示字母.数字.符号的点阵型液晶模块.LCD1602液晶是由若干个5x7点阵字符位组成,每个点阵字 ...

  6. 基于STM8的数字温度计设计

    基于STM8的数字温度计设计 这是在2021年12月初完成的一次课程设计,全程自己设计组装完成,现作为记录存档发布,大家也可以借鉴本文来完成自己的课程设计.(建议使用电脑阅读) 课程设计目录 基于ST ...

  7. 基于51单片机的密码锁多路测温+测距+语音播报

    本项目为单片机课程设计成果,实物制作+proteus仿真,相关资料见结尾. 文章目录 前言 一.系统组成 1.1 WT588D语音模块 1.2 JQ8900-TF语音模块 1.3 HC-SR04-P超 ...

  8. 编程王 kingofcoders.com

    欢迎您   频道 Java .net c++ php VB SQL Server PostgreSQL 开源   Solaris BSD Linux Microsoft Mysql Oracle Bo ...

  9. 51智能小车超声波避障

    #include <REGX52.H> #include <intrins.h> #include <QXA51.H>sbit DU = P2^6;//数码管段选 ...

  10. 热电阻 热电偶 测量电路_热电偶和热电阻有什么区别?

    在日常工作当中经常遇到使用温度测量仪表,热电阻与热电偶同为温度测量仪表,同一个测温地点我们选择热电阻还是选择热电偶呢?今天我们来全面剖析一下. 热电偶的结构 热电偶前端接合的形状有 3 种类型,如下图 ...

最新文章

  1. 阈值Java_亲测有效!一种完美动态阈值白平衡算法 Java实现。
  2. 机器学习中常见的损失函数
  3. request.getRealPath不推荐使用
  4. Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】
  5. 国家统计局:政府统计应用大数据的主要障碍
  6. dismiss和remove_关于dismiss的用法,dismiss和fire的区别?
  7. 堪称懒人神器?Reno5新配色一键美妆功能,素颜出镜也不怕
  8. 产业分析:短视频平台研究报告
  9. 三分钟让闲置电脑变云主机
  10. PCB四层板常规层压结构及设计阻焊-深亚电子
  11. 利用积分区域的对称性计算重积分
  12. SEO必备软件,网站SEO分析优化辅助工具
  13. 计算机网络(考研复试)
  14. sprintboot 微信静默授权代码
  15. 人民日报:在集成电路基础研究中奋力攀登
  16. python小游戏 2048小游戏设计与实现
  17. RT-ThreadBearPi 开发笔记 -- 为小熊派开发板制作 RT-Thread BSP 包
  18. Android手机摇杆
  19. 3.1.8 OS之快表的地址变换结构
  20. Abz-Ala-Phe-Arg-Phe-Ser-Gln-EDDnp,1926163-28-1,激肽释放酶的多样作用

热门文章

  1. Yandex浏览器安装crx插件
  2. java red5 流媒体服务_[Red5]Red5之Flash流媒体服务器的安装与使用教程完整版(组图)...
  3. 《计算机网络 自顶向下方法》(第7版)答案(第四章)
  4. 数据结构常见面试题,一网打尽!
  5. JavaSE、JavaEE、JavaME
  6. 【数字逻辑】学习笔记 第三章 Part2 逻辑函数的化简
  7. JAVA网络编程个人笔记 第五章 URL和URI
  8. 数字图像处理——基于matlab的车牌号识别
  9. 无人驾驶技术(交通标志识别)
  10. Vue 炫酷 Echarts 图表