08. LED点阵屏与SPI接口控制
内容提示:
- 编写自定义函数
- 变量的作用域
- 节省“主存储器”空间的变量设置方式
- 双重循环
建立自定义函数
函数:一组具有特定功能,并能被重复使用的代码
函数的调用:函数的名称,后面的小括号及括号内的参数。
函数通常放在调用语句之前,
示例:
void cirArea() {int r = 5;float area =3.14 * r * r;Serial.println(area);
}void setup() {Serial.begin(9600);
}
void loop() {cirArea(); //函数执行完毕后,将回到调用函数语句的下一行继续执行。delay(2000);
}
示例改进:设置函数的参数与返回值
float cirArea(int r) { //接收传入一个整数作为变量,并声明函数的返回值类型为float,float area = 3.14 * r ** 2;return area; //将运算结果返回给调用对象
}float ans = cirArea( 20 ); //调用函数,若不传入20,将导致错误,这里ans的类型与函数的返回值类型必须一致。
说明:void 表示函数没有返回值,若函数有返回值,必须把void改成返回值类型。
return 有终结程序执行的含义,凡卸载return后的语句将不会被执行。
return就是返回或传回的意思,
自定义函数的语法格式:
返回值类型 函数名(参数1, 参数2, ……){算式1;算式2;return 运算结果;
}
动手做8-1:建立自定义函数
实验说明:编写一个接受半径值的圆面积计算函数,并在“串口监视器”显示不同半径圆的面积
实验程序:
float ants;float cirArea(int r) {float area = 3.14 *r * r;return area;
}void setup() {Serial.begin(9600);ans = cirArea(10);Serial.println(ans);ans = cirArea(20);Serial.println(ans);
}void loop(){}
有些C语言规定,自定义函数一定要放在前面,假如要放在调用语句之后,程序的开头要加上函数原型(function prototype)声明
float cirArea(int);
void setup(){Serial.begin(9600);float ans = cirArea(10);Serial.println(ans);
}void loop(){}float cirArea(int r){return 3.14 * r * r;
}
认识变量的作用域
- 局部变量:在函数内部声明的变量,作用域仅限于函数内部,而且只有在函数执行期间才存在;函数一旦执行完毕,局部变量将被删除。
- 全局变量:在函数外面定义的变量,能被所有的代码获得。
示例:
int age = 20; //全局变量:定义在函数外void check() { //函数无返回值和参数int age = 10; //局部变量:函数内定义Serial.print("function: ");Serial.println(age); //优先使用局部变量
}void setup(){Serial.begin(9600);check();Serial.print("setup: ");Serial.println(age);
}
void loop(){}
LED点阵屏简介
LED点阵屏(LED Matrix)是一种把数十个LED排列封装在一个方形模块的显示单元。
MAX7219的特点包含:
- 可同时驱动8个共阴极数码管(含小数点),或者一个共阴极8×8矩阵LED。
- 多个MAX7219可串联在一起,构成大型LED显示屏。
- 使用三条线串接Arduino(不用“输出”线,因为它不需要输出数据给微处理器),可驱动多组数码管或LED点阵。
- 只需外接一个电阻,即可限制每个LED的电流
- MAX7219采用一种称为SPI的串行接口。
- SPI(serial Peripheral Interface,串行外设接口),应用:SD内存卡、数字/模拟转换IC、LED控制芯片、佳能相机的EF接环镜头等
- SPI 采用四条线连接主机和外设
- SS:外设选择线(Slave Select),也称为CS(Chip Select,芯片选择线)。
- 输入0: 选取
- 输入1:未选
- MOSI: 从主机向外设发送的数据线(Master OUTPUT, Slave Input).
- MISO: 从外设向主机发送的数据线(Master Input, Slave Output)
- SCK: 串行时钟线(Serial Clock)。
- SS:外设选择线(Slave Select),也称为CS(Chip Select,芯片选择线)。
- Arduino的ATmega系列处理器内建SPI接口,位于数字10~13脚。
- 每个SPI外设都要单独连接一条【外设选择】线
- 全部SPI外设共用数据和时钟线。
- 主机要传送或接收数据之前,必须先将指定设备的SS脚设置为0,然后随着时钟信号将数据依序从MOSI传出,或从MISO传入,结束发送后,再将SS脚设置为1.
- 在采用ATmega328微控制器的Arduino板子上,SPI接口位于数字10~13脚,同时也和控制板右侧的ICSP(In-Circuit Serial Programming)端子相连。
- 在采用ATmega32U4微控制器的Arduino Leonardo控制器上,SPI接口只位于ICSP端子,而且其中的3个引脚相当于数字14-16脚。微控制器预设的外设选择线(SS)也是数字17脚,位于板子左侧,RX(串行接收)灯的左上角的一个焊接点。
- 时钟(clock)信号的用途,SPI装置的数据将跟着时钟的步调发送或接收。
- MAX7219的主要脚位说明:
- DIG0~DIG7:8条数据线,连接阴极(-),典型输入电流值330mA,极限值500mA
- SEG A~G 和DP:数码管和小数点的连接线(阳极),也用于连接LED点阵屏的阳极。典型输出电流37mA,极限100mA。
- ISET:连接LED限流电阻。电阻值的大小取决于LED的消耗电流和电压值
- MAX7219的寄存器与数据传输格式
- 它的内保包含用于设置芯片状态,以及LED显示数据的寄存器
- 数据(digit)寄存器,8个,Digital0(简称D0)~ Digital7,分别存放LED点阵屏每一行的显示内容
- 显示强度(Intensity)寄存器:显示器的亮度除了通过VCC和ISET引脚之间的电阻来调整,也能通过此寄存器来设置,亮度范围0~15
- 显示检测(display test)寄存器:此寄存器设置为1,MAX7219将进入“测试”模式,所有的LED都会被点亮。
- 译码模式(decode mode)寄存器:设置是否用BCD译码功能,设置成0,代表不译码,用于驱动LED点阵屏。
- 停机(shutdown)寄存器:
- 扫描限制(scan limit)寄存器:设置扫描显示器的个数,可能值07,代表显示18个LED数码管,或者LED点阵屏中的1~8行
- 不运行(N0-Op)寄存器:用于串联多个MAX7219时,指定不运行的IC。
- 每个寄存器都有一个识别地址。
- 它的内保包含用于设置芯片状态,以及LED显示数据的寄存器
寄存器名称 | 地址(十六进制) |
---|---|
digit 0 | 0x1 |
digit 1 | 0x2 |
digit 2 | 0x3 |
digit 3 | 0x4 |
digit 4 | 0x5 |
digit 5 | 0x6 |
digit 6 | 0x7 |
digit 7 | 0x8 |
不运行(No-Op) | 0x0 |
译码模式 | 0x9 |
显示强度 | 0xA |
扫描限制 | 0xB |
停机 | 0xC |
显示器检测 | 0xF |
发数据给MAX7219的四个步骤
void max7219(byte reg, byte data) {digitalWrite(SS, LOW); //SS设置成0(选择芯片)SPI.transfer(reg); //发送寄存器的地址SPI.transfer(data); //发送数据digitalWrite(SS, HIGH); //SS线设置成1(取消选择)
}const byte NOOP = 0x0;
const byte DECODEMODE = 0X9;
const byte INTENSITY = 0xA;
const byte SCANLIMIT = 0XB;
const byte SHUTDOWN = 0xC;
const byte DISPLAYTEST = 0xF;const byte symbol[8] = {0x60, 0xF0,0xF0,0x7F,0x07,0x06,0x0c,0x08};
动手做8-3 在矩阵LED上显示音符图像
实验说明:
本实验借助“动手8-1”的成果,通过程序在LED点阵屏上显示音符图样。
实验程序:
#include <SPI.h> //包含SPI扩展库
void max7219(byte reg, byte data) {digitalWrite(SS, LOW); //SS设置成0(选择芯片)SPI.transfer(reg); //发送寄存器的地址SPI.transfer(data); //发送数据digitalWrite(SS, HIGH); //SS线设置成1(取消选择)
}const byte NOOP = 0x0;
const byte DECODEMODE = 0X9;
const byte INTENSITY = 0xA;
const byte SCANLIMIT = 0XB;
const byte SHUTDOWN = 0xC;
const byte DISPLAYTEST = 0xF;const byte symbol[8] = {0x60, 0xF0,0xF0,0x7F,0x07,0x06,0x0c,0x08};void setup(){pinMode(SS, OUTPUT);digitalWrite(SS,HIGH);SPI.begin();max7219(SCANLIMIT, 7);max7219(DECODEMODE, 0);max7219(INTENSITY, 0);max7219(DISPLAYTEST, 0);max7219(SHUTDOWN, 0);for(byte i=0; i<8;i++) {max7219(i + 1, 0);}
}
void loop(){for(byte i=0; i<8;i++) {max7219(i + 1, symbol[i]);}
}
08. LED点阵屏与SPI接口控制相关推荐
- 物联网开发笔记(60)- 使用Micropython开发ESP32开发板之SPI接口控制Micro SD卡TF卡模块
一.目的 这一节我们学习如何使用我们的ESP32开发板来通过SPI接口控制Micro SD卡TF卡模块. 二.环境 ESP32 + SPI接口控制Micro SD卡TF卡模块 + Thonny IDE ...
- 物联网开发笔记(96)- Micropython ESP32开发之SPI接口控制Micro SD卡TF卡模块挂载内存卡
一.目的 这一节我们学习如何使用乐鑫的ESP32开发板连接SD卡模块,进行目录.文件的相关操作. 在早前我们也介绍过TFT SD卡的操作,这里我们重新复习一下. 物联网开发笔记(60)- 使用Micr ...
- 【51单片机快速入门指南】2.4:74HC595、LED点阵屏及其SPI控制
目录 硬知识 IO 口扩展方式-串转并 74HC595 芯片介绍 硬件设计 测试源码 HC74595.c HC74595.h main.h 实验现象 SPI控制 普中51-单核-A2 STC89C52 ...
- [入门教程]详细讲解STM32控制LED点阵屏(HUB75接口)
本文适合初级入门的同学,大佬请绕道.讲解怎么用stm32驱动成品LED点阵屏显示一副七色无灰度的图片,有灰度的图片可以入门后继续研究. 使用软硬件: 软件:Keil5,程序在后面会给出 硬件:STM3 ...
- ESP32-S2上使用SPI接口芯片DM9051NP转以太网的无线物联网网关开发指导
前言 DM9051NP芯片 SPI接口占用管脚数量比以太网PHY的RMII/MII少,PCBA版线布局可更精简.而DM9051NP驱动软件方面,由于源代码已集成在ESP IDF中,可见其可靠度以及网口 ...
- 51单片机LED点阵屏学习笔记
移位寄存器74HC595 移位寄存器74HC595是一个串行转并行的寄存器,该寄存器主要用来控制LED点阵屏,控制原理和控制数码管的原理类似, 下面详细说明一下74HC595的底层原理: SER的作用 ...
- ESP32 入门笔记08:1.54寸(240*240)彩色TFT 显示高清IPS LCD 屏幕 SPI接口
目录 1.屏幕规格 2.原理图 3.程序实现 3.1引脚定义 3.2Adafruit_GFX / Arduino_ST7789版 3.3TFT_eSPI库版 3.3.1配置TFT_eSPI a.选择屏 ...
- 一文教你玩LED点阵屏32*64/64*64----基于STM32
以32*64点阵屏为例,详解LED点阵屏驱动全过程 首先要了解LED点阵屏幕的显示原理. 一般LED点阵屏在某一时间段内只能点亮某一行或者某一列,因为人的眼睛只有24帧速度,只要屏幕速度超过这个值,我 ...
- STM32基于SPI接口的OLED数据显示
文章目录 一.SPI简介 1.1 什么是SPI 1.2 SPI原理 1.3 SPI的连接方式 1.4 协议层 二.OLED 2.1 OLED原理 2.2 点阵编码原理与显示 三.OLED显示实验 3. ...
最新文章
- 易语言 图片插入超级列表框_是谁说图片排版很难?掌握这4个PPT图片排版技巧,1分钟全部搞定...
- 图床失效了?也许你应该试试这个工具
- ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' 解决Mysql错误
- FreeRTOS任务挂起和恢复
- 字符串、数组、randomAccessFile 中length的异同
- How to make BBED(Oracle Block Brower and EDitor Tool) on Unix/Linux/Windows
- Eureka/Zookeeper/Consul三种注册中心的区别
- javascript代码_认识 JavaScript 可执行代码
- GoJS学习-节点渐变背景色
- 卸载ie里的java_怎么样卸载IE10/IE11 两种方法教你快速卸载IE10/IE11
- NOD32升级账号更新器 [ C# | NOD32 | Eset ]
- WRMPS经典Cookie欺骗漏洞批量拿下shell-黑客博客
- Python2写csv文件中文乱码问题及解决方法详解
- 基于Q-learning的无人机三维路径规划(含完整C++代码)
- 1454E - Number of Simple Paths
- ScrollView中嵌套原生控件+WebView+原生控件出现的WebView滑动顶部的冲突问题。
- 手势识别:使用标准2D摄像机建立一个强大的的手势识别系统
- 瑞芯微RK1126平台 通过http接口设置 ISP 饱和度 亮度 对比度
- 复现STGCN CPU版 (ubuntu16.04+pytorch0.4.0+openpose+caffe)
- Gartner发布2023年十大战略技术趋势,元宇宙等技术上榜