Witam!
Nie chcialem tworzyc nowego tematu wiec pisze w tym. Wyswietlaczy hitech nie udalo mi sie uruchomic(tzn chwilke zadzoialala druga linia ale pozniej wszystko zniklo i juz nic nie da sie zrobic.)Kupilem inny wyswietlacz 2x16 oznaczony SVM1602B. Podpiolem go do AT89S52 w trybie 4bitowym wedlug tej rozpiski :
/*
LCD uC
DB4 = P0.0
DB5 = P0.1
DB6 = P0.2
DB7 = P0.3
D/~C (RS) = P0.4
R/~W = P0.5
E = P0.6
*/
Wyswietlacz ma zaczerniona druga linie wiec kontrast jest ok.
Przepisalem taki programik z ksiazki "Programowanie uC rodziny 8x51 w jezyku C". Program kompilowalem KEILEM i nie bylo zadnych errorow i warningow. Zapodalem do uC i nic...tzn caly czas zaczerniona jest druga linia

.
Oto programik:
/*
LCD uC
DB4 = P0.0
DB5 = P0.1
DB6 = P0.2
DB7 = P0.3
D/~C (RS) = P0.4
R/~W = P0.5
E = P0.6
*/
//********************************************
#include <REG52.H> // definicja SFR procesora `51
sbit przycisk=P3^2;
#define DATA_LCD P0 // wyswietlacz podlaczony do portu P0
sbit DC_LCD = P0^4; // linia D/~C (Data/Control)
sbit RW_LCD = P0^5; // linia R/~W (Read/Write)
sbit E_LCD = P0^6; // linia E (Enable)
#define HOME 0x80 // ustaw kursor na poczatku pierwszej linii lcd
#define INITDISP 0x28 // interfejs 4bitowy
#define HOM2 0xc0 // ustaw kursor na poczatku drugiej linii lcd
#define LCDON 0x0f // wlacz LCD,wlacz kursor, wlacz migotanie
#define CLEAR 0x01 // zeruj LCD i ustaw kursor na pocatek pierwszej linii
/* prototypy funkcji obslugi wyswietlacza */
void LCD_ctrlWR ( char );
void LCD_dataWR ( char );
void put_message ( char*);
#define LCD_init { LCD_ctrlWR(INITDISP); LCD_ctrlWR(CLEAR); LCD_ctrlWR(LCDON); }
void main ( void ) {
char i= 0x20; // pierwszy wyswietlany znak to odstep
LCD_init;
put_message ( "LCD DEMO: <<<press P3.2" );
while(1) {
while (przycisk);
while (!przycisk);
LCD_ctrlWR (HOM2);
LCD_dataWR (i++); // kolejne znaki ASCII drukowane sa na poczatku drugiej linii wyswietlacz
}
}
/* sprawdzanie flagi zajetosci wyswietlacza LCD */
BYTE check_busy (void) {
BYTE bf;
DATA_LCD |= 0x0f; // dana znajduje sie na mlodszej czworce portu
DC_LCD = 0; // linia D/~C : odczyt slowa Control (status)
RW_LCD= 1; // linia R/~W : odczyt Read
E_LCD= 1;
bf= DATA_LCD & 0x08; // najstarszy bit informuje o zajetosci LCD
E_LCD= 0;
E_LCD= 1; // linia Enable E=1: odczyt z wyswietlacza
E_LCD= 0;
return (bf);
}
/* zapis 4 bitow do wyswietlacza LCD */
void write_nibble ( BYTE nibble ) {
E_LCD= 0; // Enable E=0
DATA_LCD &= 0x0f; // pozostaw starsza czworke bez zmnian
RW_LCD= 0; // zapis: R/~W=0
nibble &= 0x0f; // tylko cztery mlodsze bity beda zapisane
DATA_LCD |= nibble; // wystawienie danych do zapisu
E_LCD= 1; // Enable E=1: zapis do wyswietlacza
E_LCD= 0; // Enable E=0: koniec zapisu
}
/* zapis slowa sterujacego CONTROL do wyswietlacza LCD */
void LCD_ctrlWR ( BYTE cmde) {
while (check_busy() ); // sprawdzenie zajetosci wyswietlacza
DC_LCD= 0; // wybierz rejestr Control LCD
write_nibble(cmde >> 4); // zapis starszej czworki bajtu Control
write_nibble(cmde); // zapis mlodszej czworki bajtu Control
}
/* zapis danych DATA do wyswietlacza LCD */
void LCD_dataWR ( BYTE byte) {
while (check_busy() ); // sprawdzenie zajetosci wyswietlacza
DC_LCD= 1; // wybierz rejestr Data LCD
write_nibble(byte >> 4); // zapis starszej czworki bajtu Data
write_nibble(byte); // zapis mlodszej czworki bajtu Data
}
/* podprogram drukowania ciagu znakow az do ogranicznika 0x00 */
void put_message (char*s) {
while(*s)
LCD_dataWR (*s++);
}
Jesli ktos moglby mi pomoc chociaz zeby pojawil sie najprostrzy tekscik na wyswietlaczu to bylbym bardzo wdzieczny.
POZDRAWIAM MACIEK!