【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验八十一:8位LED数码管MAX7219模块(支持级联八位串行3个IO口控制)


MAX7219

是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。


一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。只需要3个IO口即可驱动8位数码管!数码管显示时无闪烁!支持级联!


MAX7219/MAX7221

是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。 只有一个外部寄存器用来设置各个LED的段电流。 MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。 一个方便的四线串行接口可以联接所有通用的微处理器。 每个数据可以寻址在更新时不需要改写所有的显示。MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。 整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。


功能特点

1 10MHz连续串行口

2 独立的LED段控制

3 数字的译码与非译码选择

4 150μA的低功耗关闭模式

5 亮度的数字和模拟控制

6 高电压中断显示

7 共阴极LED显示驱动

8 限制回转电流的段驱动来减少EMI(MAX7221)

9 SPI, QSPI, MICROWIRE串行接口(MAX7221)

10 24脚的 DIP和 SO 封装


管脚描述

管脚 名称 功能

1 DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。 

2,3,5-8,10,11 DIG 0–DIG7 八个数据驱动线路置显示器共阴极为低电平。关闭时7219此管脚输出高电平,7221呈现高阻抗。

4,9 GND 地线 (4脚和9脚必须同时接地)

12 LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。

CS (MAX7221) 片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后16位在cs端的上升沿时被锁定。

13 CLK 时钟序列输入端。最大速率为 10MHz.在时钟的上升沿, 数据移入内部移位寄存器。 下降沿时, 数据从DOUT端输出。MAX7221来说,只有当cs端为低电平时时钟输入才有效。

14-17,20-23 SEG 7 段和小数点驱动,为显示器提供电流。当一个段驱

A–SEG G, 动关闭时,7219的此端呈低电平,7221呈现高阻抗。

DP

18 SET 通过一个电阻连接到VDD 来提高段电流。

19 V+ 正极电压输入,+5V

24 DOUT 串行数据输出端口,从DIN输入的数据在16.5个时钟周期后在此端有效。当使用多个MAX7219/MAX7221时用此端方便扩展。


8位LED数码管MAX7219模块(支持级联八位串行3个IO口控制)

接线说明(以提供的程序为例,可以接任意IO口,在程序中修改端口定义即可):

VCC→5V

GND→GND

DIN→D2

CS  →D3

CLK→D4

模块电原理图


/*

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验八十一: 8位LED数码管MAX7219模块

  能通过验证,上传成功

  仅显示“23456E86”,列为失败的程序,技术有限,只能以后再说了

*/

#include <LedControl.h>

int CLK = 4;

int CS = 3;

int DIN = 2; //这里定义了那三个脚

int PIECENUM = 8;//数码管片数

void setup() {

  pinMode(CLK, OUTPUT);

  pinMode(CS, OUTPUT);

  pinMode(DIN, OUTPUT); //让三个脚都是输出状态

  Delay_xms(50);

  Init_MAX7219(PIECENUM);

  Delay_xms(2000);

}

void loop() {

  Write_Max7219(1, 0x0f, 0x00, 0);    //显示测试:1;测试结束,正常显示:0

  for (int i = 1; i <= 5; i++) {

  Write_Mynum(1, i, i + 1, 1);

  }

  //Write_Mynum(1, 7, '_', 0);

// Write_Mynum(1, 8, '_', 0);

  for (int i = 1; i <= 8; i++) {

  Write_Mynum(2, i, 2, 0);

  }

  for (int i = 1; i <= 8; i++) {

  Write_Mynum(3, i, 3, 0);

  }

  for (int i = 1; i <= 8; i++) {

  Write_Mynum(4, i, 8 - i, 1);

  }

  while (1);

}

void Delay_xms(unsigned int x)

{

  unsigned int i, j;

  for (i = 0; i < x; i++)

  for (j = 0; j < 112; j++);

}

//切换地址,方便写

void Write_Mynum(int pnum,  unsigned char address, unsigned char dat , int dp) {

  Write_Max7219(pnum, 9 - address, dat, dp);

}

//功能:向MAX7219写入字节

//入口参数:DATA,dp显示小数点与否

void Write_Max7219_byte(unsigned char DATA, int dp)

{

  unsigned char i;

  digitalWrite(CS, LOW);

  for (i = 8; i >= 1; i--)

  {

  digitalWrite(CLK, LOW);

  if (i == 8 && dp == 1)

    digitalWrite(DIN, HIGH);

  else {

    if (DATA & 0X80)

      digitalWrite(DIN, HIGH);

    else

      digitalWrite(DIN, LOW);

  }

  DATA <<= 1;

  digitalWrite(CLK, HIGH);

  }

}

//功能:向MAX7219写入数据

//入口参数:pnum数码管片序号,address,dat,dp显示小数点与否

void Write_Max7219(int pnum, unsigned char address, unsigned char dat, int dp)

{

  digitalWrite(CS, LOW);

  Write_Max7219_byte(address, 0);      //写入地址,即数码管编号

  Write_Max7219_byte(dat, dp);          //写入数据,即数码管显示数字

  if (pnum > 1) {

  digitalWrite(CLK, HIGH);

  for (int i = 1; i < pnum; i++) {

    Write_Max7219_byte(0X00, 0);

    Write_Max7219_byte(0X00, 0);

  }

  }

  digitalWrite(CS, HIGH);

}

//Max7219初始化

void Init_MAX7219(int pienum)

{

  for (int i = 1 ; i <= pienum ; i++) {

  Write_Max7219(i, 0x09, 0xff, 0);    //译码方式:BCD码

  Write_Max7219(i, 0x0a, 0x03, 0);    //参数3:亮度

  Write_Max7219(i, 0x0b, 0x07, 0);    //扫描界限;参数3:8个数码管显示

  Write_Max7219(i, 0x0c, 0x01, 0);    //掉电模式:参数3:0,普通模式:1

  Write_Max7219(i, 0x0f, 0x01, 0);    //显示测试:参数3:1;测试结束,正常显示:0

  }

}

实验场景图


实验开源仿真编程(Linkboy V4.2)

程序之二,显示字符3和4,小数点流水移动


实验开源仿真编程(Linkboy V4.2)

程序之三,显示字符88888888和8个小数点


实验开源仿真编程(Linkboy V4.2)

程序之四,循环调整屏幕的16级亮度


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容