Avatar billede Martin005 Nybegynder
16. maj 2011 - 12:05

AVR studio 4 lcd fejl

Hej dette er mit første indlæg! jeg arbejder med c++ avr studio 4 og har en mikroprocssor atmega 32 og prøver at intiliasere mit lcd (seiko 2220 20x2)

Problemer er bare at mit kode har ingen fejl, men min display kan ikke intiliaseres! håber jeg får noget hjælp:

PS: jeg er nybegynder til c++ og tak forhånden! venter på jeres svar

Her er koden

//---------------------------------------------------------------------------------------------------------------------------------------------------------
# include <avr/io.h>
//
//---------------------------------------------------------------------------------------------------------------------------------------------------------
void LCD_init (void); // Her erklæres programmets anvendte prototyper
void LCD_command (char);
void LCD_printchar (char);
void delay (int);
void LCD_enable (void);
void LCD_busy (void);
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//---------------------------------------------------------------------------------------------------------------------------------------------------------
int main (void) // Her starter programmet
{
DDRA = 0xFF; // PORTA sættes til output
DDRC = 0xFF; // PORTC sættes til output
//
PORTA = 0x00; // PORTA nulstilles for at tilfredsstille kontrol-genet.
delay(5000); // Delay funktionen kaldes med variablen 5000
LCD_init(); // LCD_init kaldes
delay(2000);
LCD_busy(); // LCD_busy kaldes
LCD_printchar('A');


//

{
//
}
}
//
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//


//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ LCD_init ]-
// Initialiserer displayet ved POWER-ON
//
// Input data: INGEN
// Output data: INT : delay I millisekunder , CHAR : HEX-værdi til LCD_display
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void LCD_init(void)

{

PORTA = 0x30; // Displayet konfigureres til 4-bit interface
LCD_enable(); // LCD_enable kaldes
delay(5); // Ovenstående, gentages 2 gange i følge producentens anvisning.
LCD_enable();
delay(1);
LCD_enable();
delay(1);
PORTA = 0x20; // Displayet konfigureres til 4-bit interface, 5x7 dot matrix.
LCD_enable();
delay(1);
LCD_command(0x28); // Ovenstående gentages ifølge producentens anvisninger
LCD_command(0x08); // Displayet slukkes
LCD_command(0x01); // Displayet kører sin interne CLEAR-funktion
LCD_command(0x06); // Displayet konfigureres til at skrive fra venstre mod højre
LCD_command(0x0F); // Displayet tændes og konfigureres til at anvende blinkende cursor
LCD_command(0x02); // Cursor'en sendes hjem til øverste, venstre hjørne
delay(5);
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ LCD_command ]-
// Fungerer som interface for andre funktioner,
// der ønsker at sende instruktioner til displayet.
// Konverterer data fra HEX til 4-bit signaler der sendes til DATABUS.
//
// Input data: CHAR value, erklæres internt i funktionen ved navn x
// Output data: INT : delay I millisekunder , Output til DATABUS
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void LCD_command (char x)
{
char a, b; // char a og b erklæres som interne variabler
//
a = ( x & 0xF0 ); // a tillægges de første fire bits af variablen x
x = x << 4; // alle bits i variablen x flyttes 4 pladser til venstre
b = ( x & 0xF0 ); // b tillægges de første fire bits af variablen x
//
LCD_busy(); // LCD_busy kaldes
PORTA = a; // Værdien af variablen a sendes til PORTA
LCD_enable();
delay(2);
PORTA = b; // Værdien af variablen b sendes til PORTA
LCD_enable();
delay(2);
PORTA = 0x00; // Alle bits på PORTA sættes lav
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ LCD_printchar ]-
// Fungerer som interface for andre funktioner,
// der ønsker at sende tekst til displayet.
// Konverterer data fra latinske bogstaver, HEX eller ASCII
// til 4-bit signaler, der sendes til DATABUS.
//
// Input data: CHAR value, erklæres internt i funktionen ved navn z
// Output data: INT : delay I millisekunder , Output til DATABUS
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void LCD_printchar (char z)
{
char a, b; // char a og b erklæres som interne variabler
//
PORTA = 0x04; // RS sættes høj for at der kan skrives tekst til displayet
//
a = ( z & 0xF0 ); // a tillægges de første fire bits af variablen z
z = z << 4; // alle bits i variablen z flyttes 4 pladser til venstre
b = ( z & 0xF0 ); // b tillægges de første fire bits af variablen z
//
PORTA = ( PORTA | a ); // Værdien af variablen a sendes til PORTA
LCD_enable();
delay(2);
PORTA = 0x04;
PORTA = ( PORTA | b ); // Værdien af variablen b sendes til PORTA
LCD_enable();
delay(2);
PORTA = 0x00; // PORTA nulstilles
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//
//
//
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ LCD_enable ]-
// Giver displayet instrukser om at læse data.
//
// Input data: INGEN
// Output data: INT : delay I millisekunder , ENABLE-puls
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void LCD_enable (void)
{
delay(1);
PORTC = ( ( PORTC & 0xFE ) | 0x01 ); // Pin 1 på PORTC sættes høj for at sende Enable-signal til displayet
delay(2);
PORTC = ( PORTC & 0xFE ); // Pin 1 på PORTC nulstilles
delay(2);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//
//
//
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ LCD_busy]-
// Anvendes, af andre funktioner, til at afgøre
// om displayet er klar til at modtage nye instrukser
//
// Input data: INGEN
// Output data: INT : delay I millisekunder
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void LCD_busy (void)
{
PORTA = 0x08 ; // R/W sættes høj, så der kan læses fra displayet
LCD_enable();
while( ( PORTA & 0x80 ) != 0x80 ) // while-løkke, fortsætter så længe BUSY-FLAG på displayet er høj
{
delay(1);
}
PORTA = 0x00;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// -[ delay ]-
// Anvendes af andre funktioner til at skabe
// ophold i programmets udførelse.
// Laver variable ophold i millisekunder.
//
// Input data: INT value, antal millisekunder
// Output data: INGEN
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
void delay (int x)
{
int i, j; // i og j erklæres som interne variabler
for ( i = 0 ; i < x ; i++ ) // for-løkke, kører så længe x er mindre end i
{
for ( j = 0 ; j < 846 ; j++ ); // for-løkke tæller til 846 på ca. 1 ms
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------
//
//
//
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
// PROGRAMKODE SLUT
// . 2010
//-------------------------------------------------------------------------------------------------------------------------------------------------------//
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester