STC12硬件SPI驱动MAX7219点阵LED
max7219是一个用于驱动8位7段数字LED或者8x8点阵LED的驱动芯片, 以列扫描的方式, 用16个pin管理64个发光点, 显示8个数字时刷新率为500-1300Hz, 典型值为800Hz.
pin脚功能
- DIG0 - DIG7: 这个8个pin, 分别代表一个7段数字+点号
- SEGA - SEGG, DP: A-G代表7段数字里的每一段, DP代表Decimal Point, 小数点
- 每一段的驱动电流是40mA
- V+, GND: 电压和接地
- DIN: 串行数据输入
- CS: 片选, 当电平下拉后从串行口按时脉移入移位寄存器, 当电平上拉后锁存
- DOUT: 串行数据输出, 这个口用于级联
- 级联的N个MAX7219, 可以看成有N个串联的16位移位寄存器
- 如果要对第N位操作, 要经过16*N个时脉后数据才能到达, 这时候CS上拉, 将命令锁存.
通信方式
- 通信协议为SPI, 接受SPI Master的输入, 不返回数据
- MAX7219, 不管CS是什么电平, DIN的数据都会随着时脉写入移位寄存器
- MAX7221, 只有当CS下拉时, 才会将数据从DIN写入, 或者往DOUT写出
- CS必须在第16个数写入后, 下一个时脉上升沿到来前拉高, 否则数据会丢失
- 数据是MSB, 大值在前
- 对于16个bit, 前8个(D15-D08)为地址, 实际上使用的只有D11-D8这4个, 后8个D7-D0为数据
通信的前地址
共有14个
- 0x?0: No-Op, 用于将数据输出到DOUT
- 0x?1: 第一个数字
- 0x?2: 第二个
- 0x?3: 第三个
- 0x?4: 第四个
- 0x?5: 第五个
- 0x?6: 第六个
- 0x?7: 第七个
- 0x?8: 第八个
- 0x?9: 数字解码模式
- 0x?A: 亮度, 0x00到0xFF
- 0x?B: 扫描限制(数字个数), 这个对亮度有影响, 如果两个级联的这个参数不一样, 亮度会不一样
- 0x?C: 状态(关闭, 普通)
- 0x?F: 测试状态(测试, 普通)
级联传输
- 使用No-Op地址操作实现级联传输
- 例如, 对第四块MAX7219写入
- 首先按预设地址写入地址, 写入值
- 写入三次NoOp操作(0x?0??), ?号代表随意值
- 当CS拉高后, 这4个MAX7219都会收到操作地址和操作值, 但是前三块看到的是NoOp, 所以前三块无动作
用STC12的硬件SPI驱动
STC12C5A60S2系列是带内建SPI支持的, 基于HML_FwLib_STC12封装库可以方便地实现MAX7219的点阵驱动, 代码:
/*****************************************************************************/
/**
* \file spi_max7219.c
* \author IOsetting | iosetting@outlook.com
* \date
* \brief Example code of SPI driving dot matrix module
* \note The module chip is MAX7219, pin connection:
* P1_3 => CS,
* P1_5(MOSI) => DIN,
* P1_7(SPCLK) => CLK
*
* \version v0.1
* \ingroup example
* \remarks test-board: Minimum System; test-MCU: STC12C5AF56S2
******************************************************************************/
/*****************************************************************************
* header file *
*****************************************************************************/
#include "hml/hml.h"
#define CS P1_3
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
const byte numbers[]={
0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0-.
0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1-
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2-
0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3-
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4-
0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5-
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7-
0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9-
0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00};
void Write7219(byte addr, byte dat)
{
CS = 0;
SPI_RW(addr);
SPI_RW(dat);
CS = 1;
}
/*****************************************************************************/
/**
* \author IOsetting
* \date
* \brief initialize MAX7219
* \param[in]
* \return none
* \ingroup example
* \remarks
******************************************************************************/
void Init7219(void)
{
Write7219(SHUT_DOWN,0x01); // 0x00:shutdown, 0x01:normal
Write7219(DECODE_MODE,0x00); // No decode
Write7219(SCAN_LIMIT,0x07); // Display 8 digits
Write7219(INTENSITY,0x00); // 0x00:min, 0xFF:max
Write7219(DISPLAY_TEST,0x00); // 0x00:normal, 0x01:test mode
}
/*****************************************************************************/
/**
* \author IOsetting
* \date
* \brief initialize SPI
* \param[in]
* \return none
* \ingroup example
* \remarks
******************************************************************************/
void initSys(void)
{
SPI_configTypeDef sc;
sc.baudRatePrescaler = SPI_BaudRatePrescaler_64;
sc.cpha = SPI_CPHA_1Edge;
sc.cpol = SPI_CPOL_low;
sc.firstBit = SPI_FirstBit_MSB;
sc.pinmap = SPI_pinmap_P1;
sc.nss = SPI_NSS_Soft;
sc.mode = SPI_Mode_Master;
SPI_config(&sc);
SPI_cmd(ENABLE);
}
void main()
{
initSys();
Init7219();
P1_3 = 1;
byte pos = 0, size = sizeof(numbers), i, j;
while(1)
{
for (i = 0; i < 8; i++)
{
j = (pos + i) % size;
Write7219(i + 1, numbers[j]);
}
pos = (pos + 1) % size;
sleep(100);
}
}
STC12硬件SPI驱动MAX7219点阵LED的更多相关文章
- 联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- linux enc28j60网卡驱动移植(硬件spi和模拟spi)
本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...
- MicroPython:基于TPYBoard集合MAX7219点阵模块制作表白女神神器
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 又是一年毕业季,只有到了毕业季才会意识到自己又 ...
- 4412 SPI驱动
1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...
- STM32—4线SPI驱动SSD1306 OLED
文章目录 一.OLED简介 二.驱动SSD1306所需知识 1.引脚介绍 2.通信时序 3.显存GRAM 4.字库 5.SSD1306基本命令 三.代码讲解 1.相关引脚配置 2.模拟SPI通信 3. ...
- 基于TQ2440的SPI驱动学习(OLED)
平台简介 开发板:TQ2440 (NandFlash:256M 内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...
- 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
随机推荐
- 【C++】类概念及使用
类定义中不允许对数据成员初始化 类外只能访问公有部分 类成员必须指定访问属性 类的成员函数是实现对封装的数据成员进行操作的唯一途径 类定义中不允许定义本类对象,因无法预知大小 类与结构形式相同,唯一区 ...
- [转帖]堆表&索引组织表
堆表&索引组织表 https://zhuanlan.zhihu.com/p/487271927 15 人赞同了该文章 很多大佬强调学习一定要看"原版英文材料". 比如再 ...
- [转帖]Linux下清理内存和Cache方法见下文:
https://www.cnblogs.com/the-tops/p/8798630.html 暂时目前的环境处理方法比较简单: 在root用户下添加计划任务: */10 * * * * sync;e ...
- [转帖]Nginx优化与防盗链
目录 一.配置Nginx隐藏版本号 1.第一种方法修改配置文件 2.第二种方法修改源码文件,重新编译安装 二.修改Nginx用户与组 三.配置Nginx网页缓存时间 四.实现Nginx的日志分割 五. ...
- [转帖]Elasticsearch8关闭安全认证功能
https://juejin.cn/post/7203637198120878137 Elasticsearch8在默认情况下是开启安全认证的.但在开发或者简单尝试时,希望关闭它. 关闭安全认证的方式 ...
- [转帖]金仓数据库KingbaseES V8R6索引坏块故障处理
案例说明: 在执行表数据查询时,出现下图所示错误,索引故障导致表无法访问,后重建索引问题解决.本案例复现了此类故障解决过程. 适用版本: KingbaseES V8R3/R6 一.创建测试环境 # 表 ...
- [转帖]调试springboot数据库系统应用时常用debug日志配置, 解决问题缩小范围时常用
https://www.yihaomen.com/article/1853.html 摘要: 用 spring boot 开发应用时,在遇到麻烦问题时,经常会打开debug日志,下面记录一个通用的思路 ...
- ARC150D - Removing Gacha (树上期望)
Link 题意: 给一棵 \(n\) 个节点的树,称一个点是好的,当且仅当它到根的路径上都是黑色(包括自己).每次在不好的节点中随机选一个把它涂成黑色(不管原来它是否是白的),直到所有点都是好的为止. ...
- It is currently in use by another Gradle instance
FAILURE: Build failed with an exception. * What went wrong: Could not create service of type TaskHis ...
- 机器学习从入门到放弃:卷积神经网络CNN(一)
一.前言 在上一篇中我们使用全连接网络,来构建我们的手写数字图片识别应用,取得了很好的效果.但是值得注意的是,在实验的最后,最后我们无论把 LOSS 优化到如何低,似乎都无法在测试数据集 test d ...