串行数码管显示模块是一种以串行发送接收数据,以并行方式输出数据的功能模块,其特点是输入引脚少,可较好地节省引脚资源。此外,在数据不需要刷新的情况下,它无需MCU的干预即可维持显示。
1. 显示驱动
该串行数码管显示模块与开发板的连接关系为:
SCL---16---D7
SDA---15---D6
CS ---13
由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为:
void Write_Max7219_byte(uint8_t DATA)
  • {
  •          uint8_t i;
  •          digitalWrite(13, LOW);
  •          for(i=8;i>=1;i--)
  •          {
  •               digitalWrite(16, LOW);
  •               if(DATA&0x80)
  •               {
  •                   digitalWrite(15, HIGH);
  •               }
  •               else
  •               {
  •                   digitalWrite(15, LOW);
  •               }
  •               DATA=DATA<<1;
  •               digitalWrite(16, HIGH);
  •         }
  • }
  • 复制代码
    以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:
    void Write_Max7219(uint8_t address,uint8_t dat)
  • {
  •       digitalWrite(13, LOW);
  •       Write_Max7219_byte(address);
  •       Write_Max7219_byte(dat);
  •       digitalWrite(13, HIGH);
  • }
  • 复制代码
    对于串行数码管显示模块,其初始化函数为:
    void Init_MAX7219(void)
  • {
  •     Write_Max7219(0x09, 0xff);
  •     Write_Max7219(0x0a, 0x02);
  •     Write_Max7219(0x0b, 0x07);
  •     Write_Max7219(0x0c, 0x01);
  •     Write_Max7219(0x0f, 0x00);
  • }
  • 复制代码
    要实现串行数码管显示模块的测试,相应的设置函数和循环函数为:
    void setup() {
  •   pinMode(4, OUTPUT);
  •   pinMode(13, OUTPUT);
  •   pinMode(15, OUTPUT);
  •   pinMode(16, OUTPUT);
  •   Init_MAX7219();
  •   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);
  • }

  • void loop() {
  •   GPIO_SetBits(GPIO0, GPIO_Pin_4);
  •   delay(1000);
  •   GPIO_ResetBits(GPIO0, GPIO_Pin_4);
  •   delay(1000);
  • }
  • 复制代码
    这样,就实现了串行数码管显示模块的驱动。
    image.png
    1 显示效果
    2. 电子时钟
    将延时函数与串行数码管的显示功能相结合即可制作一个电子时钟。
    实现电子时钟的程序为:
    uint8_t t=30,m=58,h=23;
  • void setup() {
  •   pinMode(13, OUTPUT);
  •   pinMode(15, OUTPUT);
  •   pinMode(16, OUTPUT);
  •   Init_MAX7219();
  •   Write_Max7219(1,t%10);
  •   Write_Max7219(2,t/10);
  •   Write_Max7219(3,0xa);
  •   Write_Max7219(4,m%10);
  •   Write_Max7219(5,m/10);
  •   Write_Max7219(6,0xa);
  •   Write_Max7219(7,h%10);
  •   Write_Max7219(8,h/10);
  • }

  • void loop() {
  •   delay(1000);
  •   t=t+1;
  •   if(t==60)
  •   {
  •     t=0;
  •     m=m+1;
  •   }
  •   if(m==60)
  •   {
  •     m=0;
  •     h=(h+1)%24;
  •   }
  •   Write_Max7219(1,t%10);
  •   Write_Max7219(2,t/10);
  •   Write_Max7219(4,m%10);
  •   Write_Max7219(5,m/10);
  •   Write_Max7219(4,m%10);
  •   Write_Max7219(5,m/10);
  •   Write_Max7219(7,h%10);
  •   Write_Max7219(8,h/10);
  • }
  • 复制代码
    经程序的上传,其计时效果如图2和图3所示。
    image.png
    2 计时效果1


    image.png
    3 计时效果2