работа c lcd

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

недавно начал изучать микроконтроллеры, не как не могу понять как работать с lcd, подскажите или ткните носом уроки, пишу на си в avr studio, в интернете ничего путного не нашёл, интересует работа и с символьными дисплеями и с не символьными
Последний раз редактировалось Gudd-Head Вт мар 25, 2014 14:51:15, всего редактировалось 1 раз.
Причина: Сюда перенёс
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Например так:
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>



#define RS PA6 // RS подключаем к PA6 микроконтроллера
#define EN PA7 // EN подключаем к PA7 микроконтроллера





//Функция записи команды в LCD
void lcd_com(unsigned char p) //'p' байт команды
{
PORTA &= ~(1 << RS);   // RS = 0
PORTA |= (1 << EN);    // EN = 1 (начало записи команды в LCD)
PORTC = p;             // вывод команды на шину DB0-7 LCD
_delay_us(100);        // длительность сигнала EN
PORTA &= ~(1 << EN);   // EN = 0 (конец записи команды в LCD)
_delay_us(100);        // пауза для выполнения команды
}
//Функция записи данных в LCD
void lcd_dat(unsigned char p)  //'p' байт команды
{
PORTA |= (1 << RS)|(1 << EN);  //RS = 1, EN = 1 (начало записи команды в LCD)
PORTC = p;                     //вывод команды на шину DB0-7 LCD
_delay_us(100);                // длительность сигнала EN
PORTA &= ~(1 << EN);           // EN = 0 (конец записи команды в LCD)
_delay_us(100);                // пауза для выполнения команды
}
//Функция установки курсора в позицию x y
void lcd_gotoxy(unsigned char x, unsigned char y)
{
if(!y) lcd_dat(0x80 + x); 
else lcd_dat(0xC0 + x); 
}
//Функция инициализации LCD
void lcd_init(void)
{
lcd_com(0x08);          // полное выключение дисплея
lcd_com(0x38);           // 8 бит 2 строки
_delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
_delay_us(100);
lcd_com(0x38);           // 8 бит 2 строки
lcd_com(0x38);
lcd_com(0x01);           // очистка дисплея
_delay_us(100);
lcd_com(0x06);           // сдвиг курсора вправо
lcd_com(0x0D);           // включение дисплея, мигающий курсор
}


int main(void)
{
// запрет прерываний
cli();
// останов сторожевого таймера
WDTCR = (1<<WDTOE) | (1<<WDE);
WDTCR = 0x00;



// настройка портов LCD
DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // PC0-3 выходы
PORTC = 0x00;                      // лог. 0 на выходе
DDRD = 0xFF;                       // PD0-7 выходы



lcd_init();      // инициализация дисплея

lcd_dat('T');    // выводим на экран T
lcd_dat('E');    // выводим на экран E
lcd_dat('S');    // выводим на экран S
lcd_dat('T');    // выводим на экран T

lcd_gotoxy(0,1); // устанавливаем курсор в начало первой строки

lcd_dat('T');    // выводим на экран T
lcd_dat('I');    // выводим на экран I
lcd_dat('M');    // выводим на экран M
lcd_dat('E');    // выводим на экран E
lcd_dat('R');    // выводим на экран R

while(1);

}
Содрал не помню откуда, честно. :))
Docendo discimus
Контактная информация:
Реклама
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

я видел этот код, не получается его заставить работать(
Друг Кота
Аватара пользователя
Сообщения: 20103
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

kelod писал(а):подскажите или ткните носом
Как вариант:
http://fab.cba.mit.edu/classes/MIT/863. ... /44780.pdf
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

kelod писал(а):я видел этот код, не получается его заставить работать(
Чтобы заставить работать дисплей надо понять как он управляется, что надо сделать чтобы он включился т.е. какие команды дать дисплею. После его включения обычно в графических появляется "мусор на экране", далее пишется несколько процедур которые могут выводить на экран текст, фигуры, рисунки...
Для этого надо по маркировке дисплея найти даташит на его контроллер, найти примеры работы и почитать на форумах как с ним работать. Например классика - дисплей от Нокии 3310 вот пример работы http://radiokot.ru/articles/29/ или тут http://we.easyelectronics.ru/lcd_gfx/bi ... -3310.html. Аналогичная работа с символьными дисплеями, самые распространённые на контроллере HD44780 ссылку на подобный дали тебе ранее. И здесь же есть целая ветка по таким дисплеям http://radiokot.ru/forum/viewtopic.php?f=61&t=584 и вторая ссылка http://easyelectronics.ru/avr-uchebnyj- ... 44780.html
Реклама
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

наконец появилось время разобраться с дисплеем, изучил предложенные вами примеры, в частности http://radiokot.ru/articles/29/, но возникли вопросы:
1 как перевести код под atmelstudio
2 где взять pictures.c (как я понимаю это библиотека для работы с изображениями)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

1 посмотреть код внизу - в архивах , спросить у автора
во второй ссылке аналогично есть библиотека
2 создаете проект и переносите код
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

BigallS писал(а):.. есть библиотека
2 создаете проект и переносите код
библиотека конечно есть, но она не работает в atmelstudio , поэтому я и спрашиваю как перенести код
Вложения
3310.rar
(130.88 КБ) 148 скачиваний
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

Повторяю, создаёте пустой проект, в папку проекта добавляете файлы
из библиотеки.
В пустом проекте у вас будет типа такого

Код: Выделить всё

/*
 * GccApplication1.c
 *
 * Created: 28.03.2014 18:50:10
 *  Author: BigallS
 */ 


#include <avr/io.h>

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
и начинаете добавлять код из библиотеки

Код: Выделить всё


/*
 * GccApplication1.c
 *
 * Created: 28.03.2014 18:50:10
 *  Author: BigallS
 */ 

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#include "n3310.h"
#include "picture.h"
int main(void)
{
LcdInit();  
  while(1)
    {
     LcdClear();
            LcdImage(Picture);
        LcdUpdate();


        _delay_ms(5000);


        LcdClear();
            LcdSingleBar(0, 3, 4, 5, PIXEL_ON);
            LcdSingleBar(79, 3, 4, 5, PIXEL_ON);
            LcdSingleBar(0, 47, 4, 5, PIXEL_ON);
            LcdSingleBar(79, 47, 4, 5, PIXEL_ON);

            LcdGotoXYFont(0,2);
            LcdFStr(FONT_2X,(unsigned char*)PSTR("3310LCD"));

            LcdGotoXYFont(0,3);
            LcdFStr(FONT_1X,(unsigned char*)PSTR("Hello World :)"));
           
            byte bars[5] = {1, 2, 3, 4, 5};
            LcdBars(bars, 5, 3, 2);
        LcdUpdate();


        _delay_ms(5000);


        LcdClear();
            LcdGotoXYFont(0,2);
            LcdFStr(FONT_2X,(unsigned char*)PSTR("МОГУЧИЙ"));

            LcdGotoXYFont(0,3);
            LcdFStr(FONT_1X,(unsigned char*)PSTR("язык полностьюподдерживается:)  :)  :)  :)"));
        LcdUpdate();


        _delay_ms(5000);


        LcdClear();            
            LcdRect(0,0,83,47,PIXEL_ON);
            
            LcdCircle(41,23,20,PIXEL_ON);
            LcdCircle(33,18,3,PIXEL_ON);
            LcdCircle(49,18,3,PIXEL_ON);
            LcdPixel(33,18,PIXEL_ON);
            LcdPixel(49,18,PIXEL_ON);
            
            LcdLine(35,34,46,34,PIXEL_ON);
            LcdLine(30,31,35,34,PIXEL_ON);
            LcdLine(51,31,46,34,PIXEL_ON);
        LcdUpdate();

        
        _delay_ms(5000);
    }
   //TODO:: Please write your application code 
    }
}
пробуете Build Solution и устраняете ошибки если есть
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

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

LcdFStr(FONT_1X,(unsigned char*)PSTR("456")); - так работает

LcdFStr(FONT_1X,(unsigned char*)PSTR(456)); - а так нет
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

судя по всему, ваша библиотечная функция LcdFStr работает только со строками, находящимися во flash, поэтому с ее помощью вывести значение переменной нельзя.

ищите в библиотеке функцию, выводящую строки из ОЗУ, и используйте ее примерно так:

Код: Выделить всё

void LcdRamStr(char *str); // это как бы библиотечная функция

char temp_str[20]; // это память под строку
int my_var = 456; // это переменная, которую выводить надо

sprintf_P(temp_str, PSTR("%d"), my_var); // вывели число из my_var в строку
LcdRamStr(temp_str); // вывели строку на дисплей
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

вы правы есть такая функция

Код: Выделить всё

byte LcdStr ( LcdFontSize size, byte dataArray[] )
{
    byte tmpIdx=0;
    byte response;
    while( dataArray[ tmpIdx ] != '\0' )
    {
        // Выводим символ
        response = LcdChr( size, dataArray[ tmpIdx ] );
        // Не стоит волноваться если произойдет OUT_OF_BORDER,
        // строка будет печататься дальше из начала дисплея
        if( response == OUT_OF_BORDER)
            return OUT_OF_BORDER;
        // Увеличиваем указатель
        tmpIdx++;
    }
    return OK;
}
но вот так LcdStr(FONT_1X,54); выводиться какая то фигня, помогите конвертировать в byte
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

kelod писал(а):но вот так LcdStr(FONT_1X,54); выводиться какая то фигня, помогите конвертировать в byte
вы внимательно прочтите мое сообщение и делайте так, как там рекомендовано. если не понравится из-за роста объема прошивки, смотрите функцию itoa - она экономнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Периферия»