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

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

Ссылки

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

Делаем простые LCD часы на ATMega8.

Вот немного усовершенствованный вариант использование таймера, настройки такие же, как в предыдущей статье. Только добавляем еще 2 кнопки для увеличения минут на 1 и часов на 1. 

Схема:

Исходный код:

#include <mega8.h>
#asm
  .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h> // подключаем библиотеку задержки
 
 unsigned int sek; // переменная сек.
 unsigned int min; // пересенная мин.
 unsigned int hour; // переменная часов
// 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++; // инкрементируем секунду 
   
}

// Declare your global variables here

void main(void)
{

PORTB=0x00;
DDRB=0xFF;

PORTC=0x03; // выставляем порт С на 2 кнопки.
DDRC=0x00;

PORTD=0x00;
DDRD=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(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1)
  { // Place your code here 

  // роботаем с кнопками
           if (PINC.0==0) // если нажата первая кнопка
           {
              delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
               min++; // к значению минуты добавляем еденицу 
           }

           if (PINC.1==0) // если нажата вторая кнопка
          {
             delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
              hour++; // к значению часов добавляем еденицу
           }
  ///// Условия часов.
            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;
        }
  // выводим переменные
  lcd_gotoxy(4,0); // выводим посередине, если хотите вывести в начале дисплея тогда нужно выставить lcd_gotoxy(0,0);  
  lcd_putchar(hour/10+0x30);
  lcd_putchar(hour%10+0x30);
  lcd_putchar(':');
  lcd_putchar(min/10+0x30);
  lcd_putchar(min%10+0x30);
  lcd_putchar(':');
  lcd_putchar(sek/10+0x30);
  lcd_putchar(sek%10+0x30);

  };
}

Рекомендую использовать импортный кварц на 8 МГц и 2 конденсатора на 22 пФ для правильной роботы часов.

Прошивка, исходник и файл в протеусе находиться в разделе "файлы".

Спасибо KDAlex'y в написании прошивки.

Категория: Учимся работать с AVR | Добавил: my-avr (12.01.2009)
Просмотров: 34926 | Комментарии: 5 | Рейтинг: 5.0/3 |
Всего комментариев: 5
5 master_1-87  
0
Подскажите, у вас написано 
Цитата
Прошивка, исходник и файл в протеусе находиться в разделе "файлы".
А где этот самый раздел файлы?

4 Тахир  
0
Извините за глупый вопрос
" lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);"
не могу понять смысл этих выражений зачем добавлять 0x30 (48)?

3 exsade  
0
При чем тут код для градусника? О_о

2 Max  
0
w1_init() забыл.
ненадо никаких минусов. строка в 6 знаков. далее ftoa(temp,2,str). далее lcd_putsf("Temp = "); lcd_puts(str); все. и перед записью в ЛЦД - lcd_clear();

1 Макс  
0
Здраствуйте! Я недавно начал писать программы на СИ для AVR, руководствуясь вашими статьями и небольшими знаниями в С++ для ПК, раньше програмировал на асемблере
щас попробывал написать программу для АТмега8, программа должна выводить температуру с двух датчиков 18В20 на дисплей 4*20 символов, но незнаю как вывести значение в дисплей
И еще код прошивки очень большой получился - 5,57 кбайт Это впринципе немного дла меги 8-мой но на асемблере можно было б вместить етот проект в 2 - 2,5 кбайт программы

Вот код программы:

// Під*єднуєм бібліотеки для зручнішої роботи
#include <mega8.h> // Бібліотека для мікроконтроллера
//#include <delay.h> // Для програмних затримок
#include <lcd.h> // Для роботи з індикатором
#asm //об*являєм куди під*єднані датчики
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //об*являєм куди під*єднаний індикатор
.equ __lcd_port=0x12; PORTD
#endasm
#include <1wire.h> //бібліотека для роботи з інтерфейсом 1Wire
#include <ds18b20.h> //бібліотека для роботи з датчиком ds18b20
#define MAX_DS18b20 2
void main(void)
{
char *_str="Temperatura na ulice"; //Створюєм строку для виводу на дисплей
char *_str2="Temperatura v dome"; //Температура на вулиці і температура в домі
unsigned char devices; //змінна, у якій знаходиться кількість під*єднаних датчиків
unsigned char rom_code[MAX_DS18b20][9];
int temp; //змінні для збереження температури першого і другого датчика
PORTD=0x00; //Виставляємо на всіх виводах порта Д лог 0
DDRD=0xff; // Використовуємо усі виводи порта Д як виходи
lcd_init(20); // Ініціалізація ЖКІ на 20 символів
lcd_gotoxy(0, 0); // Переводим курсор на перший символ першої строки
lcd_puts(_str); // І виводимо строку "Temperatura na ulice"
lcd_gotoxy(0, 2); // Переводим курсор на перший символ третьої строки
lcd_puts(_str2); // І виводимо строку "Temperatura v dome"
// Надалі ці строки постійно будуть на індикаторі
devices=w1_search(0xf0,rom_code); //перевіряємо наявність датчиків
while(devices==2) //Якщо є обидва датчика - переходим у безкінечний цикл
{
temp=ds18b20_temperature(&rom_code[0][0]); //читаем температуру
if (temp>1000)
{ //якщо перший датчик видає більше 1000
temp=4096-temp;//віднімаєм від данних 4096
temp=-temp; //і ставим знак "мінус"
}
lcd_gotoxy(0, 1);
lcd_putchar('=');
lcd_putchar(temp);
temp=ds18b20_temperature(&rom_code[1][0]); //читаем температуру
if (temp>1000)
{ //якщо другий датчик видає більше 1000
temp=4096-temp;//віднімаєм від данних 4096
temp=-temp; //і ставим знак "мінус"
}
lcd_gotoxy(0, 3);
lcd_putchar('=');
lcd_putchar(temp);
}
}


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
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