8x8点阵遇到树莓派
利用树莓派的SPI引脚,编写C代码并编译驱动8x8点阵屏, 通过非常简单的方式完成并附上源码。 有兴趣的可以尝试一下。
标签
嵌入式系统
测试
显示
骑驴玩儿漂移
更新2021-12-31
新疆农业大学
1427

今天,花了半个小时尝试了一下苏老师给我的一块8x8点阵屏幕,产品项目链接:https://www.eetree.cn/project/detail/55

从外观上看,做工非常精致,很喜欢,小巧的外型配合一个树莓派zero应该非常nice~

该板搭载了两块74HC595D的高速移位寄存器芯片,并且LED都采用了红色的超级小封装,竟然没有一颗坏的,做工真不戳~这里点个赞!

我一般使用树莓派比较多,因此,决定利用树莓派来点亮它,手头正好一个树莓派4B, 索性就阅读了一下这个芯片的datasheet, 找到芯片的接口信息。

Fgw8gELdxNvrAEWNsCh6DpicxFkT

和常见的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查看引脚状态了,如下图:

FhaAaVS3_vO3riHSYRWDC3BE4he7

然后可以看到物理引脚的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,有兴趣可以试试。

Fia9Sn3sFEkNRzZGZ0Rwe7NopVg7

执行生成的二进制文件就可以看到一颗心的图标了。

./matrix

显示效果:

Fge7xmb8a57Fi6jx0oprHrs_Gk56

好了,就写到这里,喜欢的记得一键三连哈!

白了个白,哦,要对苏老师说一声:谢谢哈!也预祝新年快乐~

 

团队介绍
无人成团,个人瞎玩儿。
团队成员
骑驴玩儿漂移
漂移菌 AKA 骑驴玩儿漂移 电子爱好者(菜鸟) Linux 开源爱好者 航模爱好者(初级菜鸟) 无线电爱好者(初级菜鸟) 嵌入式爱好者(初级菜鸟) 蘑菇云创客空间资深会员
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号