_maddin
28.01.2007, 18:42
nabend
ich hab den halben tag damit verbracht, die AssemblerLCDroutinen von mikrocontroller.net in C zu "übersetzen". das klingt vllt blödsinnig, aber ich möchte keine vorgefertigten funktionen nehmen, um das ganze besser zu verstehen. ich weiß, das programm was ich geschrieben hab, ist programmiertechnisch ziemlicher schrott, aber ich versteh einfach nicht, wieso es nicht funktioniert. hängt es damit zusammen, wie ich die nibbles "vertausche" (ich versteh nich ganz wie das mit dem inline assembler läuft, deshalbt hab ich mir diese "methode" ausgedacht)
kann mir irgendjemand helfen ???
MfG maddin
#include <avr/io.h>
//EVALUATION BOARD
#define Taster1 2
#define Taster2 3
#define Taster3 4
#define LED1 5
#define LED2 6
//LCD
#define LCD_PORT PORTB
#define LCD_E 5
#define LCD_RS 4
#define LCD_CLEAR 0b00000001
//
//Prototypen
void delay_ms(unsigned int);
void io_init(void);
//LCD
void lcd_data(unsigned char);
void lcd_command(unsigned char);
void lcd_enable(void);
void lcd_init(void);
void lcd_clear(void);
//
//
void main(void) {
ioinit();
lcd_init();
lcd_data("T");
lcd_data("e");
lcd_data("s");
lcd_data("t");
}
}
// Initialisierung
void ioinit(void){//0EINGANG 1AUSGANG
DDRD=0b11100011;
DDRB=0b00111111;
}
void delay_ms(unsigned int ms){
unsigned int zaehler;
while (ms) {
zaehler = F_CPU / 5000;
while (zaehler) {
asm volatile("nop");
zaehler--;
}
ms--;
}
}
void lcd_init(){
LCD_PORT=0xFF;
delay_ms(31);
LCD_PORT=0b00000011;//zur initialisierung
lcd_enable();
delay_ms(5);
lcd_enable();
delay_ms(5);
lcd_enable();
delay_ms(5);
LCD_PORT=0b00000010;//4bit
lcd_enable();
delay_ms(5);
lcd_command(0b00101000);//4bit,2Zeilen
delay_ms(5);
lcd_command(0b00001100);//Display on, Cursor off
delay_ms(5);
lcd_command(0b00000100);
}
void lcd_enable(){
LCD_PORT |= (1 << LCD_E);//1
delay_ms(1);
LCD_PORT &=~(1 << LCD_E);//0
delay_ms(1);
}
void lcd_data(unsigned char data){
unsigned char nibble;
nibble=data/0b00010000; //ersatz für "swap"
LCD_PORT=nibble&&00001111;
LCD_PORT |= (1 << LCD_RS);//1
lcd_enable();
LCD_PORT=data&&00001111;
LCD_PORT |= (1 << LCD_RS);//1
lcd_enable();
delay_ms(1);
}
void lcd_command(unsigned char data){
unsigned char nibble;
nibble=data/0b00010000;
LCD_PORT=nibble&&00001111;
lcd_enable();
LCD_PORT=data&&00001111;
lcd_enable();
delay_ms(1);
}
EDIT verwende 4*20 zeichen, Hitachi HD44irgendwas oder zumindest kompatibel dazu.
ich hab den halben tag damit verbracht, die AssemblerLCDroutinen von mikrocontroller.net in C zu "übersetzen". das klingt vllt blödsinnig, aber ich möchte keine vorgefertigten funktionen nehmen, um das ganze besser zu verstehen. ich weiß, das programm was ich geschrieben hab, ist programmiertechnisch ziemlicher schrott, aber ich versteh einfach nicht, wieso es nicht funktioniert. hängt es damit zusammen, wie ich die nibbles "vertausche" (ich versteh nich ganz wie das mit dem inline assembler läuft, deshalbt hab ich mir diese "methode" ausgedacht)
kann mir irgendjemand helfen ???
MfG maddin
#include <avr/io.h>
//EVALUATION BOARD
#define Taster1 2
#define Taster2 3
#define Taster3 4
#define LED1 5
#define LED2 6
//LCD
#define LCD_PORT PORTB
#define LCD_E 5
#define LCD_RS 4
#define LCD_CLEAR 0b00000001
//
//Prototypen
void delay_ms(unsigned int);
void io_init(void);
//LCD
void lcd_data(unsigned char);
void lcd_command(unsigned char);
void lcd_enable(void);
void lcd_init(void);
void lcd_clear(void);
//
//
void main(void) {
ioinit();
lcd_init();
lcd_data("T");
lcd_data("e");
lcd_data("s");
lcd_data("t");
}
}
// Initialisierung
void ioinit(void){//0EINGANG 1AUSGANG
DDRD=0b11100011;
DDRB=0b00111111;
}
void delay_ms(unsigned int ms){
unsigned int zaehler;
while (ms) {
zaehler = F_CPU / 5000;
while (zaehler) {
asm volatile("nop");
zaehler--;
}
ms--;
}
}
void lcd_init(){
LCD_PORT=0xFF;
delay_ms(31);
LCD_PORT=0b00000011;//zur initialisierung
lcd_enable();
delay_ms(5);
lcd_enable();
delay_ms(5);
lcd_enable();
delay_ms(5);
LCD_PORT=0b00000010;//4bit
lcd_enable();
delay_ms(5);
lcd_command(0b00101000);//4bit,2Zeilen
delay_ms(5);
lcd_command(0b00001100);//Display on, Cursor off
delay_ms(5);
lcd_command(0b00000100);
}
void lcd_enable(){
LCD_PORT |= (1 << LCD_E);//1
delay_ms(1);
LCD_PORT &=~(1 << LCD_E);//0
delay_ms(1);
}
void lcd_data(unsigned char data){
unsigned char nibble;
nibble=data/0b00010000; //ersatz für "swap"
LCD_PORT=nibble&&00001111;
LCD_PORT |= (1 << LCD_RS);//1
lcd_enable();
LCD_PORT=data&&00001111;
LCD_PORT |= (1 << LCD_RS);//1
lcd_enable();
delay_ms(1);
}
void lcd_command(unsigned char data){
unsigned char nibble;
nibble=data/0b00010000;
LCD_PORT=nibble&&00001111;
lcd_enable();
LCD_PORT=data&&00001111;
lcd_enable();
delay_ms(1);
}
EDIT verwende 4*20 zeichen, Hitachi HD44irgendwas oder zumindest kompatibel dazu.