Gast
#365433
Hallo,
ich versuche ein LCD ein LCd anzusteuern, ohne eine Lib zu verwenden.
Mit Lib funktionierts, mit meinem Versuch nicht :(
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#define LCD_RS_PORT PORTB
#define LCD_RS_PIN 3
#define LCD_DATA0_PORT PORTD /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT PORTD /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT PORTD /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT PORTB /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 5 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 6 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 7 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 0
#define LCD_RW_PORT PORTB /**< port for RW line */
#define LCD_RW_PIN 4 /**< pin for RW line */
#define LCD_E_PORT PORTB /**< port for Enable line */
#define LCD_E_PIN 2 /**< pin for Enable line */
#define LCD_E_PORT PORTB /**< port for Enable line */
#define LCD_E_PIN 1 /**< pin for Enable line */
void write_data(uint8_t wert)
{
if(wert & (1<<0))
{
LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN);
}
else
{
LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN);
}
if(wert & (1<<1))
{
LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN);
}
else
{
LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN);
}
if(wert & (1<<2))
{
LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN);
}
else
{
LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN);
}
if(wert & (1<<3))
{
LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN);
}
else
{
LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN);
}
}
void lcd_enable(void)
{
LCD_E_PORT |= (1<<LCD_E_PIN);
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
__asm volatile ("nop");
LCD_E_PORT &= ~(1<<LCD_E_PIN);
}
void init_lcd(void)
{
_delay_ms(20);
LCD_RS_PORT &= ~(1<<LCD_RS_PIN); /* Steuerregister wird angesprochen
*/
write_data(0x3); /* 1.0x3 */
lcd_enable;
_delay_ms(8);
write_data(0x3); /* 2.0x3 */
lcd_enable;
_delay_ms(1);
write_data(0x3); /* 3.0x3 */
lcd_enable;
_delay_ms(5);
write_data(0x2); /* Explizit 4-Bit einstellen */
lcd_enable;
_delay_ms(5);
write_data(0x0);
lcd_enable;
_delay_ms(5);
/*Nochmal System-Set 4bit...*/
write_data(0x2);
lcd_enable;
_delay_ms(5);
write_data(0x8); /* Anderes von System Set einstellen
*/
lcd_enable;
_delay_ms(5);
write_data(0x0); /*Display on/off, Display on, Unterstrich Cursor
on, blinkender Cursor on*/
lcd_enable;
_delay_ms(5);
write_data(0xF);
lcd_enable;
_delay_ms(5);
write_data(0x0); /* Cursor Home */
lcd_enable;
_delay_ms(5);
write_data(0x2);
lcd_enable;
_delay_ms(5);
}
void main(void)
{
DDRB = 0xFF;
DDRD = 0xFF;
init_lcd();
for(;;);
}
Hoffe mir kann jemand weiterhelfen
Gruß
Martin