基于C语言,使用51单片机——STC8H8K64U的MAX7219多模块驱动。
前言MAX7219是一款串行接口8位LED显示驱动器且可以通过本身串口进行方便的数据输出端可以用于级连扩展。但在看完华冠“简单易懂”的说明书后想寻找参考内容时那却没能看到合适的博客。于是在研究许久后终于写出了这份博客。随着时代发展本人将会附上一份方便大家理解的动画希望对各位的理解有所帮助。下附链接。『来自123云盘用户13682220684的分享』max7219_visualization.html链接https://1845710317.share.123pan.cn/123pan/xNF5Td-l0Asd?pwd1234#提取码1234一、MAX7219配置1.寄存器介绍想看的下载即可这是链接https://atta.szlcsc.com/upload/public/pdf/source/20250320/A1C5A4C883565133B533D6D2D3ABB2D9.pdf?Expires4070880000OSSAccessKeyIdLTAIJDIkh7KmGS1HSignaturejWoQVFMgJDrVLM5XhkqAxNC2W%2F0%3Dresponse-content-dispositionattachment%3Bfilename%3DC6705351_%25E6%2595%25B0%25E7%25A0%2581%25E7%25AE%25A1%25E9%25A9%25B1%25E5%258A%25A8_MAX7219M-TR_%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6_%25E6%2595%25B0%25E7%25A0%2581%25E7%25AE%25A1%25E9%25A9%25B1%25E5%258A%25A8_MAX7219M%252FTR_%25E4%25B8%25AD%25E6%2596%2587%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6.PDFhttps://atta.szlcsc.com/upload/public/pdf/source/20250320/A1C5A4C883565133B533D6D2D3ABB2D9.pdf?Expires4070880000OSSAccessKeyIdLTAIJDIkh7KmGS1HSignaturejWoQVFMgJDrVLM5XhkqAxNC2W%2F0%3Dresponse-content-dispositionattachment%3Bfilename%3DC6705351_%25E6%2595%25B0%25E7%25A0%2581%25E7%25AE%25A1%25E9%25A9%25B1%25E5%258A%25A8_MAX7219M-TR_%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6_%25E6%2595%25B0%25E7%25A0%2581%25E7%25AE%25A1%25E9%25A9%25B1%25E5%258A%25A8_MAX7219M%252FTR_%25E4%25B8%25AD%25E6%2596%2587%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6.PDF2.芯片使用方法1数据如何写入代码会在后文出现并一并给予解释。接下来我们引用华冠说明书的一段话对MAX7219 来说串行数据在 DIN 输入 16 位数据包无论 LOAD 端处于何种状态 在时钟的上升沿时数据均移入到内部16 位移位寄存器。然后数据在LOAD/CS 的上升沿时 被载入数据寄存器或控制寄存器。LOAD/CS 端在第 16 个时钟的上升沿的同时或之后下个时钟上升沿之前变为高电平否则数据将会丢失。在DIN 端的数据传输到移位寄存器在 16.5 个时钟周期之后出现在 DOUT 端。在时钟的下降沿数据将被输出。数据位标记为 D0-D15如表 1 表示。D8-D11 为寄存器地址位。D0-D7 为数据位。D12-D15 为无效位。 在传输过程中首先接收到的是D15 位MSB 是非常重要的一位。我们说人话就是DIN决定数据内容CLK读取数据CS决定数据何时写入。注意说明书写的“LOAD/CS 端在第 16 个时钟的上升沿的同时或之后下个时钟上升沿之前变为高电平否则数据将会丢失。”的丢失是指从DOUT输出所以用多少个芯片有“芯片数×16”个CLK上升沿。void Max7219_SendByte(unsigned short int tData) { unsigned char i 0x00; for(i 0;i16;i) { // // CLK准备发送 // MAX7219_CLK 0; // // DIN准备数据 // MAX7219_DIN tData 0x8000; tData tData1; dealy_us(1); // //在时钟的上升沿将数据移入到16位移位寄存器 // MAX7219_CLK 1; dealy_us(1); } }DIN是低位先发所以将首位与0x8000进行与运算来保证只有第一位为有效数据在进行左移读取下一位具体过程可以使用WINDOWS自带计算器的程序员模式按照前文进行自行操作此处不做演示。2数据写入方式1.逐个写入这种方式就是利用DOUT把数据输入下一个芯片但想要让前一个芯片不受影响要用上一个寄存器接下来再次引用华冠说明书的原话当有多个MAX7219 被串联使用时要用到不工作寄存器。把所有的芯片的 LOAD/CS 端联 接在一起把相邻的芯片的DOUT 和 DIN 连接在一起。DOUT 是一个 CMOS 逻辑电平的输 出口他可以很容易的驱动下一级的 DIN 口。例如如果四个 MAX7219 被连接起来使用然 后向第四个芯片发送必要的 16 位数据后面跟三组 NO-OP 代码如表 2 所示十六进制的 0xXX0X。然后使 LOAD/CS 端变为高电平数据则被载入所有芯片。前三个芯片接收到NO-OP 代码第四个接收到有效数据。我们可以把“不工作寄存器” 直接理解为垃圾桶。在配置一个芯片时所有在这个芯片之前的芯片将要使用不工作寄存器。但这种方式过于繁杂要将数据多次写入且浪费时间故在此不写出代码。代码没有写出有大佬可以补充2.统一写入此方式无需使用不工作寄存器只需利用DOUT即可此时数据可以一并统一写入最后一个寄存器此时再LOAD/CS变为高电平数据会一起写入寄存器。// // // 数据发送 // // void Max7219_SetReg(unsigned short int Reg_Addrdata[],unsigned char num) { unsigned char i; // // 拉低CS // MAX7219_CS 0; // // 数据发送 // for(i 0;inum;i) { Max7219_SendByte(Reg_Addrdata[i]); dealy_us(2); } // // 拉高CS结束发送将16位数据写入寄存器 // MAX7219_CS 1; }代码中“Reg_Addrdata”使用short int 是因为后续代码数据是16位需使用两个字节。后续代码使用short int也是这个原因。不清楚的看这个:char、int、long、float、double等在64位下占多少字节_char int float double占几个字节-CSDN博客https://blog.csdn.net/li975242487/article/details/121395693我使用了两个参数1.地址与数据的结合“Reg_Addrdata”注这是个数组有什么用途后文会提及2.芯片数量这决定数据发送函数将执行几次。3.初始化设置这部分使用了数组不懂什么是数组、二维数组、三维数组的看这个链接C 数组 | 菜鸟教程https://www.runoob.com/cprogramming/c-arrays.html1基本设置void Max7219_Init(unsigned char num) { unsigned char i 0; unsigned short int conf[5][2]{ {0x0900,0x0900},//配置译码寄存器 {0x0A0A,0x0A0A},//配置灯光强度寄存器 强度范围 0x00 ~ 0x0F {0x0B07,0x0B07},//配置扫描界限寄存器 显示一行的灯数量 {0x0C01,0x0C01},//配置关闭模式寄存器 {0x0F00,0x0F00} //配置显示测试寄存器 0 正常状态 1显示测试只会全亮 }; for(i 0;i5;i) { Max7219_SetReg(conf[i],2); delay_ms(1); } }此处“Max7219_SetReg”函数在使用二维数组“conf”时存入前文提及的参数“Reg_Addrdata”。注意我是将三维数组偷懒写成二维数组的各位可以使用三维数组2清屏// // // MAX7219清屏 // // void cleandisplay(unsigned char num) { unsigned char i; unsigned short int cleandisplay[8][2]{ {0x0100,0x0100}, {0x0200,0x0200}, {0x0300,0x0300}, {0x0400,0x0400}, {0x0500,0x0500}, {0x0600,0x0600}, {0x0700,0x0700}, {0x0800,0x0800} }; for(i 0;i8;i) { Max7219_SetReg(cleandisplay[i],2); } }4.显示图画// // // MAX7219显示 // // void display_img() { unsigned char i; unsigned short int img[8][2]{ {0x0180,0x0101}, {0x0240,0x0202}, {0x0320,0x0304}, {0x0410,0x0408}, {0x0508,0x0510}, {0x0604,0x0620}, {0x0702,0x0740}, {0x0801,0x0880} }; for(i 0;i8;i) { Max7219_SetReg(img[i],2); } }二、总代码#include STC8H.h #include intrins.h // // // 引脚定义 // // sbit MAX7219_CLKP1^0; //时钟 sbit MAX7219_CSP1^1; //片选 sbit MAX7219_DINP1^4; //数据输入 // // // IO口初始化 // // void STC8H_IOinit(void) { P0M1 0; P0M0 0; P1M1 0; P1M0 0; P2M1 0; P2M0 0; P3M1 0; P3M0 0; P4M1 0; P4M0 0; P5M1 0; P5M0 0; P6M1 0; P6M0 0; P7M1 0; P7M0 0; P0 0XFF; P1 0XFF; P2 0XFF; P3 0XFF; P4 0XFF; P5 0XFF; P6 0XFF; P7 0XFF; } // // // 微秒级延时 // // void dealy_us( unsigned int time) { unsigned int i; unsigned int j; for(j0; jtime;j) { for(i0;i1;i) { _nop_(); } } } // // // 毫秒级延时 // // void delay_ms( unsigned int time) { unsigned int i; unsigned int j; for(j0; jtime;j) { for(i0;i4996;i) { _nop_(); } } } // // // 发送字节 // // void Max7219_SendByte(unsigned short int tData) { unsigned char i 0x00; for(i 0;i16;i) { // // CLK准备发送 // MAX7219_CLK 0; // // DIN准备数据 // MAX7219_DIN tData 0x8000; tData tData1; dealy_us(1); // //在时钟的上升沿将数据移入到16位移位寄存器 // MAX7219_CLK 1; dealy_us(1); } } // // // 数据发送 // // void Max7219_SetReg(unsigned short int Reg_Addrdata[],unsigned char num) { unsigned char i; // // 拉低CS // MAX7219_CS 0; // // 数据发送 // for(i 0;inum;i) { Max7219_SendByte(Reg_Addrdata[i]); dealy_us(2); } // // 拉高CS结束发送将16位数据写入寄存器 // MAX7219_CS 1; } // // // MAX7219初始化配置 // // void Max7219_Init(unsigned char num) { unsigned char i 0; unsigned short int conf[5][2]{ {0x0900,0x0900},//配置译码寄存器 {0x0A0A,0x0A0A},//配置灯光强度寄存器 强度范围 0x00 ~ 0x0F {0x0B07,0x0B07},//配置扫描界限寄存器 显示一行的灯数量 {0x0C01,0x0C01},//配置关闭模式寄存器 {0x0F00,0x0F00} //配置显示测试寄存器 0 正常状态 1显示测试只会全亮 }; for(i 0;i5;i) { Max7219_SetReg(conf[i],2); delay_ms(1); } } // // // MAX7219清屏 // // void cleandisplay(unsigned char num) { unsigned char i; unsigned short int cleandisplay[8][2]{ {0x0100,0x0100}, {0x0200,0x0200}, {0x0300,0x0300}, {0x0400,0x0400}, {0x0500,0x0500}, {0x0600,0x0600}, {0x0700,0x0700}, {0x0800,0x0800} }; for(i 0;i8;i) { Max7219_SetReg(cleandisplay[i],2); } } // // // MAX7219显示 // // void display_img() { unsigned char i; unsigned short int img[8][2]{ {0x0180,0x0101}, {0x0240,0x0202}, {0x0320,0x0304}, {0x0410,0x0408}, {0x0508,0x0510}, {0x0604,0x0620}, {0x0702,0x0740}, {0x0801,0x0880} }; for(i 0;i8;i) { Max7219_SetReg(img[i],2); } } void main() { // // // IO口初始化 // // STC8H_IOinit(); // // // MAX7219初始化 // // Max7219_Init(); cleandisplay(); // // // MAX7219显示图形 // //1 display_img(); while(1) { } // // // 结束 // //1 }结语希望对大家有帮助也欢迎各位批评、建议如有更优代码愿意分享作者也将参考您的代码完善本文方便他人同时也会注明代码来源。

相关新闻

字符串逆序的N种玩法:从入门到入坑指南(程序员必看!)

字符串逆序的N种玩法:从入门到入坑指南(程序员必看!)

文章目录一、为什么要把字符串倒过来?(你以为只是玩?)二、编程语言大乱斗:谁家方法最风骚?1. Python篇(一行代码教你做人)2. JavaScript篇(数组才是本体)3. J…

2026/7/29 18:15:47阅读更多 →
如何在STM32上快速实现VL53L1X激光测距:5分钟完成精准距离检测

如何在STM32上快速实现VL53L1X激光测距:5分钟完成精准距离检测

如何在STM32上快速实现VL53L1X激光测距:5分钟完成精准距离检测 【免费下载链接】VL53L1X_STM32_module A simple VL53L1x module for STM32.Using software IIC 项目地址: https://gitcode.com/gh_mirrors/vl/VL53L1X_STM32_module 想要为你的STM32项目添加…

2026/7/29 18:15:47阅读更多 →
springboot2.7.18 升级到3.1.5过程

springboot2.7.18 升级到3.1.5过程

Spring Boot3 从 2.7.10升级到3.1.5有以下几个点需要注意。 JDK版本支持从JDK 17-19版本javax.servlet切换到jakarta.servletspring.redis配置切换为spring.data.redisSpring Cloud 2022.0.4Spring Cloud Alibaba 2022.0.0.0 Spring Boot3 升级参考文档: spring bo…

2026/7/29 18:15:47阅读更多 →
2026年应届生黑科技榜单9款AI论文平台实测!

2026年应届生黑科技榜单9款AI论文平台实测!

前言:AI 写论文乱象频发,实测 8 款工具理清适配边界 每到毕业季,本科生、硕博生都会扎堆寻找 AI 论文辅助工具,市面上各类写作软件层出不穷,但普遍存在几类硬伤:虚假参考文献、无法匹配本校格式、不支持公式…

2026/7/29 19:35:26阅读更多 →
SteamAuto终极指南:3步掌握多平台饰品自动化交易技巧

SteamAuto终极指南:3步掌握多平台饰品自动化交易技巧

SteamAuto终极指南:3步掌握多平台饰品自动化交易技巧 【免费下载链接】Steamauto 免费开源的网易BUFF、悠悠有品、ECOsteam、C5Game、Steam的全自动收发货解决方案 项目地址: https://gitcode.com/GitHub_Trending/st/Steamauto SteamAuto是一款免费开源的自…

2026/7/29 19:35:26阅读更多 →
为什么92%的心理咨询师拒绝使用AI评估报告?:一线从业者亲述3大信任断点及重建路径

为什么92%的心理咨询师拒绝使用AI评估报告?:一线从业者亲述3大信任断点及重建路径

更多请点击: https://kaifayun.com 第一章:AI心理健康评估的现状与核心争议 近年来,AI驱动的心理健康评估工具迅速进入临床辅助、数字疗法和企业EAP(员工援助计划)场景。主流方案多基于自然语言处理分析用户文本/语音…

2026/7/29 19:35:26阅读更多 →
计算机毕业设计之O2O生鲜食品订购

计算机毕业设计之O2O生鲜食品订购

近年来互联网络的迅猛发展和电子终端设备的普及,赋予了各行业充足的发展空间。微信小程序的O2O生鲜食品订购相比于传统信息技术,时效性是它最大的特色,已经在电子娱乐、经济等中发挥着举足轻重的作用。短时间内迅速扩大了线上管理系统的规模。…

2026/7/29 19:35:26阅读更多 →
三步打造您的数字记忆保险箱:GetQzonehistory完整备份方案

三步打造您的数字记忆保险箱:GetQzonehistory完整备份方案

三步打造您的数字记忆保险箱:GetQzonehistory完整备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还记得那些年您在QQ空间留下的青春印记吗?那些深夜的感…

2026/7/29 19:35:26阅读更多 →
10分钟学会ccapi:Python开发者的加密货币交易API入门教程

10分钟学会ccapi:Python开发者的加密货币交易API入门教程

10分钟学会ccapi:Python开发者的加密货币交易API入门教程 【免费下载链接】ccapi A header-only C library for interacting with crypto exchanges. Bindings for Python, Java, C#, Go, and Javascript are provided. 项目地址: https://gitcode.com/gh_mirrors…

2026/7/29 19:33:25阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →