| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| LCD бъг http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1165 |
Страница 1 от 1 |
| Автор: | reptile [ Чет Окт 27, 2005 5:02 pm ] |
| Заглавие: | LCD бъг |
Здравейте , Имам LCD модул , който е свързан по следната схема http://atilabs.hit.bg/hardware/proj1.html#i2 . Разликата е , че вместо LPT ползвам един от портовете на PIC16F871 и пренаписах примерния код на ASM Печатам по LCD-то успешно само ме смущава , че при включване на LCD-то и изваден от цокъла PIC , то влиза в някакъв крив режим и 1-ви и 3-ти ред са черни . Имате ли идея защо се получава ? И още един въпрос : Възможно ли е ако времената на изчакване между командите са ПО-ГОЛЕМИ (за по-малки е ясно) да възникнат някакви проблеми ? |
|
| Автор: | BrainStorm [ Чет Окт 27, 2005 5:22 pm ] |
| Заглавие: | |
Относно въпроса ... "при изваден от цокала ПИК" тва едва ли може да го наречеш бъг на дисплея ... щото всичките му пинове си фърчат във въздоха и неможеш да контролираш как ше го интерпретира тва драивера .. ?!? Макар че не би трябвало да е така ... все пак мисля че има някви издърпващи резистори които да го пазят иммено от тва ... За по-голямия delay при изпращане на командите не мисля че има някво ограничени (ама ти гледаи да не е пвече от 1.сек де ... щото знам ли ??? |
|
| Автор: | ДедоБоре [ Чет Окт 27, 2005 5:37 pm ] |
| Заглавие: | |
ха! браво на ангелчо за много пълното описание, прилича на дипломна работа. на въпроса ти: всички дисплей с контролер на хитачи при ресет тръгват като едноредови. ако си нагласил яркостта за 2 реда, когато не е инициализиран дисплея (в режим на един ред), целия ток отива само за половината пиксели и затова единия ред е много черен, а другия съвсем го няма. четириредовия дисплей, които ползваш, в същност е двуредов, н с по-дълги редове (2х80), нато 3-ти ред е ред 1 след 40-тия знак. затова 1-ви и 3-ти ред са тъмни в началото. решението е: - да не вадиш пика от цокъла - да подпреш Vp на PWM на пика и да регулираш светенето софтуерно |
|
| Автор: | BrainStorm [ Чет Окт 27, 2005 5:39 pm ] |
| Заглавие: | |
А така .... виж че всичко си има обяснение ... (за тва не бях се сетил ... ) |
|
| Автор: | Топ [ Пет Окт 28, 2005 3:58 pm ] |
| Заглавие: | LCD |
Буквено-цифровите дисплеи при липса на инициализация се засветяват наполовина. Ако е два реда - само горния, ако са 4 - редове 1-ви и 3-ти. Това е нормално. При инициалицация линиите да данни да са на ниво "0". Времената мажду командите нямат значение. При 8-битово управление, инициализация и посане по дисплая може да се прави и само с джъмпери и резистори по входовете, без контролер. Ако правиш 4-битово управлвние, при инициализацията неизползваните линии (D0-D3) да са към земя (0V). |
|
| Автор: | Predator_MF [ Пет Окт 28, 2005 4:18 pm ] | |||||||||
| Заглавие: | Re: LCD | |||||||||
Само малко да те корегирам...имат значение. Първо има значение с каква скорост тъпчеш данните, второ, има значение каква команда подаваш. За тази цел има поставен BF (busy flag), в повечето случай не се ползва (когато RW е на маса). За пример ще дам команда за затриване на LCD, която трябва да чакаш 2ms |
||||||||||
| Автор: | Топ [ Пет Окт 28, 2005 4:38 pm ] |
| Заглавие: | LCD |
Е нали ставаше въпрос за големи времена, за малките е ясно. Аз лично управлявам тези LCD-та само по 6 пина, не чета никакъв флаг. Освн изтриването на екрана, другите команди са по 37us по документация, даже някои образци работят и на под 30us. Но по подразбиране залагам 40 и нямям никакви проблеми. Но за големи времена, няма проблеми, така преди години подкарах с джъмпери първия си дисплей. |
|
| Автор: | guestx [ Сря Ное 09, 2005 5:15 pm ] | ||
| Заглавие: | |||
Видях, че коментирате проблеми по lcd-та и реших да се включа. От известно време се опитвам да подкарам едно 2x16 lcd в 4 битов режим като използвам собствени функции, но нещо не тръгва. Като го пусна вторият ред е черен и никакъв текст не излиза на дисплея. Всичкo ми изглежда както трябва. Аднал съм сорса, някой ако може да ми каже кое не в ред. Ползвам CodeVision, Db0-Db3 i RW съм ги дал към GND.
|
|||
| Автор: | Топ [ Сря Ное 09, 2005 6:17 pm ] |
| Заглавие: | LCD 4-bit mode |
Ето ти направо решение с 37 думи - инициализация, изпращане на команда и данни. Това го писах тогава за АТ90S2313, на 4 MHz. Работи и на всички АТмеги и цялата серия АТ90. Направо си виж само в инициализацията къде бъркаш. Най-често бъркат като не пращат 3 пъти тройки в началото, или не дават време на модула да се инициализира. Хайде и се похвали като го пуснеш, защото този код вече работи в N модула. А ако изпълниш "Welmes" фуннкцията, на долния ред ще ми изпише името на кирилица. Успех! ;***************************************************************************** ;* LCD Driving in 4-bit Mode * ;* * ;* This program is a Driver for Character LCDs - Industrial Standart * ;* * ;* Author: * ;* Datе : 10 / 2002 * ;***************************************************************************** ;========================================================== ;----------------------------------------------------------------------------- ; LCD DEFINITIONS ;----------------------------------------------------------------------------- .def temp= R16 ; Global Variables .def temp1= R17 .def fine= R2 ; Pause .equ LCD_DATA= PORTB ; LCD Data Register ; D4-D7 = PB0-PB3 (pins 12-15) .equ LCD_RS= 4 ; Lcd Register-Select Control = PB4 - pin 16 .equ LCD_E= 5 ; Lcd Enable Control = PB5 - pin 17 .def LCD_Byte= R23 ; Lcd Byte - Command Or Data .def SByte= R25 ; Variable For 4-Bit interface ;============================================================================= ;------------------------ L C D H A N D L I N G -------------------------- ;============================================================================= LCDINIT: ; Initialize Lcd ldi temp , 128 ; Start Up time > 20ms rcall DELAY ldi LCD_Byte , 0x33 ; Set up rcall LCDCMD ldi LCD_Byte , 0x32 ; 4-Bit interface rcall LCDCMD ldi LCD_Byte , 0x28 ; 2 Lines, 5x7 dots rcall LCDCMD ldi LCD_Byte , 0x08 ; Display Off rcall LCDCMD ldi LCD_Byte , 0x01 ; Clear Screen rcall LCDCMD ldi LCD_Byte , 0x06 ; Entry Mode Set rcall LCDCMD ldi LCD_Byte , 0x0F ; Display On rcall LCDCMD rjmp CustomLCD ; End Initialization ;---------------------------------------------------------------------------- LCDCMD: ; Send COMMAND To Lcd ;---------------------------------------------------------------------------- ; Command Code must be in LCD_Byte ldi temp1 , 0x20 ; RS => '0' + Enable => '1' rjmp Char ;---------------------------------------------------------------------------- LCDCHAR: ; Disply CHARACTER On Lcd ;---------------------------------------------------------------------------- ; Character Code must be in LCD_Byte ldi temp1 , 0x30 ; RS => '1' + Enable => '1' Char: mov SByte , LCD_Byte ; LCD_Byte => SByte Swap SByte ; SByte = D3-D0/D7-D4 andi SByte , 0x0F ; SByte = 0000/D7-D4 or SByte , temp1 ; SByte = 0 0 1 RS/D7-D4 out LCD_DATA , SByte ; Apply Data On Lcd Pins cbi LCD_DATA , LCD_E ; Enable => '0' ldi temp , 32 ; DELAY > 6 ms rcall DELAY ; Required only For Initialisation mov SByte , LCD_Byte ; LCD_Byte => SByte andi SByte , 0x0F ; SByte = 0000/D3-D0 or SByte , temp1 ; SByte = 0 0 1 RS/D3-D0 out LCD_DATA , SByte ; Apply Data On Lcd Pins cbi LCD_DATA , LCD_E ; Enable => '0' ldi temp , 26 ; DELAY > 5 ms ; Time To Accept Command/Data DELAY: ; DALAY=771 x (temp) x Tosc dec fine ; +1 brne DELAY ; +2 dec temp ; +1 brne DELAY ; +2 ret ; End ;============================================================================= ; End LCD Control Program - total 37 words ;============================================================================= ;============================================================================= ; CUSTOMIZE LCD ;============================================================================= CustomLCD: ; Load 8 custom characters into Lcd ldi LCD_Byte , 0x40 ; Set Cursor at the begining of CGRAM rcall LCDCMD ldi ZH , high(2*LCDTable) ; Set Pointer To Lcd Table ldi ZL , Low(2*LCDTable) Lp: lpm ; Load Byte from Program Memory into R0 mov LCD_Byte , r0 rcall LCDCHAR ; Display Character adiw ZL , 1 ; Set the Pointer To the Next Character cpi Zl , Low(2*LCDTable+64) ; Tablå loaded ? brne Lp ; NO - Go On ret ; End LCDTable: ; CUSTOM CHARACTERS DESCRIPTION .db 12, 18, 20, 30, 17, 17, 30, 0 ; â = Craracter Code '00' .db 0, 0, 15, 21, 21, 21, 21, 0 ; ò = Craracter Code '01' .db 14, 17, 1, 14, 1, 1, 30, 0 ; Ç = Craracter Code '02' .db 0, 0, 14, 17, 17, 30, 1, 30 ; ä = Craracter Code '03' .db 4, 10, 10, 10, 10, 10, 31, 17 ; Ä = Craracter Code '04' .db 0, 0, 17, 17, 31, 17, 17, 0 ; í = Craracter Code '05' .db 0, 0, 17, 17, 15, 1, 1, 0 ; ÷ = Craracter Code '06' .db 0, 0, 17, 19, 21, 25, 17, 0 ; è = Craracter Code '07' ;LCDTable: ; CUSTOM CHARACTERS DESCRIPTION (Cyrillic letters) ;.db 31, 17, 16, 16, 16, 16, 16, 0 ; Ã = Craracter Code '00' ;.db 4, 10, 10, 10, 10, 10, 31, 17 ; Ä = Craracter Code '01' ;.db 17, 17, 19, 21, 25, 17, 17, 0 ; È = Craracter Code '02' ;.db 7, 9, 9, 9, 9, 9, 17, 0 ; Ë = Craracter Code '03' ;.db 31, 17, 17, 17, 17, 17, 17, 0 ; Ï = Craracter Code '04' ;.db 17, 17, 17, 15, 1, 1, 1, 0 ; × = Craracter Code '05' ;.db 24, 8, 8, 14, 9, 9, 14, 0 ; Ú = Craracter Code '06' ;.db 15, 17, 17, 15, 5, 9, 17, 0 ; ß = Craracter Code '07' ;============================================================================= ; E N D CUSOMIZING - Total 43 Words ;============================================================================= ;============================================================================= LCDMSG: ; Dislay String On Lcd, the last Byte must be '08' ; Register Z points the String is FLASH memory ;============================================================================= lpm ; Load Byte from Program Memory into R0 mov LCD_Byte , r0 cpi LCD_Byte , 8 ; End Message ? ("08" means End String) breq Msgend ; YES => Exit rcall LCDCHAR ; Display Character adiw ZL , 1 ; Set the Pointer To the Next Character rjmp LCDMSG ; Loop Msgend: ret ; End String ;============================================================================= ; END of showing a string on LCD - Total 8 Words ;============================================================================= ;============================================================================= LCDBYTE: ; Display Byte on LCD in HEX Value (00-FF) ;============================================================================= push LCD_Byte ; Store Byte in STACK swap LCD_Byte ; LCD_Byte = 4321/7654 rcall DisNibble ; Display High Nibble pop LCD_Byte ; Restore Byte from STACK DisNibble: andi LCD_Byte , 0x0F ; LCD_Byte = 0000/xxxx ori LCD_Byte , 0x30 ; LCD_Byte = 0011/xxxx cpi LCD_Byte , 0x3A ; Data > 9 (A..F) ? brlo Lcdok subi LCD_Byte , 0xF9 ; YES => Convert Value Lcdok: rjmp LCDCHAR ; Display Character and Exit ;============================================================================= ;============================================================================= ; Display Welcome Message ;============================================================================= Welmes: ldi LCD_Byte , 0x80 ; Set Cursor Position = Line 1, Pos 1 rcall LCDCMD ldi ZH , high(2*Mess01) ; Set Message Pointer To Mess01 ldi ZL , Low(2*Mess01) rcall LCDMSG ; Display " LCD Demo Module " ldi LCD_Byte , 0xC0 ; Set Cursor Position = Line 2, Pos 1 rcall LCDCMD ldi ZH , high(2*Mess02) ; Set Message Pointer To Mess02 ldi ZL , Low(2*Mess02) rcall LCDMSG ; Display ret ;----------------------------------------------------------------------------- ; MESSAGES ;----------------------------------------------------------------------------- Mess01: .db " LCD Demo Module ", 8 Mess02: .db "A",0,1,"op:",2,3,"pa",0,"ko ",4,"e",5,6,"e",0; .db 8 ;============================================================================= |
|
| Автор: | guestx [ Сря Ное 09, 2005 7:26 pm ] |
| Заглавие: | |
Пиша собствени функции, защото ползвам различни портове за данни и RS и EN. Иначе не бих се занимавал, щеше направо да ползвам готовите библиотеки на CodeVision. Малко странно се получи, че не мога да сложа LCD-то на 1 порт. Освен това асемблера не ми е силната страна |
|
| Автор: | the_real_maniac [ Сря Ное 09, 2005 7:45 pm ] |
| Заглавие: | |
Виж Function Set-а на твоете LCD и просто задай бита ,който указва 4/8бит интефейс за 4. относно сменянето на портовете #define за какво е #define RS PORTA,1 или #define RS 0x05,1 и по нататък ползваш само RS |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|