cesupa
27.02.2008, 19:24
Hallo,
ich versuche grad mit Hilfe des Tutorials von mikrocontroller.net ein LCD anzusprechen, leider funktioniert das nicht so sehr. Als LCD benutze ich das LCD-Modul POWERTIP PC1602LRS-FSO-B-Y6 von Pollin. Wenn ich 5V anlege sehe ich auch auf der oberen Zeile kleine dunkle Kästchen, aber wenn ich jetzt versuche mit einem Atmega8 einen Text anzuzeigen, dann passiert einfach nichts:
main.c:
#include <avr/io.h>
#include "../LCD01.h"
int main()
{
lcd_init();
lcd_data('T');
lcd_data('E');
lcd_data('S');
lcd_data('T');
/*set_cursor(0,2);
lcd_string("Hello world!");
*/
while(1)
{
}
return 0;
}
Klasse:
void lcd_data(unsigned char tmp);
void lcd_string(char* str);
void lcd_command(unsigned char tmp);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x,uint8_t y);
#define CLR 0x01
#define CURSOR_HOME 0x02
#define LCD_P PORTD
#define LCD_DDR DDRD
#define LCD_RS PD4
#define LCD_EN PD5
Klassenfunktionen:
#include <avr/io.h>
#include "LCD01.h"
#include <util/delay.h>
void lcd_data(unsigned char tmp)
{
unsigned char tmp2=tmp;
LCD_P|=(1<<LCD_RS);
tmp=tmp>>4;
tmp=tmp & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp;
lcd_enable();
tmp2=tmp2 & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp2;
lcd_enable();
_delay_us(42);
}
void lcd_command(unsigned char tmp)
{
unsigned char tmp2=tmp;
LCD_P&=~(1<<LCD_RS);
tmp=tmp>>4;
tmp=tmp & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp;
lcd_enable();
tmp2=tmp2 & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp2;
lcd_enable();
_delay_us(42);
}
void lcd_enable(void)
{
LCD_P|=(1<<LCD_EN);
_delay_us(1);
LCD_P&=~(1<<LCD_EN);
}
void lcd_init(void)
{
LCD_DDR=LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN);
_delay_ms(15);
LCD_P&=0xF0;
LCD_P|=0x03;
LCD_P&=~(1<<LCD_RS);
lcd_enable();
_delay_ms(5);
lcd_enable();
_delay_ms(1);
lcd_enable();
_delay_ms(1);
LCD_P&=0xF0;
LCD_P|=0x02;
lcd_enable();
_delay_ms(1);
lcd_command(0x28);
lcd_command(0x0C);
lcd_command(0x06);
lcd_clear();
}
void lcd_clear(void)
{
lcd_command(CLR);
_delay_ms(5);
}
void lcd_home(void)
{
lcd_command(CURSOR_HOME);
_delay_ms(5);
}
void set_cursor(uint8_t x, uint8_t y)
{
uint8_t tmp=0;
switch (y) {
case 1: tmp=0x80+0x00+x; break; // 1. Zeile
case 2: tmp=0x80+0x40+x; break; // 2. Zeile
case 3: tmp=0x80+0x10+x; break; // 3. Zeile
case 4: tmp=0x80+0x50+x; break; // 4. Zeile
}
lcd_command(tmp);
}
void lcd_string(char* str)
{
while(*str)
{
lcd_data(*str);
str++;
}
}
Den Code hab ich größtenteils 1 zu 1 übernommen. Vielleicht steckt da ja schon ein Fehler drin, den ich nicht sehe. Ansonsten muss ich nochmal die Elektronik testen, apropo: Was ist eigentlich los, wenn ich beim Pollin-Board den Strom anschalte und aufeinmal der Pieper losgeht und beide LEDs aufleuchten???
Gruß
cesupa
ich versuche grad mit Hilfe des Tutorials von mikrocontroller.net ein LCD anzusprechen, leider funktioniert das nicht so sehr. Als LCD benutze ich das LCD-Modul POWERTIP PC1602LRS-FSO-B-Y6 von Pollin. Wenn ich 5V anlege sehe ich auch auf der oberen Zeile kleine dunkle Kästchen, aber wenn ich jetzt versuche mit einem Atmega8 einen Text anzuzeigen, dann passiert einfach nichts:
main.c:
#include <avr/io.h>
#include "../LCD01.h"
int main()
{
lcd_init();
lcd_data('T');
lcd_data('E');
lcd_data('S');
lcd_data('T');
/*set_cursor(0,2);
lcd_string("Hello world!");
*/
while(1)
{
}
return 0;
}
Klasse:
void lcd_data(unsigned char tmp);
void lcd_string(char* str);
void lcd_command(unsigned char tmp);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x,uint8_t y);
#define CLR 0x01
#define CURSOR_HOME 0x02
#define LCD_P PORTD
#define LCD_DDR DDRD
#define LCD_RS PD4
#define LCD_EN PD5
Klassenfunktionen:
#include <avr/io.h>
#include "LCD01.h"
#include <util/delay.h>
void lcd_data(unsigned char tmp)
{
unsigned char tmp2=tmp;
LCD_P|=(1<<LCD_RS);
tmp=tmp>>4;
tmp=tmp & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp;
lcd_enable();
tmp2=tmp2 & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp2;
lcd_enable();
_delay_us(42);
}
void lcd_command(unsigned char tmp)
{
unsigned char tmp2=tmp;
LCD_P&=~(1<<LCD_RS);
tmp=tmp>>4;
tmp=tmp & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp;
lcd_enable();
tmp2=tmp2 & 0x0F;
LCD_P&=0xF0;
LCD_P|=tmp2;
lcd_enable();
_delay_us(42);
}
void lcd_enable(void)
{
LCD_P|=(1<<LCD_EN);
_delay_us(1);
LCD_P&=~(1<<LCD_EN);
}
void lcd_init(void)
{
LCD_DDR=LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN);
_delay_ms(15);
LCD_P&=0xF0;
LCD_P|=0x03;
LCD_P&=~(1<<LCD_RS);
lcd_enable();
_delay_ms(5);
lcd_enable();
_delay_ms(1);
lcd_enable();
_delay_ms(1);
LCD_P&=0xF0;
LCD_P|=0x02;
lcd_enable();
_delay_ms(1);
lcd_command(0x28);
lcd_command(0x0C);
lcd_command(0x06);
lcd_clear();
}
void lcd_clear(void)
{
lcd_command(CLR);
_delay_ms(5);
}
void lcd_home(void)
{
lcd_command(CURSOR_HOME);
_delay_ms(5);
}
void set_cursor(uint8_t x, uint8_t y)
{
uint8_t tmp=0;
switch (y) {
case 1: tmp=0x80+0x00+x; break; // 1. Zeile
case 2: tmp=0x80+0x40+x; break; // 2. Zeile
case 3: tmp=0x80+0x10+x; break; // 3. Zeile
case 4: tmp=0x80+0x50+x; break; // 4. Zeile
}
lcd_command(tmp);
}
void lcd_string(char* str)
{
while(*str)
{
lcd_data(*str);
str++;
}
}
Den Code hab ich größtenteils 1 zu 1 übernommen. Vielleicht steckt da ja schon ein Fehler drin, den ich nicht sehe. Ansonsten muss ich nochmal die Elektronik testen, apropo: Was ist eigentlich los, wenn ich beim Pollin-Board den Strom anschalte und aufeinmal der Pieper losgeht und beide LEDs aufleuchten???
Gruß
cesupa