上一篇文章介绍了常见的屏幕类型和原理硬件电路。 在这篇文章中,我们将深入了解点阵屏。 我将尽可能详细地介绍它,并逐步向您展示从创建项目到编写代码的过程。
我使用的点阵屏正是上一篇文章中出现的。 它由四块0788BS 8*8点阵屏组成,由四块74HC595芯片级联驱动。 除电源输入(VCC、GND)外,只需要三个单片机IO口即可驱动。 我的屏幕是在tb的七旭电子卖的。 我展示的点阵屏是我自己做的。 电路布局和芯片布局不同,但原理是一样的。 他们只提供51微控制器代码。 这里我将使用STM32F103ZET6来驱动它。 工程代码由STM32CubeMX生成,并使用MDK_ARM(Keil5)上的HAL库快速开发。
74HC595的使用说明:
我们先来看看如何点亮屏幕:
首先我们要了解74HC595是一款什么样的芯片:
74HC595是串行输入、并行输出锁存器。
引脚14:DS(SER)SI(),串行数据输入引脚
引脚13:OE,输出使能控制引脚。 它只有在电量低时才会输出,因此将其连接到GND。
引脚12:RCK,存储寄存器时钟输入引脚。 在上升沿,数据从移位寄存器传输到存储寄存器。
引脚11:SCK,移位寄存器时钟引脚。 在上升沿,移位寄存器中的位数据整体向后移动并接受新的位(从DS输入)。
引脚10:MR,低电平时,清除移位寄存器中已有的位数据,一般不用,接高电平即可。
引脚 9:串行数据导出引脚。 当移位寄存器中的数据超过8位时,现有的位就会被“挤掉”,也就是出去的地方。 用于级联595。
QA~QH:8位并行输出引脚
介绍引脚不是很有用。 有兴趣的朋友,网上有很多关于这款芯片的介绍。 这里重点关注引脚9、11、12、QA~QH。
这里我们向74HC595串行输入一个8位二进制数0000 0001。 这个8位二进制数是IO口上的高低电平转换,也是用来控制点阵屏上各个LED灯的状态电平数据。 595芯片为串行输入,接收输入数据的引脚为引脚14(DS),接收到的数据由QA~QH输出。 引脚11 SCK(SH)控制移位寄存器,在上升沿(拉高)有效。 其工作过程可以理解为将子弹装入弹匣。 当单片机IO输出0000 0001时,首先向595芯片输入数据0,SH上升(拉高),595中的(移位)寄存器放入这个数据,它占据QA的位置,SH拉低(不拉高)如何可以再次进入上升沿),当第二位数据0放入寄存器时,第一位数据从原来的QA位置转移到QB,新传入的第二位数据占据QA位置。 当最后一位数据输入时,QA~QH 对应的是 1000 0000。在这个过程中,由于数据在移位寄存器的 QA~QH 中,所以 QA~QH 还没有输出。 这里用QA~QH来表示寄存器空间中的位置,这样大家更容易理解。
此时,所有8位二进制数(一个字节)已经输入完毕,我们需要并行输出。 这里我们需要用到595芯片的第12脚ST(RCK)存储寄存器时钟输入引脚。 上升沿有效,被拉高。 ,然后移位寄存器数据传送到存储寄存器,然后从QA~QH引脚并行输出。
这里,595芯片可以仅使用一个数据引脚输入来输出8位控制。 这样就大大节省了单片机的IO资源。
现在回到点阵屏,四块0788B点阵屏是8*8–>16*16。 理论上来说,控制一块点阵屏需要四颗595芯片,需要占用单片机的4个IO口来输入数据,而我这里的屏幕只有一个引脚用于输入数据。 是这个原因吗? 这里讲一下74H595的级联功能。 这就是我们要讲的595芯片的9脚的功能。
将上一个595芯片的9针连接到下一个595芯片的14针DS。 想想之前我们只放了8位数据,移位寄存器就满了。 当我们放入新数据时,原来在寄存器 QH 中的数据将移出到引脚 9 输出。 相当于向下一个芯片输入数据。
首先点亮屏幕:
了解了74HC595的原理之后,我们就可以编写代码了。
所需的微控制器IO资源:ST、SH、DS。 电源连接到5V和GND。
打开 CubeMX:
通过选择 MCU 来启动我的项目,因此单击中间深蓝色部分的第一个浅蓝色框:访问 MCU 选择器。
选择适合您的芯片型号。 这里我选择STM32F103ZE(T6)。
我的包是LQFP144,选择两台机器并创建一个新的项目模板。
在 SYS 处调试并选择串行线。
RCC 配置和时钟树配置可以根据您的选择进行更改。 新手可以先选择这个。
只需在其中输入 72 并按 Enter 键即可。
配置定时器,
打开定时器中断。
选择GPIO:
根据个人实际情况配置项目工程文件等:
最后点击GENERATE CODE生成项目文件,点击OpenProject打开项目。
生成的项目首先编译整个项目。 编译成功后,我们开始编写代码。
main函数内的宏定义:
要显示的字符:
几个定义:
HC595驱动函数和定时器中断回调函数:
int main(void) 主函数:
编译,没有错误,但是这里会出现警告,因为HAL_GPIO_WritePin(ST_GPIO_Port,ST_Pin,0);的写入问题; 该类函数的第三个参数可以替换为GPIO_PIN_RESET或GPIO_PIN_SET。
连接开发板和屏,下载代码到开发板,上电。 emmmm效果是这样的:
如果多个屏幕连接在一起,使用此代码可以在每个屏幕上显示相同的内容:
四个屏幕连在一起,滚动显示内容:
屏幕的PCB上有一块丝印。 将上一屏的 OUT 与下一屏的 IN 同等连接。 奇旭电子建议使用跳线帽,但是连接的时候你会发现会不平整(跳线帽就是原因),我这里的个人经验是使用2*5P 2.54母座,将母座的针脚短接成对使用,插入后会更平整。
CubeMX配置保持不变,生成一个新项目,或者使用原项目代码稍加改动。 这里我是在原来的代码基础上稍作改动,非常简单。
宏定义不变,修改字体模型(部分注释掉的是上面亮屏的,可以参考对比):
595驱动函数和中断回调函数,修改为:
int main(void) 主函数:
编译无误,将屏连接到单片开发板,下载代码到开发板,上电。 看:
【4个16*16点阵屏滚动显示_74HC595级联效果-Bilibili】
补充(1)–字符提取:
打开字体提取软件,选择字符模式作为模式。 点击选项进行配置,如图。
选择你需要的字体,在中间输入你想要生成字体的汉字,点击生成字体。 生成的字体如下。 您可以直接复制并访问它,也可以保存字体并生成文本文件进行存储。
补充(2)–关于此屏幕:
关于这款屏幕及其详细信息,朋友们可以前往奇旭电子的tb获取。 这可以让我更好地理解我编写的代码。 这不是它的广告。 我不认识他们,哈哈哈