MAX7219 /MAX7221 — это драйвер 7 сегментного светодиодного индикатора, с общим катодом способный вывести 8 разрядов. Управление им производится по SPI интерфейсу.
В моем случае используется модуль с Aliexpress.

Пример кода написан для микроконтроллера Atmel Atmega8. SPI интерфейс реализован программным методом. Код простой как 3 рубля потому как писался по быстрому.
max7219.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#define DIN PB0 #define CS PB1 #define CLK PB2 #define PORTLED PORTB #define DDRLED DDRB #define BIT(bit) (1<<(bit)) unsigned char digit[] = { 0xFE, // 0 ABCDEFG 0x30, // 1 0123456 0x6D, // 2 0x79, // 3 0x33, // 4 0x5B, // 5 0x5F, // 6 0x70, // 7 0x7F, // 8 0x7B, // 9 0x01 // - }; void send_byte(unsigned char byte) { for(unsigned char i = 0; i < 8; i++)//в цикле посылаем побитно { if(byte & 0x80)//если бит=1 посылаем 1 { PORTLED|=BIT(DIN); PORTLED|=BIT(CLK); _delay_us(1); PORTLED&=~BIT(CLK); } else//иначе посылаем 0 { PORTLED&=~BIT(DIN); PORTLED|=BIT(CLK); _delay_us(1); PORTLED&=~BIT(CLK); } byte = (byte<<1); } } void init() //Инициализация { PORTLED&=~BIT(CS); //Тест индикатора выключен send_byte(0x0F); //Адресс send_byte(0x00); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); //Выйти из сна send_byte(0x0C); //Адресс send_byte(0x01); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); //Кол-во задействованных символов send_byte(0x0B); //Адресс send_byte(0x07); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); //Дешифраторы отключены send_byte(0x09); //Адресс send_byte(0x00); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); //Интенсивность свечения send_byte(0x0A); //Адресс send_byte(0x56); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); PORTLED&=~BIT(DIN); } void clear() //Очищение дисплея { PORTLED&=~BIT(CS); send_byte(0x01); //Адресс send_byte(0x00); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x02); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x03); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x04); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x05); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x06); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x07); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); send_byte(0x08); send_byte(0x00); PORTLED|=BIT(CS); PORTLED&=~BIT(CS); PORTLED&=~BIT(DIN); } |
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#define F_CPU 1000000UL // 1 MHz #include <avr\io.h> #include <util\delay.h> #include <stdio.h> #include "max7219.h" unsigned char data,adress; int main (void){ DDRLED=(1<<DIN)|(1<<CS)|(1<<CLK);// настраиваем нужные выводы порта на выход PORTLED=(0<<DIN)|(0<<CS)|(0<<CLK); data = 1; adress = 0x0F; init(); clear(); while(1){ for(unsigned char i = 0; i < 10; i++)//в цикле посылаем побитно { PORTLED&=~BIT(CS); send_byte(0x4); //Адресс send_byte(digit[i]); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); PORTLED&=~BIT(DIN); _delay_ms(1000); } for(unsigned char i = 0; i < 10; i++)//в цикле посылаем побитно { PORTLED&=~BIT(CS); send_byte(0x5); //Адресс send_byte(digit[i]); // Данные PORTLED|=BIT(CS); PORTLED&=~BIT(CS); PORTLED&=~BIT(DIN); _delay_ms(1000); } clear(); } } |