Fel tecken kommer ut på min LCD display *Löst problemet*
Postat: 26 april 2009, 11:56:05
Jag har köpt en 2x20 tecken JHD202A LCD display på electrokit och försöker nu få den att fungera inför ett projekt.
Men efter att både ha läst datablad för ks0066 och hd44780 så kan jag omöjligt få den att fungera som den ska. Har läst att ks0066 ska fungera likadant som en hd44780 så jag testade med koden jag har använt på en sådan display och då får jag ut detta:

Datan jag skickar till displayen är en variabel som jag räknar upp med ett för varje bokstav och det som kommer ut är alltså 8 stycken likadana tecken på rad.
Vad är det som händer?
Koden jag använder är den följande:
Men efter att både ha läst datablad för ks0066 och hd44780 så kan jag omöjligt få den att fungera som den ska. Har läst att ks0066 ska fungera likadant som en hd44780 så jag testade med koden jag har använt på en sådan display och då får jag ut detta:

Datan jag skickar till displayen är en variabel som jag räknar upp med ett för varje bokstav och det som kommer ut är alltså 8 stycken likadana tecken på rad.
Vad är det som händer?
Koden jag använder är den följande:
Kod: Markera allt
char main(void)
{
unsigned char test = 'a';
DDRB = 0xFF;
DDRD = 0xFF;
PORTB = 0;
PORTD = 0;
TIMSK |= (1<<TOIE1);
MCUCR |= (1<<SE);
sei();
init();
PORTD = 0x02; //LCD data = 0x02
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x0E; //LCD data = 0x0E
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x14; //LCD data = 0x14
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x80; //LCD data = 0x80
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
while(1)
{
PORTD = test; //LCD data = test
PORTB |= (1<<PB0); //LCD RS = 1
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
test++;
}
}
void init(void)
{
setTimer1(sekund/10);
TCCR1B |= (1<<CS12) + (1<<CS10);
PORTB &= ~(1<<PB0); //LCD RS = 0
PORTB &= ~(1<<PB1); //LCD RW = 0
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x30; //LCD data = 0x30
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x30; //LCD data = 0x30
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x30; //LCD data = 0x30
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x38; //LCD data = 0x38
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x08; //LCD data = 0x08
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x01; //LCD data = 0x01
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
PORTD = 0x06; //LCD data = 0x06
PORTB |= (1<<PB2); //LCD enable = 1
__asm__ __volatile__ ("sleep" ::);
PORTB &= ~(1<<PB2); //LCD enable = 0
}