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的更多相关文章

  1. 联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  2. 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  3. 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  4. 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  5. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  6. MicroPython:基于TPYBoard集合MAX7219点阵模块制作表白女神神器

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 又是一年毕业季,只有到了毕业季才会意识到自己又 ...

  7. 4412 SPI驱动

    1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...

  8. STM32—4线SPI驱动SSD1306 OLED

    文章目录 一.OLED简介 二.驱动SSD1306所需知识 1.引脚介绍 2.通信时序 3.显存GRAM 4.字库 5.SSD1306基本命令 三.代码讲解 1.相关引脚配置 2.模拟SPI通信 3. ...

  9. 基于TQ2440的SPI驱动学习(OLED)

    平台简介 开发板:TQ2440 (NandFlash:256M  内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...

  10. 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

随机推荐

  1. 14-Verilog for Verification

    Verilog for Verification 1.引言 Testbench也是一个模块(module...endmodule) Testbench没有输入和输出,因为它是一个闭环,自己产生激励,灌 ...

  2. 【MLA】一种内存泄漏分析方法

    项目地址:skullboyer/MLA (github.com) 介绍 MLA 即 Memory Leak Analyzer,是一个排查内存泄漏的分析器 实现机制是在malloc时记录分配位置信息,在 ...

  3. http-自签证书

    1. 背景 证书需要向云服务提供商购买,是需要付费,但用在应用开发场景是不合适的,需要开发者自己自签证书进行测试 2. 工具包 Cygwin a large collection of GNU and ...

  4. Django数据导入导出神器django-import-export使用

    前言 Django以快速开发闻名,但是如果处理数据的导出导入还需要自己写脚本,那就有违"Python之禅"了-- 而且导数据通常需要不同的格式,Excel.csv.json等,每种 ...

  5. [转帖]字符集 AL32UTF8 和 UTF8

    https://blog.51cto.com/comtv/383254# 文章标签职场休闲字符集 AL32UTF8 和 UTF8文章分类数据库阅读数1992 The difference betwee ...

  6. 【转帖】Windows Server 2016与旧版本系统比较

    一.性能和可扩性 特征描述 Windows Server 2012/2012 R2 标准版和数据中心 Windows Server 2016 标准版和数据中心 物理内存(主机)支持 每个物理服务器至多 ...

  7. [转帖]解析Linux gcore: 揭示程序内存捕获的秘密(linuxgcore)

    https://www.dbs724.com/133618.html Linux gcore 是一种在Linux系统中使用命令行工具捕获进程内存内容的方法.它允许程序员制定程序的一个内存快照,从而帮助 ...

  8. [转帖]windows使用net user add用户并加入管理员,从而支持rdp远程登陆访问

    C:\phpstudy_pro\WWW> net user test2 /add 命令成功完成.    C:\phpstudy_pro\WWW> net user test2 Huawei ...

  9. MySQL查询语句(1)

    连接数据库 mysql -hlocalhost -uroot -proot DQL-介绍 DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录 ...

  10. elementui中el-checkbox 选中时的详细介绍

    checkbox-group 把多个checkbox管理为一组(需要注意的坑) 很多时候我们需要会遇见这样的场景. 比如用户需要选择多个值. 这个时候我们需要把多个 checkbox 放置在check ...