Использование MAX7219 совместно с MINI-M4 for STM32

  • Печать

Связка микроконтроллера и микросхемы MAX7219 может использоваться для создания разнообразных устройств индикации. Интересный вариант получается если применить светодиодную матрицу 8х8. Для ее обработки может потребоваться значительный объем памяти, что не является проблемой для контроллеров STM32. Далее приведен пример реализации отображения символов ASCII с использованием платы Mini-M4.

Схема подключения MAX7219 требует применения всего трех проводов для управляющих линий. В примере использованы линии 0,1,13 порта B микроконтроллера. Номера линий объялены в файле библиотеки. В основной программе они никак не используются. Индикатор - готовый китайский модуль. Ничего особенного не представляет.

Работа MAX7219 под управлением STM32

Пример работы MAX7219 под управлением STM32

Программная часть выполнена в виде отдельной библиотеки под mikroC. С небольшими доработками ее можно применить и к другим компиляторам. В состав библиотеки включен набор символов ASCII, имеющих размер 5х7 точек. Также реализованы следующие функции:

void Serial_16(uint8_t REG,uint8_t DAT); - реализует обмен с MAX7219

void MAX7219_Init(); - Инициализация матричной индикации

void MAX7219_test(); - Тест индикатора (Полное заполнение матрицы)

void MAX7219_Brightness(uint8_t Brightness); - Установка яркости  (Значения от 0 до 16)

void MAX7219_draw8x8(uint8_t *buffer); - Вывод символа на экран

Пример программы отображающей символы на матричном дисплее:

#include "MAX7219_Matrix.h"
sbit STAT at ODR13_GPIOC_ODR_bit;
extern unsigned short Matrix_Buffer[][8];
uint8_t z;void Wait() { Delay_ms(500); }
void main() { GPIO_Digital_Output(&GPIOC_BASE, _GPIO_PINMASK_13); GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_0 |_GPIO_PINMASK_1 |_GPIO_PINMASK_13); z=0; STAT=0; MAX7219_Init(); MAX7219_test(); MAX7219_Brightness(8); delay_ms(200); while (1) { z++; Wait(); MAX7219_draw8x8(Matrix_Buffer[z]); STAT = ~STAT; Wait(); if (z>95){z=0;} } }

Исходный код библиотеки MAX7219_Matrix.c и заголовочный файл MAX7219_Matrix.h

#define uint8_t unsigned short
void Serial_16(uint8_t REG,uint8_t DAT);
void MAX7219_Init();
void MAX7219_test();
void MAX7219_Brightness(uint8_t Brightness);
void MAX7219_draw8x8(uint8_t *buffer);
#include "MAX7219_Matrix.h"
sbit CLC at ODR13_GPIOB_ODR_bit;
sbit CS at ODR0_GPIOB_ODR_bit;
sbit DIN at ODR1_GPIOB_ODR_bit;
unsigned short Matrix_Buffer[][8] = {
        {0x00, 0x00, 0x00, 0x00, 0x00},// (space)
        {0x00, 0x00, 0x5F, 0x00, 0x00},// !
        {0x00, 0x07, 0x00, 0x07, 0x00},// "
        {0x14, 0x7F, 0x14, 0x7F, 0x14},// #
        {0x24, 0x2A, 0x7F, 0x2A, 0x12},// $
        {0x23, 0x13, 0x08, 0x64, 0x62},// %
        {0x36, 0x49, 0x55, 0x22, 0x50},// &
        {0x00, 0x05, 0x03, 0x00, 0x00},// '
        {0x00, 0x1C, 0x22, 0x41, 0x00},// (
        {0x00, 0x41, 0x22, 0x1C, 0x00},// )
        {0x08, 0x2A, 0x1C, 0x2A, 0x08},// *
        {0x08, 0x08, 0x3E, 0x08, 0x08},// +
        {0x00, 0x50, 0x30, 0x00, 0x00},// ,
        {0x08, 0x08, 0x08, 0x08, 0x08},// -
        {0x00, 0x30, 0x30, 0x00, 0x00},// .
        {0x20, 0x10, 0x08, 0x04, 0x02},// /
        {0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
        {0x00, 0x42, 0x7F, 0x40, 0x00},// 1
        {0x42, 0x61, 0x51, 0x49, 0x46},// 2
        {0x21, 0x41, 0x45, 0x4B, 0x31},// 3
        {0x18, 0x14, 0x12, 0x7F, 0x10},// 4
        {0x27, 0x45, 0x45, 0x45, 0x39},// 5
        {0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
        {0x01, 0x71, 0x09, 0x05, 0x03},// 7
        {0x36, 0x49, 0x49, 0x49, 0x36},// 8
        {0x06, 0x49, 0x49, 0x29, 0x1E},// 9
        {0x00, 0x36, 0x36, 0x00, 0x00},// :
        {0x00, 0x56, 0x36, 0x00, 0x00},// ;
        {0x00, 0x08, 0x14, 0x22, 0x41},// <
        {0x14, 0x14, 0x14, 0x14, 0x14},// =
        {0x41, 0x22, 0x14, 0x08, 0x00},// >
        {0x02, 0x01, 0x51, 0x09, 0x06},// ?
        {0x32, 0x49, 0x79, 0x41, 0x3E},// @
        {0x7E, 0x11, 0x11, 0x11, 0x7E},// A
        {0x7F, 0x49, 0x49, 0x49, 0x36},// B
        {0x3E, 0x41, 0x41, 0x41, 0x22},// C
        {0x7F, 0x41, 0x41, 0x22, 0x1C},// D
        {0x7F, 0x49, 0x49, 0x49, 0x41},// E
        {0x7F, 0x09, 0x09, 0x01, 0x01},// F
        {0x3E, 0x41, 0x41, 0x51, 0x32},// G
        {0x7F, 0x08, 0x08, 0x08, 0x7F},// H
        {0x00, 0x41, 0x7F, 0x41, 0x00},// I
        {0x20, 0x40, 0x41, 0x3F, 0x01},// J
        {0x7F, 0x08, 0x14, 0x22, 0x41},// K
        {0x7F, 0x40, 0x40, 0x40, 0x40},// L
        {0x7F, 0x02, 0x04, 0x02, 0x7F},// M
        {0x7F, 0x04, 0x08, 0x10, 0x7F},// N
        {0x3E, 0x41, 0x41, 0x41, 0x3E},// O
        {0x7F, 0x09, 0x09, 0x09, 0x06},// P
        {0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
        {0x7F, 0x09, 0x19, 0x29, 0x46},// R
        {0x46, 0x49, 0x49, 0x49, 0x31},// S
        {0x01, 0x01, 0x7F, 0x01, 0x01},// T
        {0x3F, 0x40, 0x40, 0x40, 0x3F},// U
        {0x1F, 0x20, 0x40, 0x20, 0x1F},// V
        {0x7F, 0x20, 0x18, 0x20, 0x7F},// W
        {0x63, 0x14, 0x08, 0x14, 0x63},// X
        {0x03, 0x04, 0x78, 0x04, 0x03},// Y
        {0x61, 0x51, 0x49, 0x45, 0x43},// Z
        {0x00, 0x00, 0x7F, 0x41, 0x41},// [
        {0x02, 0x04, 0x08, 0x10, 0x20},// "\"
        {0x41, 0x41, 0x7F, 0x00, 0x00},// ]
        {0x04, 0x02, 0x01, 0x02, 0x04},// ^
        {0x40, 0x40, 0x40, 0x40, 0x40},// _
        {0x00, 0x01, 0x02, 0x04, 0x00},// `
        {0x20, 0x54, 0x54, 0x54, 0x78},// a
        {0x7F, 0x48, 0x44, 0x44, 0x38},// b
        {0x38, 0x44, 0x44, 0x44, 0x20},// c
        {0x38, 0x44, 0x44, 0x48, 0x7F},// d
        {0x38, 0x54, 0x54, 0x54, 0x18},// e
        {0x08, 0x7E, 0x09, 0x01, 0x02},// f
        {0x08, 0x14, 0x54, 0x54, 0x3C},// g
        {0x7F, 0x08, 0x04, 0x04, 0x78},// h
        {0x00, 0x44, 0x7D, 0x40, 0x00},// i
        {0x20, 0x40, 0x44, 0x3D, 0x00},// j
        {0x00, 0x7F, 0x10, 0x28, 0x44},// k
        {0x00, 0x41, 0x7F, 0x40, 0x00},// l
        {0x7C, 0x04, 0x18, 0x04, 0x78},// m
        {0x7C, 0x08, 0x04, 0x04, 0x78},// n
        {0x38, 0x44, 0x44, 0x44, 0x38},// o
        {0x7C, 0x14, 0x14, 0x14, 0x08},// p
        {0x08, 0x14, 0x14, 0x18, 0x7C},// q
        {0x7C, 0x08, 0x04, 0x04, 0x08},// r
        {0x48, 0x54, 0x54, 0x54, 0x20},// s
        {0x04, 0x3F, 0x44, 0x40, 0x20},// t
        {0x3C, 0x40, 0x40, 0x20, 0x7C},// u
        {0x1C, 0x20, 0x40, 0x20, 0x1C},// v
        {0x3C, 0x40, 0x30, 0x40, 0x3C},// w
        {0x44, 0x28, 0x10, 0x28, 0x44},// x
        {0x0C, 0x50, 0x50, 0x50, 0x3C},// y
        {0x44, 0x64, 0x54, 0x4C, 0x44},// z
        {0x00, 0x08, 0x36, 0x41, 0x00},// {
        {0x00, 0x00, 0x7F, 0x00, 0x00},// |
        {0x00, 0x41, 0x36, 0x08, 0x00},// }
        {0x02, 0x01, 0x02, 0x04, 0x02},// ~
        {0x08, 0x1C, 0x2A, 0x08, 0x08} // <-
};
void Serial_16(uint8_t REG,uint8_t DAT){
  int i;
  CS=0;
  for(i=0;i<8;i++){
    if (REG & 0x0080){DIN=1;}
    CLC=1;
    Delay_US(1);
    CLC=0;
    DIN=0;
    REG = REG << 1;
  }
  for(i=0;i<8;i++){
    if (DAT & 0x0080){DIN=1;}
    CLC=1;
    Delay_US(1);
    CLC=0;
    DIN=0;
    DAT = DAT << 1;
  }
  CS=1;
}
void MAX7219_Init(){      //инициализация MAX7219
  CS=1; Delay_US(1);
  Serial_16(0x0C,0x01);   //Гашение индикатора
  Serial_16(0x0A,0x01);   // Яркость минимум
  Serial_16(0x0B,0x07);   // Используется вся матрица
  Serial_16(0x09,0x00);   // Отключение декодирования
}
void MAX7219_test(){      //Тест матрицы
  Serial_16(0x0F,0x01);   //Включение всей матрицы на 0.2 секунды
  Delay_ms(200);
  Serial_16(0x0F,0x00);
}
void MAX7219_Brightness(uint8_t Brightness){   //Установка яркости (0-15)
  if (Brightness<16){Serial_16(0x0A,Brightness);}
}
void MAX7219_draw8x8(uint8_t *buffer){    //Вывод на экран
uint8_t x;
  for (x=1; x<9; x++){
    Serial_16(x,buffer[x-1]);
  }
}