在通常情况下,数码管的显示方式多采用并行的方式,其通道是编程时的灵活性比较大,但比较耗费引脚资源。为此,这里选用一款以串行方式工作的数码管模块,它是以MAX7219作为控制芯片,具有占用引脚少,无需时时扫描的特点。
该模块的外观如图1时时,它共有5个引脚,分别是:VCC、GND、SCL、CS和SDA。
图1 串行数码管
相关引脚与开发板的连接关系为:
dat----GPIO12
clk-----GPIO13
cs -----GPIO11
Max7219以串行方式发送字节数据的函数为:
void
Write_Max7219_byte(byte DATA) {
byte i;
digitalWrite(11, LOW);
for(i=8;i>=1;i--)
{
digitalWrite(13, LOW);
if(DATA&0x80)
{
digitalWrite(12, HIGH);
}
else
{
digitalWrite(12, LOW);
}
DATA=DATA<<1;
digitalWrite(13, HIGH);
}
}
Max7219写处理的函数为:
void
Write_Max7219(byte address,byte dat)
{
digitalWrite(11, LOW);
Write_Max7219_byte(address); //写入地址,即数码管编号
Write_Max7219_byte(dat); //写入数据,即数码管显示数字
digitalWrite(11, HIGH);
}
MAX7219的初始化函数为:
void
Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff); //译码方式:BCD码
Write_Max7219(0x0a, 0x03); //亮度
Write_Max7219(0x0b, 0x07); //扫描界限;4个数码管显示
Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
Write_Max7219(0x0f, 0x01); //显示测试:1;测试结束,正常显示:0
}
MAX7219的引脚设置函数为:
void setup() {
pinMode(13,
OUTPUT); // clk
pinMode(12,
OUTPUT); // dat
pinMode(11, OUTPUT); // cs
Init_MAX7219();
Write_Max7219(0x0f,
0x00);
}
执行显示测试的程序为:
void loop() {
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
while(1);
}
经下载,其执行效果如图3所示。
图2 驱动测试
在具备数码管显示功能的情况下,通过延时函数的使用可完成一个电子时钟的计时效果,其程序内容如下:
byte hh=12;
byte mm=30;
byte ss=0;
void loop() {
Write_Max7219(1,ss%10);
Write_Max7219(2,ss/10);
Write_Max7219(3,10);
Write_Max7219(4,mm%10);
Write_Max7219(5,mm/10);
Write_Max7219(6,10);
Write_Max7219(7,hh%10);
Write_Max7219(8,hh/10);
delay(1000); while(1);
ss=ss+1;
if(ss>=60)
{
ss=0;
mm=mm+1;
}
if(mm>=60)
{
mm=0;
hh=(hh+1)%24;
}
}
经程序下载,其运行效果如图3所示,由于该数码管的显示符有限,故以“-”来替代“:”作为时间值的分隔符。
图3 电子时钟效果
在Arduino IDE的开发环境下,可轻松地在BPI-Pico-RP2040 开发板上进行采集模拟信号,它单凭一条读取语句即可解决问题。由于ADC的通道3与片内温度传感器相连,为此可以采集该通道的信号来获得温度状态。
读取片内温度并予以显示的程序如下:
float conversion_factor = 3.3/(65535);
float reading;
int
analogPin = 29;
int
temperature = 0;
void loop() {
reading = analogRead(analogPin)*conversion_factor;
temperature = 27 - (reading-0.706)/0.001721;
Write_Max7219(1, temperature%10);
Write_Max7219(2, temperature%100/10);
Write_Max7219(3,15);
Write_Max7219(4,15);
Write_Max7219(5,15);
Write_Max7219(6,15);
Write_Max7219(7,15);
Write_Max7219(8,15);
delay(1000);
}
经程序下载,其运行效果如图4所示。
图4 温度检测
视频:
更多回帖