Библиотека 7 Seg LED для ATmega8 CVAVR
Добавлено: Ср мар 11, 2009 18:06:19
В общем, не пинайте сильно в МК только начинаю разбираться понадобилась динамическая индикация на 7 сегментных индикаторах, пол дня убил на поиски вменяемой библиотеки, так и не нашел... Вот есть одна, в протеусе моделирую, не пашет...
Код: Выделить всё
#include <mega8> // объявляем библиотека ввода/вывода
#include <delay> // объявляем библиотеку для задержки
#define digit1 PORTD.6 //катод первой цифры
#define digit2 PORTD.5 //катод второй цифры
#define digit3 PORTD.4 //катод третей цифры
flash char digits[] = { //создаём массив с цифрами
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b11111101, //знак минуса
0b11111111 //пустота
};
char digit_out[3], cur_dig; //переменные для работы с LED
unsigned int indication; //переменная для хранения чисел
void recoding(void) { //функция для перекодировки из hex в dec
if (indication<1000) { //начинаем преобразование если число < 1000 так как 3-х
//разрядный LED
digit_out[0]=indication%10; //Делим на 10 остаток в масив 1-разряд
indication=indication/10; //Оставляем 2 разряда
digit_out[1]=indication%10; //Делим на 10 остаток в масив 2-разряд
digit_out[2]=indication/10; //Делим на 10 целое число в масив 3-разряд
} //*******
} //*******
//таймер 0
interrupt [TIM0_OVF] void timer1_ovf_isr(void)
{
PORTB=0xFF; //чтобы предотвратить эффект “тени” на соседних индикаторах
switch (cur_dig){
case 0:{digit3=0; digit1=1; break;}; //подаём питание на разряд 3
case 1:{digit1=0; digit2=1; break;}; //подаём питание на разряд 2
case 2:{digit2=0; digit3=1; break;}; //подаём питание на разряд 1
}
PORTB=digits[digit_out[cur_dig]]; //выводим с каждым срабатыванием таймера число с//мссива в порт В, но не для всех разрядов сразу
cur_dig++; //с каждым срабатыванием таймера, увеличиваем
//переменную cur_dig на 1
if(cur_dig==3) cur_dig=0; //если cur_dig = 3 обнуляем
}
void main(void)
{
// Инициализация портов ввода/вывода
// Port B initialization
PORTB=0xFF;
DDRB=0xFF;
// Port C initialization
PORTC=0x00;
DDRC=0x00;
// Port D initialization
PORTD=0xFF;
DDRD=0x70;
// Настраиваем таймер 0// Clock source: System Clock// Clock value: 4000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// разрешаем прерывания
#asm("sei")
while (1)
{
indication=123; //пишем число для вывода 123
recoding(); //вызываем функцию обработки
};
}