Пятница, 17.05.2024, 06:49
Главная
Приветствую Вас, Гость
Статистика



Онлайн лист

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



Реклама



Главная » Статьи » Микроконтроллеры

Наверх


Прогрессбар на LCD с HD44780 контроллером
         В предыдущей статье я описал способ подключения LCD с контроллером HD44780 к микроконтроллеру Atmega16 и показал как на него выводить отдельные символы и слова. В этой статье я приведу пример простой анимации.

         Прежде чем перейду непосредственно к сути, хочу обратить внимание на один момент. За годы практики ремонта различного электронного оборудования, я усвоил один момент, когда перед тобой совершенно незнакомая деталь, прежде чем с  ней чтото делать, необходимо найти на нее Даташит (DataSheet). Для тех кто еще не знает что это - это справочный листок, а порой и целая книга, с параметрами, описанием, возможными режимами работы, распиновкой и схемой включения и т.д. конкретной детали. Хочу сразу предупредить, что подавляющее большинство даташитов на английском языке, но изучив несколько штук начинаешь быстро и  легко ориентироваться и находить необходимую информацию.

         Так вот к чему это все.  В Даташите на контроллер HD44780 есть таблица кодов символов, записанных в память контролера:

Таблица кодов символов контроллера Epson
Таблица кодов символов контроллера Epson, набор "Russian"

         Перед нами все символы записанные в память контроллера и к которым у нас есть доступ. Первое что можно увидеть это то что кроме английских и русских букв, цифр, нам доступны спецсимволы, которые могут оказаться весьма полезны нам.

         Пользоваться таблицей очень просто.Например, хочу я вывести на экран значок колокольчика, для это в коде программы мне достаточно написать команду 
lcd_putchar(0xED).
В скобках указан адрес символа в формате 0хУХ, где У - номер столбца, а Х - номер строки, на пересечении которых расположен инетересующий символ.

         С таблице разобрались теперь можно перейти к практике и посмотреть на примере что же можно получить с помощью символов.

Пример 1

Бегающий прямоугольник.

       В качестве примера будет использоваться черный прямоугольник (0xFF), который будет пробегать поочередно 16 ячеек верхней строки, а затем 16 ячеек нижней.

В приведенном ниже примере полный код примера, как он работает подробно описано в комментариях:

#include  <mega16.h>   // Подключаем библиотеку микроконтроллера  
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h> // Подключаем библиотеку дисплея
#include <delay.h> // Подключаем библиотеку реализации задержек
#define pause delay_ms(100) // Объявляем переменную pause, которая будет осуществлять
 // задержку 
char i; // Переменная для счетчика перемещения прямоугольника
void avr_init(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

}

void main(void)
{

avr_init(); // Основные настрокий микроконтроллера
lcd_init(16); // Инициализация экрана

while (1)
{

i=0; // Обнуяем счетчик перемещения
while(i<16) // Запускаем цикл счета до 16
{
lcd_clear(); // Очищаем экран
lcd_gotoxy(i,0); // Перемещаем курсор по первой строке
lcd_putchar(0xFF); // Выводим на экран прямоугольник
i++; // Увеличиваем значение счетчика на единицу
pause; // Пауза в 100 мс, чтобы мы успевали замечать перемещение
 // прямоугольника 
}; // Счетчик остановится когда мы пройдемся по всем ячейкам 
 //первой строки 
i=0; // Снова обнуляем счетчик
while(i<16) // Запускаем цикл счета до 16
{ // Повторяем предыдущий цикл только уже для второй строки
lcd_clear();
lcd_gotoxy(i,1);
lcd_putchar(0xFF);
i++;
pause;
};
};
}











                                                                                                                                                                                  Результатом выполнения программы будет бесконечно бегающий прямоугольник:












Пример 2 

Прогрессбар

       Прогрессбар делается по тому же принципу что и бегающий прямоугольник, нужно просто немного упростить программу: просто нужно убрать очистку экрана после смещения прямоугольника на одну позицию:


#include  <mega16.h>   // Подключаем библиотеку микроконтроллера  
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h> // Подключаем библиотеку дисплея
#include <delay.h> // Подключаем библиотеку реализации задержек
#define pause delay_ms(100) // Объявляем переменную pause, которая будет осуществлять
задержку
char i; // Переменная для счетчика перемещения прямоугольника
void avr_init(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

}

void main(void)
{

avr_init(); // Основные настрокий микроконтроллера
lcd_init(16); // Инициализация экрана

while (1)
{
lcd_clear(); // Очищаем экран
lcd_putsf("Load...");// Выводим поясняющую надпись
lcd_gotoxy(0,1);
i=0; // Обнуяем счетчик перемещения
while(i<16) // Запускаем цикл счета до 16
{

lcd_gotoxy(i,1); // Перемещаем курсор по первой строке
lcd_putchar(0xFF); // Выводим на экран прямоугольник
i++; // Увеличиваем значение счетчика на единицу
pause; // Пауза в 100 мс, чтобы мы успевали замечать перемещение
 // прямоугольника 
}; // Счетчик остановится когда мы пройдемся по всем ячейкам
строки
 }; 
}


          

Результат выполнения кода:




Нравится
Категория: Микроконтроллеры | Добавил: Naprisar (02.04.2012)
Просмотров: 6561 | Комментарии: 5 | Теги: ATmega16, HD44780, микроконтроллер, LCD, Прогрессбар
Всего комментариев: 5
4 Владимир  
0
Забыл написать что замену flash byte char нужно делать в статье про вывод спец.символов.

5 Naprisar  
0
Да, как альтернативный вариант можно и черточками. Можете посмотреть еще один примерчик прогрессбара здесь выкладывал, так вот впринципе заполнять можно любым символом, в том числе и каким нибудь собственным.

3 Владимир  
1
Буду ждать.Если заменить flash byte char на три вертикальные черточки, то прессбар получиться однородным и не будет заметно знакоместо.Пока не удалось реализовать "ход" пресссбара в обратную сторону.

1 Владимир  
0
Спасибо Ваш пример очень помог.А как теперь сделать что бы прогрессбар был зависим от значения переменной (например считывал значения с ADC ножки)

2 Naprisar  
0
Пожалуйста) Рад что, статейка оказалась полезной.  А по поводу привязки к чему то, как раз собираюсь в ближайшее время заняться этим вопросом и обязательно оформлю в виде статейки.

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

Наверх