stm32–使用GPIO驱动1608液晶屏

Posted on Posted in 单片机

初学stm32,同时手中还有一块51板子给的1602液晶屏,于是打算写个(误)小程序来驱动。

1602字符型LCD简介

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

如图
QQ截图20160418203150

1602LCD主要技术参数:

显示容量:16×2个字符

芯片工作电压:4.5—5.5V

工作电流:2.0mA(5.0V)

模块最佳工作电压:5.0V

字符尺寸:2.95×4.35(W×H)mm

引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表所示:

编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 数据
2 VDD 电源正极 10 D3 数据
3 VL 液晶显示偏压 11 D4 数据
4 RS 数据/命令选择 12 D5 数据
5 R/W 读/写选择 13 D6 数据
6 E 使能信号 14 D7 数据
7 D0 数据 15 BLA 背光源正极
8 D1 数据 16 BLK 背光源负极

顺便附上指令库

1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:

序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 清显示 0 0 0 0 0 0 0 0 0 1
2 光标返回 0 0 0 0 0 0 0 0 1 *
3 置输入模式 0 0 0 0 0 0 0 1 I/D S
4 显示开/关控制 0 0 0 0 0 0 1 D C B
5 光标或字符移位 0 0 0 0 0 1 S/C R/L * *
6 置功能 0 0 0 0 1 DL N F * *
7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址
8 置数据存贮器地址 0 0 1 显示数据存贮器地址
9 读忙标志或地址 0 1 BF 计数器地址
10 写数到CGRAM或DDRAM) 1 0 要写的数据内容
11 从CGRAM或DDRAM读数 1 1 读出的数据内容

10.8.2.5 1602LCD的一般初始化(复位)过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号

写指令38H:显示模式设置

写指令08H:显示关闭

写指令01H:显示清屏

写指令06H:显示光标移动设置

写指令0CH:显示开及光标设置

好了,有了这些信息基本上可以写一个程序来驱动这个屏幕了(内置字符和地址啥的不放啦,再放过来太多了)

我使用的开发板是在购买元件时候随便买的,很小的板子芯片是STM32F103VET6 (大小参考旁边的stlink仿真器)

我们学习的是cube库,老库已经不更新了,所以学习新库。

这个板子的一行的io口并不是连续的…于是我随便插上了一行,这导致我写io的时候造成了很大的不便从io包括了C、A、B、E

一开始我给液晶屏的供电使用的是板子得高低电平,但是这个控制器工作电压是5v,导致我并不能驱动,后来借到了杜板线后我使用仿真器的5v来供电。

由于使用的是gpio,所以我无法从液晶屏中读取忙信号,所以我采用较长延时的方式来处理。而且我并不需要知道当前显示的信息。所以不能读取并无大碍。

然后开始新建工程,可视化的cube使这一步相当的便利,选好片子,仿真方式,配置好时钟,将GPIO使能…

然后输出到Keil uVision5开始写代码,由于我是直接靠控制GPIO的高低电平来写的,所以极度复杂(尽管我已经做了封装):

主函数:

最后选择stlink,烧录进片子….

如果你认真的看了我的代码,那么你一定会想从46行到129行都是什么鬼 ,其实就是输出高低电平让显示屏大触LYPHIX几个字。

那么我已经封装起来了为什么不直接调用呢?理由很简单:

当我封装好了之后,班导看了下跟我说:你没必要继续写了,你通过GPIO让他显示出来说明已经明白原理了,回头用SPI通讯写吧。

不过后来我发现这个1602并没有SPI,只有并行通讯,于是我又买了12846液晶屏,敬请期待….

最后放个成功的图

最后:VL一定要接个电阻….不然你会一直以为你失败了,直到你从上方看自己的液晶屏….别问我怎么知道的…