/****************************************************************/
/******************** LCD тест ЖКИ 16х02 **********************/
/****************************************************************/
#include <mega8.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D*/
#endasm
void main(void) /* Основная функция «main», с которой начинается выполнение всей программой процедуры */
{
lcd_init(16); /* инициализация на 16 символов */
lcd_clear(); /* очистка дисплея */
lcd_gotoxy(4,0); /* верхняя строка, 4 позиция */
lcd_putsf(«LCD 16x02″);/* выводим надпись в указанных координатах */
lcd_gotoxy(0,1); /* нижняя строка, 0 позиция */
lcd_putsf(«CodeVision1.25.3»);
while(1){}; /* бесконечный цикл */
Перед тем, как выводить строку на ЖКИ дисплей его нужно инициализировать. Для этого используемфункцию lcd_init:
lcd_init(unsigned char lcd_columns);
В скобках указываем, на сколько символов подключили ЖКИ индикатор:
lcd_init(8); /* инициализация на 8 символов */
lcd_init(16); /* инициализация на 16 символов */
lcd_init(20); /* инициализация на 20 символов */
lcd_init(40); /* инициализация на 40 символов */
Выполняем очистку дисплея. Используем функцию lcd_clear();
Ну вот, выполнили инициализацию, очистили предварительно индикатор, теперь можно и выводить. Хотя, lcd_gotoxy: пока еще нельзя. Перед тем, как выводить текст нужно указать, в какой строке выводить и с какой позиции, поэтому используем функцию:
lcd_gotoxy(unsigned char x, unsigned char y);
х – с какой позиции выводить первый символ (зависит от типа индикатора)
y – в какой строке (зависит от типа индикатора)
По данным заголовочного файла LCD.h имеем возможность выводить текст от 0 до 39 символов, и от 0 до 3 строк. Но в процессе использования выяснилось, что работает с ЖКИ индикаторами до 40х2 (Тип Winstar WH4002A). Использовать на индикатор WH4004A как правило, не получится.
Если, например, взяли индикатор 20х4 (Тип Winstar WH2004A/B), то для вывода текста с 10 позиции и 2-ой строке указываем в функции:
lcd_gotoxy(10,2);
Текст более 10 символов переведется на следующую строку. Текст выводим при помощи функции lcd_putsf():
lcd_putsf(char flash *str);
Текст, являющийся аргументом функции можно записывать непосредственно:
Lcd_putsf(“Hello World!”);
Если использовать переменную для хранения текста и последующей записи в функцию, то компилятор CodeVisionAVR определит как ошибку — параметр #1 типа ‘unsigned char’ несовместим с типом ‘flash unsigned char*’ указанный в объявлении функции ‘lcd_putsf’:
Unsigned char *txt=”Hello World!”;
Lcd_putsf(txt);
Функция для вывода текста на ЖКИ индикатор требующая определения текста в переменной – функция lcd_puts:
lcd_puts(char *str);
Тип переменой |
Название |
Размер, байт |
значение |
char |
символ |
1 |
-128…127 |
Unsigned char |
ASCII символ |
1 |
0…255 |
В виде кода, функция записывается следующим образом:
Unsigned char *dt=”Hello World!”;
/*или char *dt=”Hello World!”; */
Lcd_puts(dt);
Функция lcd_putchar(char c); позволяет выводить символы из Таблицы кодов символов:
lcd_putchar(0x41); /* символ английской буквы А */
lcd_putchar(0x5b); /* символ квадратная скобка [ */
lcd_putchar(0xff); /* символ заполненного знакоместа */
Ниже приведен програмный код, который заполняет нижнюю строку с позицией от 0 до 15 символов заполненного знакоместа из таблицы кодов (код символа 0xFF).
/************************ LCDprogresBar *****************************/
#include <mega8.h>
#include <lcd.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */
#endasm
unsigned char j=0; /* определяем переменную для хранения положительного числа от 0 до 255 */
void main(void) /* Основная функция «main», с которой начинается выполнение всей программой процедуры */
{
lcd_init(16);
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf(«Initialization«);
while(1) /* выполняем цикл пока оператор iF не выполнит условие j==16 */
{
delay_ms(500);
j++;
lcd_gotoxy(j-1,1); /* заполняем символом 2-ую строку от 0 до 15 */
lcd_putchar(0xff); /* Символ заполненного знакоместа из таблицы кодов символов */
if (j==16) {break;} /* если условие if выполнилось, то прерываем выполнение цикла while */
}
while(1){/* бесконечный цикл */};
}
Для того, чтобы выводить на ЖКИ индикатор русские буквы, применяется директива #pragma rl+/rl-:
/***********************************************************************/
#include <mega8.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm
void main(void)
{
lcd_init(16);
lcd_clear();
#pragma rl+
lcd_gotoxy(0,0);
lcd_putsf(«Индикатор 16х02″);
lcd_gotoxy(0,1);
lcd_putsf(«Тестирование ЖКИ«);
#pragma rl-
while(1){};
}
По сути, директива работает по переключению кодировки и собственно позволяет выводить русские буквы. В ходе практической работы выяснилось, что без этой директивы русский текст отображается как набор непонятных «казябликов». Что касается программы – симулятора Proteus (по крайней мере, проверенно в версии 7.2 и 7.5), то отсутствует поддержка вывода русского текста и большинства табличных символов.
Файлы к статье:
Проект LCD16x2 CodeVision 1.25.3 и Proteus 7.5
Проект LCD16x4 CodeVision 1.25.3 и Proteus 7.5
Проект LCD20x4 CodeVision 1.25.3 и Proteus 7.5
Проект LCD40x2 CodeVision 1.25.3 и Proteus 7.5
Проект LCDprogresBar CodeVision 1.25.3 и Proteus 7.5
Автор: Skiff