//**************************************************** #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; } }
середу, 14 січня 2015 р.
Семисегментний дисплей на MAX7219 Atmega8 CodeVision AVR
Підписатися на:
Дописати коментарі
(
Atom
)
Доброго дня. Як працювати з кожним розрядом окремо?
ВідповістиВидалитиДоброго дня. Програма дозволяє працювати з кожним розрядом окремо використавуючи функцію MAX7219_writeData. Я просто для прикладу виводжу одне число для всіх розрядів кожної мікросхеми 7219. Ви в своїй програмі можете змінювати параметр data для кожного розряду data_register в функції MAX7219_writeData(char data_register, char data,unsigned char chip).
ВидалитиАдміністратор блогу видалив цей коментар.
ВідповістиВидалитиАвтор видалив цей коментар.
ВідповістиВидалитиЗдравствуйте.
ВідповістиВидалитиСкажите что нужно изменить в вашем коде чтобы можно было управлять матрицами 8х8?
Управление отдельными матрицами уже не проблема , внес такие изменения
Видалити//------------------//------------------
#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 символа?
и еще один этап бегущая строка?