Danke für die Antworten.
Hier mal mein code/beschaltung.
Kontakte hab ich alle durchgetestet.
Code:
#define DATA_PORT PORTA
#define LCD_RS IOPORT_CREATE_PIN(PORTB,2)
#define LCD_E IOPORT_CREATE_PIN(PORTB,0)
#define LCD_RW IOPORT_CREATE_PIN(PORTB,1)
#define P_DB0 IOPORT_CREATE_PIN(PORTA,0)
#define P_DB1 IOPORT_CREATE_PIN(PORTA,1)
#define P_DB2 IOPORT_CREATE_PIN(PORTA,2)
#define P_DB3 IOPORT_CREATE_PIN(PORTA,3)
#define P_DB4 IOPORT_CREATE_PIN(PORTA,4)
#define P_DB5 IOPORT_CREATE_PIN(PORTA,5)
#define P_DB6 IOPORT_CREATE_PIN(PORTA,6)
#define P_DB7 IOPORT_CREATE_PIN(PORTA,7)
void lcd_set_write_instruction();
void lcd_set_write_data();
void lcd_write_byte (char c);
void lcd_clear_and_home();
void lcd_home();
void lcd_goto(uint8_t line, uint8_t pos);
void lcd_line_one();
void lcd_line_two();
void lcd_write_data(char c);
void lcd_write_string(char *x, uint8_t len );
void lcd_write_string_0(char *x);
void lcd_write_string_p(const char *s);
void lcd_init();
void lcd_set_on_off(uint8_t state);
void lcd_write_inst(uint8_t cmd);
//this function is directly called from main
//it init the display and trys to print some test chars. The result is only a blinking cursor that moves
void lcd_init()
{
ioport_configure_pin(LCD_E, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(LCD_RS, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(LCD_RW, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB0, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB1, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB2, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB3, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB4, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB5, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB6, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
ioport_configure_pin(P_DB7, IOPORT_INIT_LOW | IOPORT_DIR_OUTPUT);
// Now do the actual LCD initialisations
// startup delay - make it long to allow time for power to settle
// (you want wish to remove this line)
_delay_ms(250);
// LCD display initialisation by instruction magic sequence
lcd_set_write_instruction();
lcd_write_inst(0x38); // function set
_delay_ms(100);
lcd_write_inst(0x08); // display on/off control
_delay_ms(100);
lcd_write_inst(0x01); // display clear
_delay_ms(100);
lcd_write_inst(0x06); // entry mode set
_delay_ms(100);
lcd_write_inst(0x02);
_delay_ms(100);
lcd_write_inst(0x0F);
_delay_ms(100);
lcd_write_inst(0x0F);
_delay_ms(100);
lcd_write_inst(0x39);
_delay_ms(100);
lcd_write_inst(0x80);
lcd_write_data('A');
lcd_write_data('B');
lcd_write_data('C');
lcd_write_data('D');
lcd_write_data('E');
_delay_ms(100);
}
void lcd_set_on_off(uint8_t state)
{
lcd_set_write_instruction();
if(state==1)
{
lcd_write_byte(0x0F);
}
if(state==0)
{
lcd_write_byte(0x08);
}
}
// This function clears the RS line to write a command
void lcd_set_write_instruction()
{
ioport_set_pin_low(LCD_RS); // set RS line low
_delay_ms(1);
}
// This function sets the RS line to write data
void lcd_set_write_data()
{
ioport_set_pin_high(LCD_RS); // set RS line high
_delay_ms(1);
}
// This function writes a byte to the LCD
void lcd_write_byte (char c)
{
ioport_set_pin_low(LCD_RW);
int output[CHAR_BIT];
int i;
for (i = 0; i < CHAR_BIT; ++i)
{
output[i] = (c >> i) & 1;
}
//manual approach
if(output[0]==1)
{
ioport_set_pin_high(P_DB0);
}
else
{
ioport_set_pin_low(P_DB0);
}
if(output[1]==1)
{
ioport_set_pin_high(P_DB1);
}
else
{
ioport_set_pin_low(P_DB1);
}
if(output[2]==1)
{
ioport_set_pin_high(P_DB2);
}
else
{
ioport_set_pin_low(P_DB2);
}
if(output[3]==1)
{
ioport_set_pin_high(P_DB3);
}
else
{
ioport_set_pin_low(P_DB3);
}
if(output[4]==1)
{
ioport_set_pin_high(P_DB4);
}
else
{
ioport_set_pin_low(P_DB4);
}
if(output[5]==1)
{
ioport_set_pin_high(P_DB5);
}
else
{
ioport_set_pin_low(P_DB5);
}
if(output[6]==1)
{
ioport_set_pin_high(P_DB6);
}
else
{
ioport_set_pin_low(P_DB6);
}
if(output[7]==1)
{
ioport_set_pin_high(P_DB7);
}
else
{
ioport_set_pin_low(P_DB7);
}
_delay_us(100);
//DATA_PORT.OUT = c; // Place data on Data Port
ioport_set_pin_high(LCD_E); // set E line high
_delay_us(100);
ioport_set_pin_low(LCD_E); // set E line low to latch data into LCD
_delay_ms(1);
}
// This function clears LCD and sets address to beginning of first line
void lcd_clear_and_home()
{
lcd_set_write_instruction();
lcd_write_byte(0x01);
_delay_ms(2);
lcd_write_byte(0x02);
_delay_ms(1);
}
// This function sets address to beginning of first line
void lcd_home()
{
lcd_set_write_instruction();
lcd_write_byte(0x02);
_delay_ms(1);
}
// This function moves cursor to a given line and position
// line is either 0 (first line) or 1 (second line)
// pos is the character position from 0 to 15.
void lcd_goto(uint8_t line, uint8_t pos)
{
uint8_t position = 0;
lcd_set_write_instruction();
switch(line)
{
case 0: position = 0;
break;
case 1: position = 0x40;
break;
}
lcd_write_byte(0x80 | (position + pos));
}
// This function moves the cursor to 1st character of 1st line
void lcd_line_one() { lcd_goto(0, 0); }
// This function moves the cursor to 1st character if 2nd line
void lcd_line_two() { lcd_goto(1, 0); }
// This function writes a character to the LCD
void lcd_write_data(char c)
{
//ioport_set_pin_high(P_LED2);
lcd_set_write_data();
lcd_write_byte(c);
// lcd_write_inst(0x14);
//ioport_set_pin_low(P_LED2);
}
void lcd_write_inst(uint8_t cmd)
{
lcd_set_write_instruction();
lcd_write_byte(cmd);
}
// This function writes a string (in SRAM) of given length to the LCD
void lcd_write_string(char *x, uint8_t len )
{
while (--len > 0)
lcd_write_data(*x++);
}
// This function writes a null-terminated string (in SRAM) to the LCD
void lcd_write_string_0(char *x)
{
while (*x)
lcd_write_data(*x++);
}
// Same as above, but the string is located in program memory,
// so "lpm" instructions are needed to fetch it, and a \0
// must be defined at the end of the string to terminate it.
void lcd_write_string_p(const char *s)
{
char c;
for (c = pgm_read_byte(s); c; ++s, c = pgm_read_byte(s))
lcd_write_data(c);
}
Lesezeichen