
ATmega16 и LCD дисплей- какво бъркам?
Здравейте,
от 1 седмица се мъча да "подкарам" LCD дисплей с един ATmega16, но без успех. Все още съм начинаещ и за това използвам готова програма от нета. Ето я:
// Program to display a single alphabet ‘A’ on LCD
/*
LCD data transfer through 8 bit mode
Writing a single letter A on LCD
LCD DATA port----PORT A
ctrl port------PORT B
rs-------PB0
rw-------PB1
en-------PB2
*/
#define F_CPU 4000000UL
#include<avr/io.h>
#include<util/delay.h>
#define LCD_DATA PORTA // LCD data port
#define ctrl PORTB
#define en PB2 // enable signal
#define rw PB1 // read/write signal
#define rs PB0 // register select signal
void LCD_cmd(unsigned char cmd);
void init_LCD(void);
void LCD_write(unsigned char data);
int main()
{
DDRA=0xff; // making LCD_DATA port as output port
DDRB=0x07; // making signal as out put
DDRC=0xFF;
PORTC=0xFF; // индикация, че микроконтролера работи
_delay_ms(500);
PORTC=0x00;
_delay_ms(500);
PORTC=0xFF;
_delay_ms(500);
PORTC=0x00;
_delay_ms(500);
init_LCD(); // initialization of LCD
_delay_ms(50); // delay of 50 milli seconds
LCD_write('A'); // call a function to write A on LCD
PORTC=0xFF; // индикация, че микроконтролера работи
_delay_ms(500);
PORTC=0x00;
_delay_ms(500);
PORTC=0xFF;
_delay_ms(500);
PORTC=0x00;
_delay_ms(500);
return 0;
}
void init_LCD(void)
{
LCD_cmd(0x38); // initialization of 16X2 LCD in 8bit mode
_delay_ms(1);
LCD_cmd(0x01); // clear LCD
_delay_ms(1);
LCD_cmd(0x0E); // cursor ON
_delay_ms(1);
LCD_cmd(0x80); // ---8 go to first line and --0 is for 0th position
_delay_ms(1);
return;
}
void LCD_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
ctrl =(0<<rs)|(0<<rw)|(1<<en); // RS and RW as LOW and EN as HIGH
_delay_ms(1);
ctrl =(0<<rs)|(0<<rw)|(0<<en); // RS, RW , LOW and EN as LOW
_delay_ms(50);
return;
}
void LCD_write(unsigned char data)
{
LCD_DATA= data;
ctrl = (1<<rs)|(0<<rw)|(1<<en); // RW as LOW and RS, EN as HIGH
_delay_ms(1);
ctrl = (1<<rs)|(0<<rw)|(0<<en); // EN and RW as LOW and RS HIGH
_delay_ms(50); // delay to get things executed
return ;
}
Явно бъркам нещо с фусовете, но как ли не ги въртях (използвах и калкулатора). На порт "C" съм сложил светодиод, който индикира, че все пак контролера работи. Програмата е взета от тук:
http://www.engineersgarage.com/embedded/avr-microcontroller-projects/interface-lcd-circuit Увеличавах и времената между различните команди, пробвах и с други готови кодове, но пак без успех. Дисплеите са 2бр. C16217A и са чисто нови. Вече нямам идеи, моля помагайте!