Mam pewien problem z wyświetlaczem LCD, otóż nie chce on w ogóle ze mną gadać. I chciałbym wiedzieć co jest nie tak, i jak ewentualnie roziązać problem? Poniższy program jest zaczerpnięty z Biblii Dolińskiego z niewielkimi zmianami kosmetycznymi.
Jeśli taka informacja okaże się pomocna, to korzystam z programatora STK500 i oprogramowania AVR Studio 4.16.638.
Kod: Zaznacz cały
//**** Biblioteki i pliki nagłówkowe ****//
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
//**** Definicje stałych i zmiennych ****//
#define LCD_RS 1
#define LCD_E 0
#define LCD_PORT PORTA
#define DISP_CR 0x0A
unsigned char line=0; //wiersz LCD
unsigned char unit=0; //kolumna LCD
#define wait_time 10.38
//**** Wektory przerwań ****//
//**** Funkcje konfiguracyjne ****//
void PORT_config(void)
{
/*
0 = WEJŚCIE / CMOS Pull-DOWN
1 = WYJŚCIE / CMOS Pull-UP
*/
DDRA = 0xFF;
DDRC = 0xFF;
DDRD = 0b00111000; //......................Impulsator(7,6) / LED(5,4) / INT1(3)
PORTA = 0xFF;
PORTC = 0xFF;
PORTD = 0b11101000; //.....................Ustawienia Source / Sink
}
void REG_init(void)
{
;
}
//**** Funkcje obsługi wyświetlacza LCD 1602 ****//
void LCD_Wait(unsigned long p_time)
{
for (;p_time>0;p_time--)
{
for (unsigned char tp1=255;tp1!=0;tp1--)
{
;
}
}
}
void LCD_Directive(unsigned char lcd_dir) //służy do sterowania LCD
{
LCD_PORT &= ~(_BV(LCD_RS));
LCD_PORT |= _BV(LCD_E);
LCD_PORT |= (LCD_PORT&0x0F)|(lcd_dir&0xF0);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(10L);
LCD_PORT |= _BV(LCD_E);; //sbi
LCD_PORT |= (LCD_PORT&0x0F)|((lcd_dir&0x0F)<<4);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(10L);
}
void LCD_Character(unsigned char lcd_char) //służy do wypisywania znaków na LCD
{
LCD_PORT |= _BV(LCD_RS);
LCD_PORT |= _BV(LCD_E);
LCD_PORT |= (LCD_PORT&0x0F)|(lcd_char&0xF0);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(10L);
LCD_PORT |= _BV(LCD_E); //sbi
LCD_PORT |= (LCD_PORT&0x0F)|((lcd_char&0x0F)<<4);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(10L);
}
//**** Funkcje sterujące znakami wyświetlacza LCD ****//
void LCD_XY(unsigned char x_pos, unsigned char y_pos)
{
LCD_Directive((x_pos*0x40+y_pos)|0x80);
}
void LCD_CLR(void)
{
LCD_Directive(0x01);
LCD_Wait(1.64*wait_time);
line=0;
unit=0;
}
void LCD_WRITE(char lcd_sign)
{
LCD_Character(lcd_sign);
if (++unit==16)
{
unit=0;
if (++line==2)
{
line=0;
}
}
}
void LCD_WRITE_TXT(char *text)
{
char mark;
char turn=0;
while(1)
{
mark=pgm_read_byte(&text[turn++]); //PRG_RDB
if (mark!=0)
{
if (mark==DISP_CR)
{
line==1?unit=0:++line;
unit=0;
LCD_XY(line,unit);
}
else
{
LCD_Character(mark);
}
}
else
{
break;
}
}//end while
} //eof
void LCD_INIT(void)
{
LCD_Wait(45*wait_time);
for (unsigned char s=0;s<=3;s++)
{
LCD_PORT |= _BV(LCD_E); //sbi
LCD_PORT |= (LCD_PORT&0x0F)|(0x30);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(5*wait_time);
}
LCD_PORT |= _BV(LCD_E); //sbi
LCD_PORT |= (LCD_PORT&0x0F)|(0x20);
asm ("nop");
asm ("nop");
asm ("nop");
LCD_PORT &= ~(_BV(LCD_E)); //cbi
LCD_Wait(10L);
LCD_Directive(0x28); //interfejs 4bit, 2 linie, znak 5x7
LCD_Directive(0x08);
LCD_Directive(0x01);
LCD_Wait(1.64*wait_time);
LCD_Directive(0x06);
}
//**** Funkcja MAIN ***//
int main(void)
{
char *tekst1=PSTR("Test");
PORT_config();
REG_init();
LCD_INIT();
while(1)
{
LCD_Directive(0x0F);
LCD_WRITE_TXT(tekst1);
} //end while
} //end main