Причина: Сюда перенёс
работа c lcd
- Сообщения: 884
- Зарегистрирован: Пн июл 08, 2013 22:59:45
недавно начал изучать микроконтроллеры, не как не могу понять как работать с lcd, подскажите или ткните носом уроки, пишу на си в avr studio, в интернете ничего путного не нашёл, интересует работа и с символьными дисплеями и с не символьными
Последний раз редактировалось Gudd-Head Вт мар 25, 2014 14:51:15, всего редактировалось 1 раз.
Причина: Сюда перенёс
Причина: Сюда перенёс
- Реклама
Например так:
Содрал не помню откуда, честно. 
Спойлер
Код: Выделить всё
#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 писал(а):подскажите или ткните носом
http://fab.cba.mit.edu/classes/MIT/863. ... /44780.pdf
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Чтобы заставить работать дисплей надо понять как он управляется, что надо сделать чтобы он включился т.е. какие команды дать дисплею. После его включения обычно в графических появляется "мусор на экране", далее пишется несколько процедур которые могут выводить на экран текст, фигуры, рисунки...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
наконец появилось время разобраться с дисплеем, изучил предложенные вами примеры, в частности http://radiokot.ru/articles/29/, но возникли вопросы:
1 как перевести код под atmelstudio
2 где взять pictures.c (как я понимаю это библиотека для работы с изображениями)
1 как перевести код под atmelstudio
2 где взять pictures.c (как я понимаю это библиотека для работы с изображениями)
1 посмотреть код внизу - в архивах , спросить у автора
во второй ссылке аналогично есть библиотека
2 создаете проект и переносите код
во второй ссылке аналогично есть библиотека
2 создаете проект и переносите код
Повторяю, создаёте пустой проект, в папку проекта добавляете файлы
из библиотеки.
В пустом проекте у вас будет типа такого
и начинаете добавлять код из библиотеки
пробуете Build Solution и устраняете ошибки если есть
из библиотеки.
В пустом проекте у вас будет типа такого
Код: Выделить всё
/*
* 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
}
}
- Сообщения: 884
- Зарегистрирован: Пн июл 08, 2013 22:59:45
вообщем после долгих чтений даташитов и мануалов я остановился на одной найденной библиотеке, кажется разобрался в работе, но возникла проблема с функцией вывода текста, не пойму как вывести число
LcdFStr(FONT_1X,(unsigned char*)PSTR("456")); - так работает
LcdFStr(FONT_1X,(unsigned char*)PSTR(456)); - а так нет
LcdFStr(FONT_1X,(unsigned char*)PSTR("456")); - так работает
LcdFStr(FONT_1X,(unsigned char*)PSTR(456)); - а так нет
судя по всему, ваша библиотечная функция 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
вы правы есть такая функция
но вот так LcdStr(FONT_1X,54); выводиться какая то фигня, помогите конвертировать в byte
Код: Выделить всё
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;
}
вы внимательно прочтите мое сообщение и делайте так, как там рекомендовано. если не понравится из-за роста объема прошивки, смотрите функцию itoa - она экономнее.kelod писал(а):но вот так LcdStr(FONT_1X,54); выводиться какая то фигня, помогите конвертировать в byte
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


