Tycker att min kod borde fungera, men jag får bara massa konstiga utskrifter. Inga tecken utan teckenrutor som tänd släcks delvis osv. Detta är mitt förta riktiga försök med AVR-arkitekturen. har läst massa i datablad m.m., men antagligen har jag missat nåt.
Om nån skulle vilja hjälpa till att felsöka min kod vore det guld iaf. programmet skall bara skriva ut två skärmar om och om igen:
display_test.c
Kod: Markera allt
#include <avr/delay.h>
#include "lcd.h"
#define F_CPU 1000000
int main()
{
int i;
_delay_ms(50);
init_display();
while(1){
printrow("-Ojojojo ",1);
printrow("-ojojojoj ",2);
for(i=0;i<20;i++)
_delay_ms(200);
printrow("halaaaashiii ",1);
printrow("dfhshshsh ",2);
}
return 0;
}
Kod: Markera allt
extern void init_display();
extern void clear_display();
extern void move_cursor(unsigned char);
extern void printchar(char);
extern void printrow(char text[], int);
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
void init_display()
{
DDRD=0x03; // Sätter port D till utport
DDRB=0xFF; // Sätter port D till utoprt
PORTD=0b00000000; // RS=0 (instruktioner), RW=0 (write)
PORTB=0b00110000; // Instruktionen för att starta
PORTD=0b00000001; // E=1 ger puls
_delay_ms(0.01); // Väntar 10 mikroseks då E regisreras
PORTD=0b00000000; // E=0 avslutar puls
_delay_ms(20); // Väntar 100 mikrosek. då instruktionen skall exekveras
PORTB=0b00110000;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(1);
PORTB=0b00110000;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(0.1);
PORTB=0b00111000;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(0.1);
PORTB=0b00001000;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(0.1);
PORTB=0b00000110;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(0.1);
}
void clear_display()
{
PORTD=0b00000000;
PORTB=0b00000001;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(5);
}
void move_cursor(unsigned char adress)
{
PORTD=0b00000000;
PORTB=adress;
PORTD=0b00000001;
_delay_ms(0.01);
PORTD=0b00000000;
_delay_ms(0.1);
}
void printchar(char c)
{
PORTD=0b00000010; // RS=1 (data), RW=0 (write)
PORTB=c; // tecken som skall skrivas ut
PORTD=0b00000011;
_delay_ms(0.01);
PORTD=0b00000010;
_delay_ms(0.1);
}
printrow(char text[], int row)
{
int i;
unsigned char disp_adress;
if(row==2) // sätt skrivadress till rad 2
disp_adress=0b11000000;
else if(row==3) // sätt skrivadress till rad 3
disp_adress=0b10010000;
else if(row==4) // sätt skrivadress till rad 4
disp_adress=0b11010000;
else // annars rad 1
disp_adress=0b10000000;
move_cursor(disp_adress);
for(i=0;i<20;i++)
printchar(text[i]);
}