Cемисегментный индикатор & Code Vision AVR

Автор: | 05.11.2014

Семисигментный индикатор AVRСемисегме́нтный индика́тор — дисплей для отображения цифровой информации, а именно арабских цифр. Разновидность индикатора на светодиодах является одним из самых дешёвых дисплеев которые можно подключить к микроконтроллеру.

Я хочу описать использование семисигментного индикатора c общим анодом в связке с ATMEGA8.

Ниже описная программа увеличивает выводимое число на индикаторе с 0 до 9999.

Симуляция Proteus:

 

Пример кода для семисегме́нтного индикатора на 4 разряда для среды Code Vision AVR c общим анодом:

/*****************************************************
CodeWizardAVR V2.05.0 Evaluation
Проєкт :Семисегментник
Сайт :http://good-chip.in.ua
Контролер : ATmega8
Тактовая частота : 8,000000 MHz
Тактовый генератор :Внутрений
*****************************************************/
#include <mega8.h>
#include <delay.h> //библиотека задержки
//масив символов семисигментника (общий анод)
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9--
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 0;//обьявление переменной определяющей номер семента
volatile int display1 = 0; //обьявление переменной вывода числа
// Обработчик прерывания по переполнению таймера2
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTB = 0xFF; // Гасим все разряды
PORTC = (1 << segcounter); // Выбираем следующий разряд
switch (segcounter)
{
case 0:
PORTB = ~(SEGMENT[display1 % 10000 / 1000]); // Раскладываем число на разряды
break;
case 1:
PORTB = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTB = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTB = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
//основаня функция
void main(void)
{
//настройка портов
PORTB=0b00000000; //порт B по умолчанию все ноги на 0
DDRB=0b11111111; //порт B все ноги на вывод
PORTC=0b00001111; //порт С 4 первые по умолчанию 1
DDRC=0b00011111; //порт С 4 первые ноги на вывод
PORTD=0b00000000;
DDRD=0b00000000;
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); // Предделитель на 8
#asm ("sei"); // Глобально разрешаем прерывания
while (1)
 {
 display1++; //увеличиваем значение на 1 постоянно
 delay_ms(150); // задержка
 };
}

Исходный код и проект для Proteus — Скачать

 

Cемисегментный индикатор & Code Vision AVR: 1 комментарий

  1. Денис

    Отлично, спасибо за статью, чуд код поправил и получился счётчик для намоточного станка. и выход сделал двоичного кода. класс

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *