Страница 1 из 1
работа c lcd
Добавлено: Чт мар 20, 2014 16:54:16
kelod
недавно начал изучать микроконтроллеры, не как не могу понять как работать с lcd, подскажите или ткните носом уроки, пишу на си в avr studio, в интернете ничего путного не нашёл, интересует работа и с символьными дисплеями и с не символьными
Re: работа c lcd
Добавлено: Чт мар 20, 2014 18:04:04
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);
}
Содрал не помню откуда, честно.

Re: работа c lcd
Добавлено: Чт мар 20, 2014 18:58:59
kelod
я видел этот код, не получается его заставить работать(
Re: работа c lcd
Добавлено: Вт мар 25, 2014 14:48:39
Gudd-Head
kelod писал(а):подскажите или ткните носом
Как вариант:
http://fab.cba.mit.edu/classes/MIT/863. ... /44780.pdf
Re: работа c lcd
Добавлено: Ср мар 26, 2014 00:12:02
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
Re: работа c lcd
Добавлено: Чт мар 27, 2014 16:35:37
kelod
наконец появилось время разобраться с дисплеем, изучил предложенные вами примеры, в частности
http://radiokot.ru/articles/29/, но возникли вопросы:
1 как перевести код под atmelstudio
2 где взять pictures.c (как я понимаю это библиотека для работы с изображениями)
Re: работа c lcd
Добавлено: Пт мар 28, 2014 13:50:11
BigallS
1 посмотреть код внизу - в архивах , спросить у автора
во второй ссылке аналогично есть библиотека
2 создаете проект и переносите код
Re: работа c lcd
Добавлено: Пт мар 28, 2014 15:29:28
kelod
BigallS писал(а):.. есть библиотека
2 создаете проект и переносите код
библиотека конечно есть, но она не работает в atmelstudio , поэтому я и спрашиваю как перенести код
Re: работа c lcd
Добавлено: Пт мар 28, 2014 18:51:05
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 и устраняете ошибки если есть
Re: работа c lcd
Добавлено: Ср апр 09, 2014 15:58:39
kelod
вообщем после долгих чтений даташитов и мануалов я остановился на одной найденной библиотеке, кажется разобрался в работе, но возникла проблема с функцией вывода текста, не пойму как вывести число
LcdFStr(FONT_1X,(unsigned char*)PSTR("456")); - так работает
LcdFStr(FONT_1X,(unsigned char*)PSTR(456)); - а так нет
Re: работа c lcd
Добавлено: Ср апр 09, 2014 16:23:23
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); // вывели строку на дисплей
Re: работа c lcd
Добавлено: Чт апр 10, 2014 08:45:09
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
Re: работа c lcd
Добавлено: Чт апр 10, 2014 10:12:49
ARV
kelod писал(а):но вот так LcdStr(FONT_1X,54); выводиться какая то фигня, помогите конвертировать в byte
вы внимательно прочтите мое сообщение и делайте так, как там рекомендовано. если не понравится из-за роста объема прошивки, смотрите функцию
itoa - она экономнее.