Программирую AVR не первый год, работал с кучей lcd... Взял wh1602b, перечитал всю документацию и примеры. С 8 битной шиной запустился с первого раза, вывел две строки поигрался все работает отлично!!! потом понадобились ножки хотел переподключить контроллер на 4 битную шину и начались чудеса, дисплей выводит символы но криво и где ему хочется!!! Второй день схожу с ума, перепробовал кучу вариантов может последний и не самый удачный, пробовал менять задержки и что я только не пробовал все зря...
один и тот же код на 8 бит работает на 4 с поправками инициализации и подстановки не работает !!!
Библиотека написана под Микропаскаль, но сложного ничего нету. Пробуй
Код:
//****************************************************************** //**** Functions for LCD WH1602 teste on WH1602A-NGG-CT (hd44780) //****************************************************************** //Controller: AVR //Compiler: mikroPascal PRO for AVR v.5.6.0 //Author: Vladimir Bejevetc (Ukraine) // www.voov.com.ua //ver: 1.0 // //******************************************************************
procedure lcd_cmd(p: byte); begin lcd_port := (p and 0xF0) or (1 shl EN); delay_1ms(); lcd_port := lcd_port and not (1 shl EN); delay_1ms(); lcd_port := ((p shl 4) and 0xF0) or (1 shl EN); delay_1ms(); lcd_port := lcd_port and not (1 shl EN); delay_1ms(); end;
procedure lcd_dat(p: byte); begin lcd_port := ((p and 0xF0) or (1 shl RS)) or (1 shl EN); delay_1ms(); lcd_port := lcd_port and not (1 shl EN); delay_1ms(); lcd_port := ((p shl 4) and 0xF0) or (1 shl RS) or (1 shl EN); delay_1ms(); lcd_port := lcd_port and not (1 shl EN); delay_1ms(); end;
procedure lcd_goto_cursor(x, y: byte); begin case y of 1: y := LCD_FIRST_ROW; 2: y := LCD_SECOND_ROW else y := LCD_FIRST_ROW; end; y := y + x - 1; lcd_cmd(y); end;
procedure lcd_out(x, y: byte; msg: ^byte; max_len: byte); var i: byte; begin lcd_goto_cursor(x, y); i := 0; while (msg^ <> 0) and (i < max_len) do begin lcd_dat(msg^); inc(msg); inc(i); end; end;
procedure lcd_out_current_pos(msg: ^byte; max_len: byte); var i: byte; begin i := 0; while (msg^ <> 0) and (i < max_len) do begin lcd_dat(msg^); inc(msg); inc(i); end; end;
procedure lcd_out_const(x, y: byte; const msg: ^byte; max_len: byte); var i: byte; begin lcd_goto_cursor(x, y); i := 0; while (msg^ <> 0) and (i < max_len) do begin lcd_dat(msg^); inc(msg); inc(i); end; end;
procedure lcd_out_const_current_pos(const msg: ^byte; max_len: byte); var i: byte; begin i := 0; while (msg^ <> 0) and (i < max_len) do begin lcd_dat(msg^); inc(msg); inc(i); end; end;
спасибо !!! Если кому то пригодится то ответ таиться в библиотеки вежливо предложной vovksextra
lcd_cmd(0x02); // Шина 4 бит. . --- вот так работает
а я пробовал посылать 0x2C и 0x28 для перевода на 4 битную шину - так советовали во многих примерах, но так не работает!!!
я так понял что после скармливания ему $2, или 0010 в бинаре, контроллер сразу переходит на 4 бит шину и последующие пол байта уже не принимаются должным образом а наоборот сбивают(сдвигает) все последующею команды и данные на эти пол байта, и получается что не получается
Плохо вы читали документацию, как и тот чьими исходниками вы пользуетесь. Порядок инициализации приведен в DS на HD4480, например тут http://www.adafruit.com/datasheets/HD44780.pdf стр. 46
Плохо делать глупые комментарии, на то то что работает в железе уже давно. И с чем были проблемы, которые устранены.
Вы очень зря придераетесь. Человек абсолютно верно подметил, что даташит вы не читали. Там черным по белому написано, что для верной инициализации 4-х битного режима необходимо трижды повторить одну и ту же последовательность. И только после этого уже контроллер экрана будет верно воспринимать посылаемые ему комманды
Всегда удивлялся такого рода постам. К вам человек обратился за помощью - так помогите ему. Читать даташит умеют все, а понять что как делать только некоторые. Как раз таки я его и читал и делал все как положено, но устройство отказывалось работать. Я привел рабочий и проверенный код, а Вы мне говорите что так работать не будет.....Пля....
Купите здесь LCD и запустите его при помощи даташита, на который вы ссылаетесь - вот тогда все сами и поймете.
PS В данном LCD контроллер используется S6B0066U
Полным аналогом данного контроллера являются следующие контроллеры: * HD44780 * KS0066
Всегда удивлялся такого рода постам. К вам человек обратился за помощью - так помогите ему. Читать даташит умеют все, а понять что как делать только некоторые. Как раз таки я его и читал и делал все как положено, но устройство отказывалось работать. Я привел рабочий и проверенный код, а Вы мне говорите что так работать не будет.....Пля....
ВЫ верно говрите. Но упускаете один момент. Индикатор индикатору рознь. однажды я написал свою первую либу по работе с индикатором Wh1602D и был доволен как слон, решив, что теперь я всегда смогу использовать эти индикаторы аж бегом. Прошло немного времени, в очередном проекте нужно было подключить индикатор и оп ля - Не работает. Инициализация проходит через раз. Психовал я и ломал голову не один день в поисках проблемы. И только в конце концов разглядывая инициализацию, понял, что инциализировать его нужно не 1 раз... Это я всё к тому, что отлично работающий код на 1 изделии, не гарантирует его 100% исправность на серии, а значит, что работало у одного - не факт, что так же хорошо сработает у другого. Вы дали полезный совет человеку, я же хотел уточнить 1 момент, из-за которого, может вылезти баг. Мир?
Плохо делать глупые комментарии, на то то что работает в железе уже давно. И с чем были проблемы, которые устранены.
Вы очень зря придераетесь. Человек абсолютно верно подметил, что даташит вы не читали. Там черным по белому написано, что для верной инициализации 4-х битного режима необходимо трижды повторить одну и ту же последовательность. И только после этого уже контроллер экрана будет верно воспринимать посылаемые ему комманды
во первых посмотрите код там трижды идет команда инициализации и выдержанными интервалами во вторых vovksextra огромное спасибо за помощь, а все остальные кто решил блеснуть умом после того ка вопрос уже решился не вызывают много уважения так как для этого много ума не нужно, я читал всё в том числе и даташит, и в 8 битном режиме все заработало за 15 мин, вопрос был в 4 битном режиме, там скользко с тем что по началу шлешь контроллеру 4 бита а он принимает команду как по 8 битной шине пока не схавает каманду $C, а по этому нельзя слать команды 0xC_.......
Выкладываю свой вариант общения контроллера с дисплеем по 4 линиям. Учился по книге Вольфганга Трамперта "AVR-RISC микроконтроллеры", откуда и взяты подпрограммы, которые переделал под 4-х битный режим. Сейчас вот работаю над валкодером...
Еще хотелось бы добавить к вышесказанному: в приложенной программе сигналы управления индикатором и данные передаются через разные порты ATMEL. Так удобнее для написания программы, но не рационально в плане использования портов. Поэтому, потом я изменил программу и вывел все сигналы для индикатора через один порт. Надо сказать, пришлось попотеть!!! Все получилось, но скорость работы стала явно ниже, т.е. при тактовой частоте 1МГц индикатор ничего не показывал. И лишь при снижении ее до 400кГц все было нормально. Для сравнения: в 8-битном режиме все работало и при 8МГц.
Здравствуйте. Осваиваю WH1602B-YYH-CTK на HD44780, нашел на мой взгляд хороший драйвер, для работы с ним http://we.easyelectronics.ru/AVR/hd44780-biblioteka-dlya-avr-gcc.html. Но мне стало интересно, а можно сделать, чтобы одна строка прокручивалась, а на второй оставалось статичное сообщение. В инете погуглив почти не встретил чтобы кто-то задавался этим вопросом, а строки если прокручиваются, то обе одновременно, если статичное сообщение, то на обе строки тоже. Если кто видел, или делал подобное - напишите.
.....а можно сделать, чтобы одна строка прокручивалась, а на второй оставалось статичное сообщение. В инете погуглив почти не встретил чтобы кто-то задавался этим вопросом, а строки если прокручиваются, то обе одновременно, если статичное сообщение, то на обе строки тоже. Если кто видел, или делал подобное - напишите. ......
Аппаратно это сделать нельзя. Программно - очень просто. Выводим верхнюю строчку, а нижнюю выводим в цикле.
Ничего сложного. Т.к. контроллер дисплея не содержит таких встроенных функций, то нужно объявить текстовую строку/массив над которой мы будем издеваться. Данный массив должен с определенной переодичностью(например по таймеру) передаваться в дисплей чтобы обновить информацию. Примерно так: char text[16*2]="наша строка"; lcd_puts(text); while(1){ //здесь смещаете напр. первые 16 индексов text[15]=text[0]; for(i=0; i<15; i++) { text[i]=text[i+1]; } lcd_puts(text);//обновить картинку дисплея delay_ms(1000); }
С прокруткой разобрался, спасибо за помощь. А не поможите как вывести длинное сообщение в одной строке(скажем строку в 100 символов). Я накидал код в котором сначало разбиваю строки на двухмерный массив, в котором 1ый индекс - номер массива состоящего из 40 символов.Но в него заносятся непонятно почему пробелы и только где-то в конце первая буква Д
int main(void) { lcdInit();//ОБЯЗАТЕЛЬНО lcdClear();//ОБЯЗАТЕЛЬНО unsigned char myString[] = "Длина этого сообщение 100 символов, для тестирования вывода большой строки более 40 символов!!!!!!!"; unsigned int myArray1[5][40];//Объявляю 2мерный массив из 5 массивов по 40 символов unsigned char b = 0; unsigned char i = 0; lcdGotoXY(0, 0);//Переходим на начало верхней строки for (unsigned char k = 0; k < 99; k++){ myArray1[b][i] = myString[k];//Заполняем массив значениями i++; if (i == 40){//Если конец массива, то переходим к следующему i = 0; b++; } } lcdPuts(myArray1[0]);//Загружаем в lcd первый массив из 40ка символов //Теперь в myArray1 двумерный массив, с разбитой строкой, по 40 символов while(1) { lcdDisplayScroll(1, LCD_SCROLL_LEFT);//Прокручиваем на позицию влево _delay_ms(600); } }
В итоге поидеи должно получится: myArray1 = {"Длина этого сообщение 100 символов", "тестирования вывода большой строки более" , " 40 символов!!!!!!!"} Или подскажите как можно подругому разбить массив на 40 символов каждый.
Может я чего не понял, но зачем строку разбивать на двухмерный массив? myString[0] - начало первого сообщения myString[0+40] - второе сообщение и т.д. Обращайтесь сразу к исходной строке и ничего не мудрите.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения