MAX7219 Пример работы

Автор: | 06.01.2020

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

В моем случае используется модуль с Aliexpress.

Пример кода написан для микроконтроллера Atmel Atmega8. SPI интерфейс реализован программным методом. Код простой как 3 рубля потому как писался по быстрому.

max7219.h

#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

#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();
}

}

 

 

ПОДДЕРЖАТЬ ПРОЕКТ

Добавить комментарий