Например TDA7294

Форум РадиоКот :: Просмотр темы - LCD и Atmega16 самый простой код, на простом примере.
Форум РадиоКот
https://radiokot.ru/forum/

LCD и Atmega16 самый простой код, на простом примере.
https://radiokot.ru/forum/viewtopic.php?f=61&t=87968
Страница 1 из 1

Автор:  king-live [ Вс апр 07, 2013 23:08:34 ]
Заголовок сообщения:  LCD и Atmega16 самый простой код, на простом примере.

Доброго времени суток! Хотел вывести на LCD информацию в две строчки. (LCD HD44780-16x2) Исходный код взял отсюда.

http://radioparty.ru/index.php/prog-avr ... vr-lesson1

Переправил под свой проект и информация выводится на экран.
Вот мой код
Код:

#include <avr/io.h>
#define F_CPU 8000000UL
#include <stdlib.h>
#include <util/delay.h>   

#define RS PD6       
#define EN PD7       

unsigned char x;

void lcd_com(unsigned char p)
{
PORTD &= ~(1 << RS);   // RS = 0
PORTD |= (1 << EN);    // EN = 1
PORTC = p;             
_delay_us(300);     
PORTD &= ~(1 << EN);   // EN = 0
_delay_us(300);       
}

void lcd_dat(unsigned char p) 
{
PORTD |= (1 << RS)|(1 << EN);  //RS = 1, EN = 1
PORTC = p;                   
_delay_us(200);               
PORTD &= ~(1 << EN);           // EN = 0
_delay_us(200);               
}
 

void lcd_init(void)
{
lcd_com(0x08);          //
lcd_com(0x38);           //
_delay_us(400);
lcd_com(0x38);           //
_delay_us(400);
lcd_com(0x38);           //
lcd_com(0x38);
lcd_com(0x01);           //
_delay_us(400);
lcd_com(0x06);           //
lcd_com(0x0D);           //
}


int main (void)
{
DDRC=0xFF;
PORTC = 0x00;                   
DDRD = 0xFF;               
PORTB = 0x00;
while(1)
   {
   lcd_init();     
   lcd_dat('H'); 
   lcd_dat('e');
   lcd_dat('l');
   lcd_dat('l');
   lcd_dat('o');
   lcd_dat(' ');
   lcd_dat('w');
   lcd_dat('o');
   lcd_dat('r');
   lcd_dat('l');
   lcd_dat('d');
   lcd_dat('!');
   _delay_ms(1000);
   x++;
   }
}


Как вывести на экран во вторую нижнюю строчку, переменную "х"? Спасибо!
Библиотекой LCD не пользовался.

Автор:  Аlex [ Вс апр 07, 2013 23:21:35 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

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

Автор:  king-live [ Вс апр 07, 2013 23:36:18 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Не могу судить об этом примере, плохой или хороший. Просто он самый доходчивый и простой, без подключения библиотеки LCD. Да и мне пока многого и не надо. Нужно всего лишь вывести несколько переменных на экран. Как вывели строку "Hello world!" Если конечно это возможно в этом примере. Спасибо!

Автор:  Кефир [ Вт апр 09, 2013 20:45:42 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Вот:

Код:
#ifndef hd44780
#define hd44780

// HD44780
#define RS BIT7          // 0 - команда, 1 - данные
#define E  BIT6          // Стробирующий вход (синхр.)

// 74HC595
#define SH BIT5          //
#define ST BIT4          //
#define DS BIT3          //

#endif /* hd44780 */

int StrokaOne[] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}; // 16

int StrokaTwo[]=  {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32}; // 16
int LedPauza = 50;

// Init_HD_44780(Комманда);
int Init_HD_44780(int Commands)
{
// Команда
//************************
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
    P1OUT &= ~RS;
    P1OUT |= E;
    //P1OUT = 12;
    HC595Out(Commands);
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
               
    P1OUT &= ~RS + E;
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
//************************
}
// OUT_LED_Word(Символы, Номер строки, Адрес стартовой ячейки, Статус Символов (char - 1 или int - 2), Символ в Dec);
int OUT_LED_Word(char Text[], int Stroka, int StartAadres, int StatusChar, int TextDec[])
{
  if(StatusChar == 1)
  {
    if(Stroka == 1)
    {
      Stroka = 128;
    }
   
    if(Stroka == 2)
    {
      Stroka = 168;
    }
   
      for(int i = 0; i <= 16; i++)
      {
        if(Text[i] == 0)
        {          }
        else
        {
          if(Text[i+1] == 0)
          {
            if(Text[i+1] == 0)
            {
              OutStrokaOne(Text[i], i, StartAadres, Stroka);
              i = 16;       
            }
            else
            {
              OutStrokaOne(Text[i], i, StartAadres, Stroka);
            }
          }
          else
          {
            OutStrokaOne(Text[i], i, StartAadres, Stroka);
          }
        }
      }
    }
 
  if(StatusChar == 2)
  {
    if(Stroka == 1)
    {
      Stroka = 128;
    }
   
    if(Stroka == 2)
    {
      Stroka = 168;
    }
      for(int i = 0; i <= 16; i++)
      {
        if(TextDec[i] == 0)
        {          }
        else
        {
          if(TextDec[i+1] == 0)
          {
            if(TextDec[i+1] == 0)
            {
              OutStrokaOne(TextDec[i], i, StartAadres, Stroka);
              i = 16;       
            }
            else
            {
              OutStrokaOne(TextDec[i], i, StartAadres, Stroka);
            }
          }
          else
          {
            OutStrokaOne(TextDec[i], i, StartAadres, Stroka);
          }
        }
      }
  }
}

// OUT_LED_Dec(Значение, Номер строки, Адрес стартовой ячейки, Статус дроби);
int OUT_LED_Dec(int Value, int Stroka, int StartAadres, int Share )
{
  //Value = Value * 100;
  unsigned char s[16];
  if(Stroka == 1)
  {
    Stroka = 128;
  }
 
  if(Stroka == 2)
  {
    Stroka = 168;
  }
    if(Value < 0)
    {
        s[0] = '-';
    }
    else { s[0] = ' '; }
   
    for(int i = 0; i <4; i++)
    {
      if(Value <= 9)
      {
        if(Share == 1)
        {
          s[1] = '0';   
          s[2] = '0';
          s[3] = '.';
          s[4] = Value % 10 + '0';
        }
        if(Share == 2)
        {
          s[1] = ' ';   
          s[2] = ' ';
          s[3] = ' ';
          s[4] = Value % 10 + '0';
        }
       
      }
      if(Value <= 99)
      {
        if(Share == 1)
        {
          s[1] = '0';
          s[2] = (Value / 10) % 10 + '0';
          s[3] = '.';
          s[4] = Value % 10 + '0';
        }
        if(Share == 2)
        {
          s[1] = ' ';
          s[2] = ' ';         
          s[3] = (Value / 10) % 10 + '0';
          s[4] = Value % 10 + '0';
        }
      }
      if(Value <= 999)
      {
        if(Share == 1)
        {
          s[1] = (Value / 100) % 10 +'0';
          s[2] = (Value / 10) % 10 + '0';
          s[3] = '.';
          s[4] = Value % 10 + '0';
        }
        if(Share == 2)
        {

          s[1] = ' ';
          s[2] = (Value / 100) % 10 +'0';
          s[3] = (Value / 10) % 10 + '0';
          s[4] = Value % 10 + '0';
        }
      }
    }
 
    for (int i = 0; i <= 4; i++)
    {
      OutStrokaOne(s[i], i, StartAadres, Stroka);
    }
}

// OutStrokaOne(Символ в Dec, Номер символа, Адрес стартовой ячейки, Адрес строки(128, 168));
int OutStrokaOne(int Simvl, int StrokaAdres, int StartAdresStrokaOne, int StrokaOneTwo)
{
//************************ Команда
    P1OUT &= ~RS;
    P1OUT |= E;
    //P1OUT = StrokaOneTwo + StrokaAdres + StartAdresStrokaOne;
    HC595Out(StrokaOneTwo + StrokaAdres + StartAdresStrokaOne);
   
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
    P1OUT &= ~RS + E;
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
//************************
   
//************************ Данные
    P1OUT |= RS;
    P1OUT |= E;
    //P1OUT = Simvl;
    HC595Out(Simvl);
   
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
    P1OUT |= RS;
    P1OUT &= ~E;
    for(volatile unsigned int i = LedPauza; i != 0; i--); // Задержка
//************************
}

// HC595Out(Значение int); // Вывод на 74HC595
int HC595Out(int Data)
{
  int OutDataRS = 0;
  P2OUT &= ~SH;
  P2OUT &= ~ST;
  P2OUT &= ~DS;   
  for(int i = 0; i < 8; i++)
  {
    OutDataRS = Data >> i;
    if((1&OutDataRS) == 1)
    {
      for(volatile unsigned int i = 40; i != 0; i--); // Задержка
      P2OUT |= DS;
      P2OUT |= SH;
      for(volatile unsigned int i = 50; i != 0; i--); // Задержка
      P2OUT &= ~SH;
    }
    else
    {
      for(volatile unsigned int i = 40; i != 0; i--); // Задержка
      P2OUT &= ~DS;
      P2OUT |= SH;
      for(volatile unsigned int i = 50; i != 0; i--); // Задержка
      P2OUT &= ~SH;
    }
  }
  P2OUT |= ST;   
  //for(volatile unsigned int i = 50; i != 0; i--); // Задержка
}

Автор:  codenamehawk [ Вт апр 09, 2013 21:03:22 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Если не хотите воспользоваться умным советом от Аlex, то
выводите пустые символы(знак пробела) до тех пор, пока индикатор сам не перебросит на следующую строку, а там преобразовав х в текст выдавайте на лцд.

Если серьезно, то есть команды перемещения курсора, читайте описание лцд.

Автор:  king-live [ Чт апр 11, 2013 20:40:12 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Спасибо! Я так понимаю длинный код переданный "кефир"ом это библиотека, которую надо подключить к главному коду! Я пользуюсь "WinAVR+Studio4.19" или Studio6 с собственным Toolchain(заменитель WinAVR). Однако ни тот ни другой не видят готовых библиотек работающих с LCD. И библиотеки эти находятся глубоко в поддиррикториях. <hd44780.h>,<lcd.h>. Попробую разобраться с высланным кодом, и с предложеним о пробелах, спасибо! Кстати в готовых библиотеках прописанны порты для работы с шиной LСD. Но в них указанны другие порты чем в моём проекте. Мне нужно в библиотеках редактировать порты ввода вывода, а потом подключать в главную программу?

Автор:  codenamehawk [ Пт апр 12, 2013 21:14:21 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

king-live писал(а):
Мне нужно в библиотеках редактировать порты ввода вывода, а потом подключать в главную программу?

Да.
Пользуюсь библиотекой http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

Порты описаны в файле lcd.h
Подключение обычно сводится к помещению файлов библиотеки (н.п. lcd.c lcd.h) в папку вашего проекта.

В Studio4 становитесь на "Source files" правой и "Add Existings source file"

Вложение:
Комментарий к файлу: Пример для протеуса.
At16 LCD 4 bit.rar [53.27 KiB]
Скачиваний: 242

Автор:  king-live [ Вс апр 14, 2013 20:36:18 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Цитата:
lcd.c
это пример кода, а
Цитата:
lcd.h
это библиотека которую надо подключить? Я правильно понял?

Автор:  codenamehawk [ Вс апр 14, 2013 22:24:41 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Не правильно поняли.

"Правильная" библиотека имеет расширение .а (это отдельная тема)

.h в нем описываются переменные , прототипы функций(файл описаний, подключается инструкцией #include <lcd.h>), а тело функций описано в .с (вот ее и называют библиотекой, в принципе это обычный "с" файл, как подключить уже описывал.)

Автор:  king-live [ Пн апр 15, 2013 09:20:35 ]
Заголовок сообщения:  Re: LCD и Atmega16 самый простой код, на простом примере.

Спасибо понял! Буду разбираться!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/