Приветствую Вас, Гость! Регистрация RSS

Вторник, 21.11.2017
Главная » Статьи » Cтатьи

CodeVision AVR. Вывод информации на ЖКИ. Использование библиотечных функций


Индикаторы ЖКИ являются неотъемлемой частью радиоэлектронной аппаратуры для вывода различной информации.

В этой статье поговорим о некоторых, наиболее применимых функциях библиотеки LCD.h. Заголовочный файл LCD.h имеет в своем наборе функции для работы с ЖКИ дисплеем, которые связаны с библиотекой LCD.lib, написанной на ассемблере. Поэтому записывая одну функцию, выполняется целый ассемблерный код. Библиотеки облегчают 'программерный’ труд программиста от написания постоянного, повторяющегося кода.
LCD.h библиотека позволяет работать с ЖКИ дисплеями до 40х02. Для работы с ЖКИ 40х04 используется библиотека LCD4x40.h т.к. она поддерживает работу на вторую управляющую линию Е2 (LCD display dual controllers). Таковым ЖКИ индикатором является модель фирмы Winstar WH4004A.

Ниже программный код позволяет выводить текст на ЖКИ дисплей 16х02. Испытывался на макетной плате с индикатором WH1602D-YYB-CTK и Atmega8535.

 

 /************************************************************************************/
 /********************************** 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 ){ };               /* бесконечный цикл */
 }


Пример в программе – симуляторе Proteus 7.5 SP3

Перед тем, как выводить строку на ЖКИ дисплей его нужно инициализировать. Для этого используем функцию 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х02 ( Тип Winstar WH4002A ). Использовать на индикатор WH4004A как правило не получится.

Если, например, взяли индикатор 20х04 ( Тип Winstar WH2004A/B ), то для вывода текста с 10 позиции и 2-ой строке указываем в функции:



lcd_gotoxy(10,2);

null

Текст более 10 символов переведется на следующую строку


Текст выводим при помощи функции lcd_putsf:

 lcd_putsf( char flash *str );

Текст, являющийся аргументом функции можно записывать непосредственно:

 lcd_putsf( "Hello World!" );

Если использовать переменную для хранения текста и последующей записи в функцию, то компилятор CodeVision AVR определит как ошибку - параметр #1 типа 'unsigned char' несовместим с типом 'flash unsigned char*' указанный в объявлении функции 'lcd_putsf' :

unsigned char *txt=
"Hello World!";

lcd_putsf( txt );


Другая функция для вывода текста на ЖКИ индикатор требует определения текста в переменной – функция
lcd_puts:

 lcd_puts( char *str );

Пример: 

 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 ).

 #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 ){ };

 }


null

По сути директива работает по переключению кодировки и собственно позволяет выводить русские буквы. В ходе практической работы выяснилось, что без этой директивы русский текст отображается как набор непонятных «казябликов». В cvavr 2.03 директива вообще не воспринимается компилятором. Что касается программы – симулятора Proteus (по крайней мере, проверенно в версии 7.2 и 7.5), то отсутствует поддержка вывода русского текста и большинства табличных символов.


Файлы

 Проект LCD16x02 CodeVision ver.1.25.3 и Proteus 7.5

 Проект LCD16x04 CodeVision ver.1.25.3 и Proteus 7.5

 Проект LCD20x04 CodeVision ver.1.25.3 и Proteus 7.5

 Проект LCD40x02 CodeVision ver.1.25.3 и Proteus 7.5

 Проект LCDprogresBar CodeVision ver.1.25.3 и Proteus 7.5


Категория: Cтатьи | Добавил: Автор (03.05.2010)
Просмотров: 40206 | Комментарии: 53 | Теги: Индикатор ЖКИ, инициализация ЖКИ, директива #pragma rl+/rl-, Winstar, индикатор 20х04, Использование библиотечных функций, ЖКИ 1602, вывод информации | Рейтинг: 0.0/0
Всего комментариев: 291 2 »
1  
народ помогите а???

2  
В чём проблема, пишите!

3  
Не могу инициализировать wh2004a-tgk-ct =((
Один я брал попробовал не получилось думаю дохлый наверное, дали другой, сказали точно рабочий...
и такая же фигня...
Поставил задержку после инициализации, видно что все 4е строки загораются(черными квадратами), а потом тухнут и остается всего 2е (1я и 3я (так же квадратами)). =((
подскажите в чем может быть прикол?

4  
Руслан, дайте архив с проектом, я его посмотрю и проверю на своём LCD-2004... wink и распайку индикатора покажите...

5  
Архив брал от сюда, который "Проект LCD20x04 CodeVision ver.1.25.3 и Proteus 7.5" там изменил только одну библиотеку

Code
#include <mega8.h>

на

Code
#include <mega16.h>

подключал так:

mega16

Code

PD0(14 нога mega16) - RS (4я нога LCD)
PD1(15 нога mega16) - RW(5я нога LCD)
PD2(16 нога mega16) - E (6я нога LCD)

PD4(18 нога mega16) - D4(11я нога LCD)
PD5(19 нога mega16) - D5(12я нога LCD)
PD6(20 нога mega16) - D6(13я нога LCD)
PD7(21 нога mega16) - D7(14я нога LCD)

8  
Руслан, посмотрите какой тип микроконтроллера у вас стоит в форме Configure the project ( значёк с ключем, отвёрткой и молотком ) или меню project -> Configure, потом вкладка С Compiler список Chip и частота в поле Clock!

6  

7  
До этого подключал 2х строчный тоже от winstar работает отлично!!!
А с этим 4х строчным запарился уже =(

9  
да там стояла mega8, поставил mega16 4МГц, ничего не изменилось=(
так же загораются знакоместа во всех строчках потом тухнут и появляются закоместа только в 1й и 3й строке =(

10  
Эта часть у вас в проекте верно записана:

Code

#asm
    .equ __lcd_port=0x12; PORTD
#endasm

PORTD исправен ( проверьте )? Внимательно проверьте распайку индикатора и проводники, идущие к выводам микроконтроллёра!

11  
Доброго времени суток! Отличная статья, СПАСИБО! Вопрос: Как вывести на дисплей число из переменной?
Code

c=read_adc(4);\\читаю в переменную инфу из АЦП
lcd_putsf=(c);\\ пытаюсь выдать инфу на дисплей - не ест

12  
Спасибо, стараюсь! Делается это так:

Code

unsigned char lcd_buffer[16];

c=read_adc(4); //читаю в переменную инфу из АЦП
sprintf( lcd_buffer,"U= %u",c ); //#include <stdio.h>
lcd_gotoxy( 0,0 );
lcd_puts( lcd_buffer );

13  
Спасибо!

14  
Code
/*************************************/
#include <mega8.h>
#include <lcd.h>
#include <stdio.h>
#define VREF 5000

#asm
.equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */
#endasm

void main(void) /* Основная функция "main", с которой начинается выполнение всей программой процедуры */
{
  unsigned int a;
  unsigned VOLT;
  unsigned char lcd_buffer[16];

  lcd_init(16);
  lcd_clear();

  ADMUX &= 0xDF; // разрядность 10bit
  ADMUX |= 0x40; ADMUX &= 0x7F; // внутренний ион VREF=AVcc
  ADMUX &= 0xF0; // канал 0 линия PC0
  ADCSRA |=0x80; // включить АЦП
  ADCSRA |=0x40; // Запуск нового замера
  ADCSRA |=0x20; // Постояное измерение
  ADCSRA &=0xFE; ADCSRA |=0x06; // Частота Fацп=Fclk/64
  while (1)
  {
  a=ADCL;
  a +=((int)ADCH<<8);
  VOLT = a*VREF/1024;

  sprintf( lcd_buffer,"U= %u",VOLT); //#include <stdio.h>
  lcd_gotoxy( 0,0 );
  lcd_puts( lcd_buffer );

  }
}

не работает хоть убей на дисплее показывает "3" и все тут помогите что тут не так

15  
Вы не определили тип данных в строке:
Code
unsigned VOLT;

Нужно так:
Code
unsigned int VOLT;

16  
спасибо за внимание, правда не помогло(((

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