obsługa wyświetlacza LCD 2x16
obsługa wyświetlacza LCD 2x16
Witam,
czy ktoś jest wstanie podać przykład prostego wysłania znaku literki alfabetu na wyświetlacz np. litery W, albo dowolnego napisu np. WITAM! na wyświetlacz?
gdzie PB7 podłączone do DB7
gdzie PB6 podłączone do DB6
gdzie PB5 podłączone do DB5
gdzie PB4 podłączone do DB4
gdzie PB3 podłączone do EN
RW do 0V
RS do PB2
czy ktoś jest wstanie podać przykład prostego wysłania znaku literki alfabetu na wyświetlacz np. litery W, albo dowolnego napisu np. WITAM! na wyświetlacz?
gdzie PB7 podłączone do DB7
gdzie PB6 podłączone do DB6
gdzie PB5 podłączone do DB5
gdzie PB4 podłączone do DB4
gdzie PB3 podłączone do EN
RW do 0V
RS do PB2
Zajmowałem się tym jakieś dwa miesiące temu.
Po pierwsze potrzebujesz jakiejś biblioteki jeśli jeszcze nie masz. Ja korzystałem z biblioteki Radzia, które można pobrać ze strony http://radzio.dxp.pl/hd44780/
Tam znajduje się też trochę teorii.
Opierając się o tę bibliotekę, którą musisz włączyć poprzez #include do swojego programu, możesz wysyłać znaki do LCD poprzez funkcję
Jednakże musisz wpierw w pliku nagłówkowym HD44780.h skonfigurować swoje wyprowadzenia. Reszta funkcji jest opisana w pliku HD44780.c tejże biblioteki.
Jakbyś był zainteresowany to też bardzo łatwo można tworzyć swoje znaki.
Mimo pozoru taki LCD obsługuje się dość prosto.
Po pierwsze potrzebujesz jakiejś biblioteki jeśli jeszcze nie masz. Ja korzystałem z biblioteki Radzia, które można pobrać ze strony http://radzio.dxp.pl/hd44780/
Tam znajduje się też trochę teorii.
Opierając się o tę bibliotekę, którą musisz włączyć poprzez #include do swojego programu, możesz wysyłać znaki do LCD poprzez funkcję
Kod: Zaznacz cały
LCD_WriteText((char *)"Tekst");Jednakże musisz wpierw w pliku nagłówkowym HD44780.h skonfigurować swoje wyprowadzenia. Reszta funkcji jest opisana w pliku HD44780.c tejże biblioteki.
Jakbyś był zainteresowany to też bardzo łatwo można tworzyć swoje znaki.
Mimo pozoru taki LCD obsługuje się dość prosto.
Dokładnie, chyba prościej już się nie da, oto przykład:Artyliusz pisze:Mimo pozoru taki LCD obsługuje się dość prosto.
http://www.youtube.com/watch?v=tOLnAFhUVjw
Witam, poprawiłem program
Ale nic nie wyświetla.
Panowie proszę o prześledzenie programu, kompilator nic nie krzyczy ładuje program do AVR i nic się nie dzieje gdzie może być błąd?
Ale nic nie wyświetla.
Panowie proszę o prześledzenie programu, kompilator nic nie krzyczy ładuje program do AVR i nic się nie dzieje gdzie może być błąd?
Kod: Zaznacz cały
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#define DDR_DB4 DDRB
#define PORT_DB4 PORTB
#define DB4 PB4
#define DDR_DB5 DDRB
#define PORT_DB5 PORTB
#define DB5 PB5
#define DDR_DB6 DDRB
#define PORT_DB6 PORTB
#define DB6 PB6
#define DDR_DB7 DDRB
#define PORT_DB7 PORTB
#define DB7 PB7
#define DDR_RS DDRB
#define PORT_RS PORTB
#define RS PB2
#define DDR_EN DDRB
#define PORT_EN PORTB
#define EN PB3
#define SET_DB4 PORT_DB4|=_BV(DB4)
#define CLR_DB4 PORT_DB4&=~(_BV(DB4))
#define SET_DB5 PORT_DB5|=_BV(DB5)
#define CLR_DB5 PORT_DB5&=~(_BV(DB5))
#define SET_DB6 PORT_DB6|=_BV(DB6)
#define CLR_DB6 PORT_DB6&=~(_BV(DB6))
#define SET_DB7 PORT_DB7|=_BV(DB7)
#define CLR_DB7 PORT_DB7&=~(_BV(DB7))
#define SET_RS PORT_RS|=_BV(RS)
#define CLR_RS PORT_RS&=~(_BV(RS))
#define SET_EN PORT_EN|=_BV(EN)
#define CLR_EN PORT_EN&=~(_BV(EN))
void set_half_byte(char x);
void write_to_LCD(char x);
void write_command(char x);
void write_char(char x);
void write_text(char*s);
//void LCDxy(char x, char y);
void clear_LCD (void);
void init_LCD(void);
int main (void)
{
char *s= "W";
init_LCD();
write_text(s);
for(;;)
return 0;
}
void set_half_byte(char x)
{
if (x & _BV(0)) SET_DB4;
else CLR_DB4;
if (x & _BV(1)) SET_DB5;
else CLR_DB5;
if (x & _BV(2)) SET_DB6;
else CLR_DB6;
if (x & _BV(3)) SET_DB7;
else CLR_DB7;
}
void write_to_LCD(char x)
{
SET_EN;
set_half_byte (x>>4);
CLR_EN;
SET_EN;
set_half_byte(x);
CLR_EN;
_delay_ms(1);
}
void write_command(char x)
{
CLR_RS;
write_to_LCD(x);
}
void write_char(char x)
{
SET_RS;
write_to_LCD(x);
}
void write_text(char * s)
{
while(*s)
{
write_char(*s);
s++;
}
}
void LCDxy(char x,char y)
{
unsigned char com=0x80;
com|=(x|(y<<6));
write_command(com);
}
void clear_LCD (void)
{
write_command(0x01);
}
void init_LCD(void)
{
DDR_DB4 |= _BV(DB4);
DDR_DB5 |= _BV(DB5);
DDR_DB6 |= _BV(DB6);
DDR_DB7 |= _BV(DB7);
DDR_EN|= _BV(EN);
DDR_RS |= _BV(RS);
_delay_ms(20);
CLR_EN;
CLR_RS;
char i;
for (i=0;i<3;i++)
{
SET_EN;
set_half_byte(0x03);
CLR_EN;
_delay_ms(5);
}
SET_EN;
set_half_byte(0x02);
CLR_EN;
_delay_ms(1);
write_command(0x28);
write_command(0x08);
write_command(0x01);
write_command(0x06);
write_command(0x0C);
}
Mogłeś chociaż opatrzyć to komentarzem.
Może najpierw ściągnij z jego strony, a dokładnie z tego linku to http://radzio.dxp.pl/hd44780/hd44780_4bit_norw.zip i zobacz jak to jest zrobione. Albo w ogóle z Radzia biblioteki skorzystaj. Musisz tylko popodstawiać swoje porty i załączyć pliki do pliku programu głównego. Wtedy będzie bardziej też przejrzyste.
Może najpierw ściągnij z jego strony, a dokładnie z tego linku to http://radzio.dxp.pl/hd44780/hd44780_4bit_norw.zip i zobacz jak to jest zrobione. Albo w ogóle z Radzia biblioteki skorzystaj. Musisz tylko popodstawiać swoje porty i załączyć pliki do pliku programu głównego. Wtedy będzie bardziej też przejrzyste.