今天,花了半个小时尝试了一下苏老师给我的一块8x8点阵屏幕,产品项目链接:https://www.eetree.cn/project/detail/55
从外观上看,做工非常精致,很喜欢,小巧的外型配合一个树莓派zero应该非常nice~
该板搭载了两块74HC595D的高速移位寄存器芯片,并且LED都采用了红色的超级小封装,竟然没有一颗坏的,做工真不戳~这里点个赞!
我一般使用树莓派比较多,因此,决定利用树莓派来点亮它,手头正好一个树莓派4B, 索性就阅读了一下这个芯片的datasheet, 找到芯片的接口信息。
和常见的595不同,引脚名让我有点儿猝不及防,后来和其他的595对应着理解了一下,便找到了规律,并对应链接树莓派的引脚也列出来:
SER 可以对应到其他595的DS引脚 ------ 接入树莓派的MOSI引脚
RCK 可以对应到其他595的STCP引脚------ 接入树莓派的CE0引脚
SCK 可以对应到其他595的SHCP引脚------ 接入树莓派的SCLK引脚
树莓派上操作GPIO引脚我使用了wiringpi的库,大家新烧录的系统可能会出现无法使用的情况,因为官方好像和编写wiringpi的那个大神闹了点儿小别扭,原因你懂的,就是为了点儿money。解决方法可以参考我博客上的安装wiringpi的方法,链接如下:
http://www.yoyojacky.com/?p=528
按照我博客的方法安装好wiringPi的库以后,就可以使用gpio readall查看引脚状态了,如下图:
然后可以看到物理引脚的19pin 正好是MOSI, SCLk是23Pin, CE0是24Pin,可以看中间的physical来数物理引脚。
下面列个表,看起来比较清晰:
---------------------------------------------------------------------
BCM 命名方式 | wiringPi 命名方式 | 名称 | 物理引脚命名方式
10 12 MOSI 19
11 14 SCLK 23
8 10 CE0 24
--------------------------------------------------------------------
接好线以后,记得VCC接树莓派的3.3V, GND接GND就好。
接下来是编写代码环节。
利用vim.tiny或vim(需要安装) 打开一个文本编辑器输入下面的内容:
#include <stdio.h> //标准库调用
#include <wiringPi.h> //调用树莓派wiringPi的头文件
#include <wiringPiSPI.h> //使用SPI驱动,因此调用wiringPi的SPI头文件
#include <stdint.h> //调用标准库
int main(void) // 主函数
{
static uint8_t data[2] = {0x00, 0x00}; // 两个595,就定义两组数据集
// static uint8_t monster[8] = {0x42, 0x5A, 0xE7, 0x42, 0x5A, 0x7E, 0x81, 0x99}; // 这是手绘小怪物的16禁止代码,注释掉了。
static uint8_t bigheart[8]={0x00, 0x66, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00}; // 大心跳的图案取模的信息
static uint8_t smallheart[8]={0x00, 0x24, 0x7E, 0x7E, 0x3C, 0x18, 0x00, 0x00}; //小心跳图案的取模信息
wiringPiSetup(); // 初始化wiringPi的库
wiringPiSPISetup(0, 500000); //初始化wiringPiSPI的设置,0表示通道0, 就是对应的CE0, 500000是speed。
while (1){ // 跑大圈
int j = 0; // 定义变量
for (j=0; j<8; j++) // 遍历8次读取数据
{
data[0] = bigheart[j]; //移位寄存器每8位输出一次,我们循环将数据塞入595
data[1] = 0x01 << j; // 实际上是点亮点阵的每个点
wiringPiSPIDataRW(0, data, sizeof(data)); // 关键函数,将数据data写入0 通道,就是告诉595去展示啦~
delay(2); // 延迟是为了让它显示一会儿,在我们的视网膜上驻留片刻,让我们看到闪烁不那么厉害。
}
/*
delay(200);
for (j=0; j<8; j++)
{
data[0] = smallheart[j];
data[1] = 0x01 << j;
wiringPiSPIDataRW(0, data, sizeof(data));
delay(2);
}
delay(200);
*/
}
return 0;
}
我注释了部分代码是为了方便拍照,其中生成点阵的信息是通过朋友站点的小工具实现的:
https://www.smilefrog.net/tools/DotMatrix/
点开根据自己需要的图案点击就好,取模后会自动生成十六进制代码。复制到数据部分。
编写完成后,编译该代码即可,编译时请加入-lwiringPi参数告诉gcc编译器调用外部wiringpi的库。
gcc -o matrix -lwiringPi matrix.c
当然如果你愿意也可以写一个makefile方便编译,下图简单展示了一个super 简单的makefile,有兴趣可以试试。
执行生成的二进制文件就可以看到一颗心的图标了。
./matrix
显示效果:
好了,就写到这里,喜欢的记得一键三连哈!
白了个白,哦,要对苏老师说一声:谢谢哈!也预祝新年快乐~