середу, 14 січня 2015 р.

Семисегментний дисплей на MAX7219 Atmega8 CodeVision AVR







//****************************************************
#include <mega8.h>
#include <delay.h>
//----------------------------------------------------
// Задамо глобальні контанти та змінні
#define PIN_SCK PORTB5  // Тактовий вихід Master_SPI 
#define PIN_MOSI PORTB3 // Вихід даних Master_SPI 
#define PIN_SS PORTB2   // Вибір кристала (завантаження на вихід)  
#define PIN_SS1 PORTB1  // Вибір кристала для паралельного запису
                        //(можна використовувати для збільшення швидкодії)
#define ON 1            
#define OFF 0

#define cs_lo PORTB |= (1<<PIN_SS) // 1 на SS дані можуть записуватись в регістр зсуву (16-розрядн.)  
#define cs_hi PORTB &= ~(1<<PIN_SS)// 0 на SS активний вибір кристала 
                                //(завантаження записаних даних на порт)

#define cs1_lo PORTB |= (1<<PIN_SS1) //те саме для паралельного запису 
#define cs1_hi PORTB &= ~(1<<PIN_SS1)
//------------------------------------------------------
//Адреси регістрів настройки МАХ7219
//------------------------------------------------------
#define MAX7219_MODE_DECODE 0x09    // Декадний режим
#define MAX7219_MODE_INTENSITY 0x0A // Яскравість 
#define MAX7219_MODE_SCAN_LIMIT 0x0B// Розряднісь дисплея
#define MAX7219_MODE_POWER 0x0C     // Вимкнення живлення
#define MAX7219_MODE_TEST 0x0F      // Тестовий режим
#define MAX7219_MODE_NOOP 0x00      // Пуста операція
       //Адреси регістрів сегментів
const unsigned char MAX7219_DIGIT[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

#define MAX7219_CHAR_BLANK 0xF     // пустота
#define MAX7219_CHAR_NEGATIVE 0xA  // мінус "-" 
#define BYTE_SYMBOL 0x08          //Максимальна кількість символів

unsigned char active_digit = 8;//к-ть активних розрядів дисплея 
unsigned char number_of_displays=2;//к-ть активних дисплеїв 
unsigned char i,j;// лічильники

//-------------------------------------------------------------------------
//Фукнція запису по SPI (апаратний)
//-------------------------------------------------------------------------
void spiSendByte (char databyte)
{
SPDR = databyte; //записуємо переданий байт в регістр SPI
while (!(SPSR & (1 << SPIF)));//Якщо все передали флаг встановлюється і ми виходими з функції
}
//-----------------------------------------------------------------------------------------
// Функція запису в MAX7219 (пакет 16-біт!!)
//-----------------------------------------------------------------------------------------
void MAX7219_writeData(char data_register, char data,unsigned char chip)
{
unsigned short k;

cs_hi; //Slave_SPI активний може приймати дані 
spiSendByte(data_register);//старші біти передаємо першими
spiSendByte(data);// їх потіснять на місця біти байта даних
for(k=0;k<2*chip;k++)// якщо кількість каскадованих чіпів більша 1(лічба з 0) 
{// то потрібно подати пару пустих байтів після посилки 
//вони продавлять дані на наступний чіп 
spiSendByte(MAX7219_MODE_NOOP);  // пустота операція 
}// Нічого не робить але зміщає все на один байт 
//не дивуйтесь, спочатку пишеться адреса а потім дані які є адресою? але це вже не грає ніякої ролі бо операція пуста!!
// головне зміщення на 2 байта а все інше не міняється! 
cs_lo; // Закриваємо Slave_SPI
}

/*Функція очистки дисплея може колись знадобиться...
void clear_display()
{
unsigned char i,j;
for(j=0;j<3;j++)
{
for(i=1;i<=active_digit;i++)
{
MAX7219_writeData(i, MAX7219_CHAR_BLANK,j);
}
}
}
  */   
//------------------------------------------------------------------------------------------
//Функція виводу даних на дисплей через MAX7219
//------------------------------------------------------------------------------------------  
void display(unsigned char data_disp)
{
for(j=0;j<BYTE_SYMBOL;j++){
MAX7219_writeData(MAX7219_DIGIT[j],data_disp,0);
MAX7219_writeData(MAX7219_DIGIT[j],data_disp+1,1);
   }
}
//--------------------------------------------------------------------------------------------
void main(void)
{
unsigned int j;
DDRB |= (1 << PIN_SCK) | (1 << PIN_MOSI) | (1 << PIN_SS)| (1 << PIN_SS1);//виходи для SPI
SPCR |= (1 << SPE) | (1 << MSTR)| (1<<SPR1);// Вмикаємо SPI, Режим мастер, старшим бітом вперед /Швидкість f/64 

for(j=0;j<number_of_displays;j++)// налаштування кожного чіпа МАХ7219
{
    MAX7219_writeData(MAX7219_MODE_DECODE,0xFF,j); // декадний режим включено
    MAX7219_writeData(MAX7219_MODE_SCAN_LIMIT,active_digit-1,j);// Всі сегменти скануються 0-7
    MAX7219_writeData(MAX7219_MODE_INTENSITY, 8,j); // яскравість на половину 17/34 
    MAX7219_writeData(MAX7219_MODE_POWER, ON,j);// вмикаємо всі табла
 }
while(1)
{
    display(i);// Виводимо змінну яку наращуємо кожну секунду
    delay_ms(1000);
    i++;
    if(i==10) i=0;
}
}



6 коментарів :

  1. Доброго дня. Як працювати з кожним розрядом окремо?

    ВідповістиВидалити
    Відповіді
    1. Доброго дня. Програма дозволяє працювати з кожним розрядом окремо використавуючи функцію MAX7219_writeData. Я просто для прикладу виводжу одне число для всіх розрядів кожної мікросхеми 7219. Ви в своїй програмі можете змінювати параметр data для кожного розряду data_register в функції MAX7219_writeData(char data_register, char data,unsigned char chip).

      Видалити
  2. Адміністратор блогу видалив цей коментар.

    ВідповістиВидалити
  3. Здравствуйте.
    Скажите что нужно изменить в вашем коде чтобы можно было управлять матрицами 8х8?

    ВідповістиВидалити
    Відповіді
    1. Управление отдельными матрицами уже не проблема , внес такие изменения
      //------------------//------------------
      #define MAX7219_MODE_DECODE 0x00
      //------------------
      void sendByte( unsigned char data2,unsigned char chip2)
      {
      unsigned short col;
      for(col=0; col<8; col++)//
      { MAX7219_writeData(MAX7219_DIGIT[col], cp437_font[data2][col],chip2);
      } // шрифт cp437_font взял этот http://www.gammon.com.au/images/cp437_fonts.png
      }

      //------------------
      while(1)
      {
      sendByte(dig, 0);
      sendByte(dig+5, 1);
      delay_ms(800);
      dig++;
      }

      //------------------
      Однако, дальше вопросов появляется больше, как сделать чтобы на трех матрицах отображалось 4 символа?
      и еще один этап бегущая строка?

      Видалити