Problem s LCD
Pavel Prochazka.zde.cz
hacesoft@mujmail.cz
Sobota Listopad 5 21:01:50 CET 2005
Dobry den,
uz jsem se setkal s LCD displayem ktery BF neposilal... Tak jsem to
udelat tak ze jsem tam dal cekani. A hotovo. Cekam 9 milisekund. A neni
to poznat na LCD display.
Jinak, musite display prepnou na cteni, a potom muzete cekat na BF (busy
flag). Nejprve lezou bity 7 az 4 a potom 3 az 0. To pokud pouzivate
4+bit komunikaci.
Postupujte nasledovne:
Nastavte:
Nastavime port na vstupni
xxx:
RS = 0
RW = 1
EN =1
//tu jsou k dispozici bity 7 az 4
zde cist port
EN = 0
EN = 1
// tu jsou k dispozici bity 3 az 0. Ale jsou nam k nicemu
EN = 0
zde muzem provest test na BF priznak. Pokud neni tak skoc na navesti XXX
Pokud jsem se priznaku BF dockali provedem
RW = 0
A muzem port konfigurovat na vystupni
To nahore je pocesteni nasledujiciho kodu, ktery je napsan pro PIC
jednocip v jazyce C. Zde si muzete vsimnou ze mam zdrojak pripraveny pro
obe eventuality. Jak test na cekani priznaku BF, tak i testovani. Ktera
se pouzije si zvolim pri prekladu kodu.
void lcd_busy (void){
#if _BF_FLAG==true //Nektere displaye neposilaji informaci o dokonceni
TRISB1 = 1; //Nastavani RB1 na vstupni PIN
TRISB2 = 1; //Nastavani RB2 na vstupni PIN
TRISB4 = 1; //Nastavani RB4 na vstupni PIN
TRISB5 = 1; //Nastavani RB5 na vstupni PIN
asm ("xxx: nop");
//for(;;) {
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
asm ("movf _PORTB,w");
LCD_EN = 0;
LCD_EN = 1;
LCD_EN = 0;
asm ("andlw _LCD_BF"); //Test na BF příznak.
asm ("btfsc _STATUS,2"); //TEST na ZERO
asm ("goto xxx"); //TEST na ZERO
// }
LCD_RW = 0;
TRISB1 = 0; //Nastavani RB1 na vystupní PIN
TRISB2 = 0; //Nastavani RB2 na vystupní PIN
TRISB4 = 0; //Nastavani RB4 na vystupní PIN
TRISB5 = 0; //Nastavani RB5 na vystupní PIN
#else
DelayMs(9);
#endif
Pavel Prochazka.zde.cz
snad jsem vam trochu pomohl......
Radim Hořínek napsal(a):
>Zdravim konferenci!
>Narazil jsem na "zajimavy" problem s LCD displejem. K jeho obsluze
>pouzivam funkce z CodeVisionAVRv C. Pri simulaci v AVR studiu se mi ale
>program docela casto zacyklil. Nakonec jsem prisel na to, ze funkce na
>cekani na zapis vypada takto:
>#asm
> .equ __lcd_direction=__lcd_port-1
> .equ __lcd_pin=__lcd_port-2
> .equ __lcd_rs=0
> .equ __lcd_rd=1
> .equ __lcd_enable=2
> .equ __lcd_busy_flag=7
>#endasm
>
>__lcd_busy:
> rcall __lcd_delay
> sbi __lcd_port,__lcd_enable ;EN=1
> rcall __lcd_delay
> sbic __lcd_pin,__lcd_busy_flag
> rjmp __lcd_busy
> cbi __lcd_port,__lcd_enable ;EN=0
>
>Ale pritom brány 4-7 jsou a maji byt vyuzity pro posilani dat do
>displeje.To znamena, ze pokud poslu do displeje jakakoli data, ktera
>nastavi bit 7 na 1 (napr znak "o" a spousta dalsich) dojde k zacykleni,
>prouoze je nasteven "busy_flag". Jak mam toto osetrit? Napadlo mejednoduse
>to testovani vypustit, ale potom asi nebude dodrzeno spravne casovani....
>Jaky bit mam tedy testovat?
>Prosim o radu a zaroven dekuji.
>Radim Horinek
>
>
>
>
Další informace o konferenci Hw-list