В этой статье познакомимся со всем необходимым для работы с светодиодной матрицей. В нашем случае это LD-1088BS. Но это не так уж и важно ведь внутренняя структура у разных светодиодных матриц одинаковая. РИС 1 :
РИС 2 :
РИС 3:
Важно понимать из картинок выше: 1) Светодиодная матрица 8х8 это 64 светодиода подключенных особым способом, изображенным на картинке. 2) Из второго рисунка видно что ножки находятся в некотором беспорядке))) 3) Выводить сложное изображение на светодиодную матрицу можно только динамически. 4) На 1 ом рисунке видно, как пронумерованны ножки. 5) На 3 ем рисунке можно увидеть 8 резисторов в 220ом она защитят наши светодиоды от перегорания.
#define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>
#define PORT_IN PORTD // выбираем порты к каторым #define DDR_IN DDRD // подключена наша светодиодная матрица #define PORT_OUT PORTB #define DDR_OUT DDRB
char Led_simvol [][8]={ { // крест 0b10000001, 0b01000010, 0b00100100, 0b00011000, 0b00011000, 0b00100100, 0b01000010, 0b10000001, },
{ // сердце 0b00000000, 0b01100110, 0b10011001, 0b10000001, 0b01000010, 0b00100100, 0b00011000, 0b00000000, },
{ // смайлик 0b00000000, 0b00000000, 0b01100110, 0b01100110, 0b00000000, 0b10000001, 0b01111110, 0b00000000, },
{ // бегающий квадрат шаг 1 0b00001111, 0b00001001, 0b00001001, 0b00001111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, },
{ // бегающий квадрат шаг 2 0b11110000, 0b10010000, 0b10010000, 0b11110000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, },
{ // бегающий квадрат шаг 3 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00001111, 0b00001001, 0b00001001, 0b00001111, },
{ // бегающий квадрат шаг 3 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11110000, 0b10010000, 0b10010000, 0b11110000, } };
void Port_init () { DDR_IN=0xFF; PORT_IN=0×00; // настройка порта на выход DDR_OUT=0xFF; PORT_OUT=0×00; // настройка порта на выход }
void LED_stroka (char row,char col) //функция рисует строку { PORT_IN=0×00; // не выбираем одну из строк PORT_OUT=~row; // выбираем на какой по порядку строке матрицы рисуем PORT_IN=col; // рисуем строку на порте }
void timer_init (void) { TCCR0=(1<<WGM01); // устанавливаем режим СТС (сброс по совпадению) TIMSK |= (1<<OCIE0); // устанавливаем бит разрешения прерывания 1ого счетчика по совпадению OCR0 = 0b00000011; // определяем число сравнения TCCR0|=(1<<CS02); //запуск таймера с предделителем 256 }
char *simvol; // переменная для хранения адреса масива символа char i=0; // переменная определяем какую строку выводить
ISR (TIMER0_COMP_vect) { LED_stroka (simvol[i],1<<i); if (i==7)i=0; else i+=1; }
int main(void) { Port_init(); timer_init(); sei(); simvol=&Led_simvol[0][0]; _delay_ms(1000); //выводим крест simvol=&Led_simvol[1][0]; _delay_ms(1000); //выводим сердце simvol=&Led_simvol[2][0]; _delay_ms(1000); //выводим смайл
char t; for(t=3;1;t++) { if(t==7) t=3; simvol=&Led_simvol[t][0]; _delay_ms(400); } }
|