Четверг, 28.03.2024, 15:07
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

Учимся работать с 7-ми сегментником (часть вторая). Делаем простые часы на ATmega8

Привет всем. УРА!!! Мы добрались до создания часов на 7-ми сегментниках. Итак, начнем. 

Пишем программу:

#include <mega8.h>
#include <delay.h> // подключаем библиотеку задержки

 unsigned char sek; // переменная сек.
 unsigned char min; // пересенная мин.
 unsigned char hour; // переменная часов
 unsigned char Dig[10];
 char Disp6, Disp7;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
  TCNT1H=0;
  TCNT1L=0;
  sek++; // инкрементируем секунду 
  PORTD=128;
  PORTB=253; // выводим точку
   
  // роботаем с кнопками
  if (PINC.0==0) // если нажата первая кнопка
  {
  hour++; // к значению часы добавляем единицу  
  }
  if (PINC.1==0) // если нажата вторая кнопка
  {
  hour--; // к значению часы вычитаем единицу у
  }
  if (PINC.2==0) // если нажата третья кнопка
  {
  min++; // к значению минуты добавляем единицу  
  }
  if (PINC.3==0) // если нажата четвертая кнопка
  {
  min--; // к значению минуты вычитаем единицу 
  }  
  if (PINC.4==0) // кнопка RESET
  {
  sek=0;  
  }  


}

// Declare your global variables here

void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла
{
  unsigned char Num2, Num3;
  Num2=0;
  while (Number >= 10) //десятичную
  {
  Number -= 10;  
  Num2++; 
  }
  Num3 = Number; //остаток
  Disp6 = Dig[Num2];
  Disp7 = Dig[Num3];  

void Dig_init() //Массив для отображения цыфр на семисегментном индикаторе
{
  Dig[0] = 95; // Сейчас у нас схема с общим катодом
  Dig[1] = 24;
  Dig[2] = 109;
  Dig[3] = 124;
  Dig[4] = 58;
  Dig[5] = 118;
  Dig[6] = 119;
  Dig[7] = 28;
  Dig[8] = 127;
  Dig[9] = 126;
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0xFF;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization


// Global enable interrupts
#asm("sei")
Dig_init(); //инициализация массива с двоичным кодом
while (1)
  {///// Условия часов.
  if(sek==60) // если сек = 60 
  {
  min++; // добавляем 1 к переменной "минута" 
  sek=0; // зануляем переменную "секунда"
  }
  if(min==60) // если мин = 60 
  {
  hour++; // добавляем 1 к переменной "час" 
  min=0; // зануляем переменную "минута"
  }
  if (hour==24) // так как у нас часы имеют 24 часовый формат
  { // при достыжении 24 часов, онулируем все переменные.
  hour=0;
  min=0;
  sek=0;
  }
  // защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус.
  if (hour==255)
  hour=0;
  if (min==255)
  min=0;  
  // выводим переменные (стробирование)
  Display(hour); //разложили "часы" на 2 цифры и отобразили по очереди
  PORTB=254; //даем лог 0 для катода 1 разряда
  PORTD=Disp6; //1 цифра  
  delay_ms(5);
  PORTB=253; //даем лог 0 для катода 2 разряда
  PORTD=Disp7; //2 цифра  
  delay_ms(5);
  Display(min); //разложили "минуты" на 2 цифры и отобразили по очереди
  PORTB=251; //даем лог 0 для катода 3 разряда
  PORTD=Disp6; //3 цифра  
  delay_ms(5);
  PORTB=247; //даем лог 0 для катода 4 разряда
  PORTD=Disp7; //4...  
  delay_ms(5);
  };
}





Немного комментариевпо работе программы:

Принцип роботы LED дисплея описано на странице http://www.pcports.ru/articles/avr4.php

Выведено 5 кнопок по настройке часам.

Тактовая частота 8 МГц. 

Часы будут нормально работать при маленьком дисплее, ибо во избежания "прожига" порта нужно поставить 4 транзистора на переключения катодов об этом я напишу в следующей статье.

Огромная благодарность в написании прошивки  Shtorm'у.

Файлы по проекту как всегда в разделе "Файлы".

Категория: Учимся работать с AVR | Добавил: my-avr (30.01.2009)
Просмотров: 35618 | Комментарии: 14 | Рейтинг: 4.8/5 |
Всего комментариев: 141 2 »
14 лол  
0
что за критин это написал? как же антидребезг? я в шоке с таких авторов

13 Giga  
0
Не получается потушить первый сегмент если там 0. Делал условие если часы 00 01 02 03 04 05 06 07 08 09, то порт Б 0=0. Номер не прошел))

12 belazov  
0
спаял такие часы (в машине сломались). сделал по статье, но индикатор с общим анодом (код переделал под общ анод). Но часы не пошли. Переделал прогу - часы пошли. Но как зажечь точку секундную в разряде единиц часов - пока не въехал. Код пока без учета кнопок управления и интервал секунд составляет 0,1сек для проверки работы- чтоб не ждать долго. создал тему на форуме http://my-avr.at.ua/forum/3-132-1#773 но не нашел как вставить туда файлы, а то б выложил схему , печатку и фото.

10 Watch-Maker  
0
Я использую не транзисторные ключи, а дешифратор 74145 или 74LS145. Индикаторы с общим КАТОДОМ, до 10 разрядов, на управление разрядами всего 4 ноги контроллера - итого 12 ног на весь 10-разрядный дисплей.

11 HiSER  
0
Прям без резисторов? У тебя сколько один сегмент потребляет?
Допустимый ток этой МС на ногу 12мА.

9 Reloader  
0
Господа. я только начинаю изучать AVR. это 1-я конструкция, которую я хотел собрать. но в коде ошибка!!!
часы неработают!! на экране - белеберда! АФФтар - ты нехороший человек! если уж взялся учить - сам бы сначала проверил. Господа, просьба большая, ежели кто знает, как исправить - киньте инфу на почту : serowsw@yandex.ru
Готовый код ненужно - просто объясните принцип :(
Данная схема с общим АНОДОМ!
а как переделать на схему с общим катодом? заранее всем благодарен!

8 qwerty  
0
Помогите переконвертировать на контроллер мега48

7 Виталий  
0
"Гавно часы! Лузер автор уже второй раз! Я начинающй и то вижу сразу что если пропадет питание то и всё по нулям станет! Автор читай
книги про АВР!!!!!! Или описывай подробнее! Хватит копировать чужие тексты!"
- Вместо того что бы критиковать, лучше бы включил мозги и модифицировал батарейкой, ишак!
Вот автор реально молоток, на сколько я заметил здесь собраны чисто на cb? а это редкость, автор спасибо, основы очень хорошо рассписаны, так держать!!!

6 misha  
0
Гавно часы! Лузер автор уже второй раз! Я начинающй и то вижу сразу что если пропадет питание то и всё по нулям станет! Автор читай
книги про АВР!!!!!! Или описывай подробнее! Хватит копировать чужие тексты!

5 mexx  
0
Привет! Взял все исходники в файлах запускаю Proteus н че не работает!!

4 Anymorf  
0
И ещё вспомнил лично я не решил занимать линии SPI мало ли чего... потому поменял местами порты для выбора сегмента и опроса кнопок. Оставил только две кнопки(+Н +М) как в примере с Жк часами и Ресет. Но это уже так сказать мое представление этой схемы...

1-10 11-13
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2024
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Как вам материалы на сайте
Всего ответов: 863
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz