problem z LCD

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
p_kacper
-
Posty: 5
Rejestracja: 20 lis 2006, 10:59
Lokalizacja: Z Zarzecza

problem z LCD

Post autor: p_kacper » 22 lip 2007, 18:47

Probuje podlaczyc do Atmegi16 (8mhz) lcd 2x16 na standardowym sterowniku.
Interfejs 4-bitowy, R/W do masy,RS- PIN B2, EN- PIN B3
Czy moglby ktos sprawdzic czy ten kod jest ok?? Jest on prawie zywcem wziety z ksiazki wydawnictwa BTC, a mimo to na wyswietlaczu mam tylko czarne prostokaty (a rozumiem ze powinienem miecmrugajacy kursor).

Kod: Zaznacz cały

#include<avr/io.h>
typedef struct _bit_struct
{
	unsigned char bit0: 1;
	unsigned char bit1: 1;
	unsigned char bit2: 1;
	unsigned char bit3: 1;
	unsigned char bit4: 1;
	unsigned char bit5: 1;
	unsigned char bit6: 1;
	unsigned char bit7: 1;
}pole_bitowe;

#define DAJ_BIT(adr) (*((volatile pole_bitowe*) (adr)))
#define _PINB 0x36
#define _PORTB 0x38
#define lcd_rs DAJ_BIT(_PORTB).bit2
#define lcd_en DAJ_BIT(_PORTB).bit3

unsigned char wiersz=0;
unsigned char kolumna=0;


void czekaj_ms(unsigned long pt) // opoznienie o ok 1ms
{
#define tau 10.38
 unsigned char tp1;

 for(;pt>0;pt--)
 {
 	for(tp1=255;tp1!=0;tp1--);			
 }
}


void piszilcd(unsigned char instr)  //wysylanie instrukcji
{
	lcd_rs=0; //konf. lcd na odbieranie instrukcji
	lcd_en=1;
	PORTB=(PORTB&0x0f) | (instr&0xf0); //przygotuj starszy polbajt do wyslania

	asm("nop");
	asm("nop");
	asm("nop");
	lcd_en=0;
	czekaj_ms(10L);
	lcd_en=1;
	PORTB=(PORTB&0x0f) | ((instr&0x0f)<<4);//przygotuj mlodszy polbajt do wyslania
	asm("nop");
	asm("nop");
	asm("nop");
	lcd_en=0;
	czekaj_ms(10L);    //czekaj ok 100 us na gotowosc wyswietlacza
}




int main(void)
{
unsigned char i;

PORTB=0x03;
DDRB=0xff; //lcd podlaczony do portu B

//___________________inicjowanie LCD_____________
czekaj_ms(45*tau);
for(i=0;i<3;i++) //wyslanie 3x 3-
{
	lcd_en=1;
	PORTB=(PORTB&0x0f) | 0x30;
	asm("nop");
	asm("nop");
	asm("nop");
	lcd_en=0;
	czekaj_ms(5*tau);
}
lcd_en=1;
PORTB=(PORTB&0x0f) | 0x20; // wyslanie raz 2-
asm("nop");
asm("nop");
asm("nop");
lcd_en=0;
czekaj_ms(10L);	
piszilcd(0x28);    //4-bitowy, 2 linie, znak 5x7
piszilcd(0x08);    //wlacz lcd, wyl kursor, wyl mruganie
piszilcd(0x01);    //czysc lcd
czekaj_ms(1.64*tau);

piszilcd(0x06);    //bez przesuwania w prawo

piszilcd(0x0f);    //wl lcd, wlaczkursor, wl mruganie

while(1);
return 0;
} 
[ Dodano: 2007-07-23, 11:41 ]
juz ok. zly kontrast mialem:/


----------------
Jak już MUSISZ wkleić cały kod to zapnij go w tagi CODE. ZbeeGin
Ostatnio zmieniony 01 sty 1970, 1:00 przez p_kacper, łącznie zmieniany 1 raz.

ODPOWIEDZ