hallo zusammen.
ich hab die gleiche frage auch schon bei mikrocontroller.net gestellt, ich weiß das gehört sich nicht^^ aber es antwortet keiner
ich habe mir ein glcd mit HD61830 Controller (Datenblatt:
http://www.mikrocontroller.net/attac...64/hd61830.pdf )
ersteigert.
der text, den ich mit lcd_puts ausgebe soll natürlich nur 1 mal und zwar in der ersten zeile erscheinen. er erscheint aber in jeder zeile, insgesamt 12 mal.
woran kann das liegen ?? das datenblatt hab ich schon einige male
durchkämmt, ich finde keinen hinweis, vllt hab ich auch einfach ein
brett vorm kopf ... kann mir jemand helfen ?
im grafik modus passiert genau das gleiche... wenn ein paar bytes sende, erscheinen sie nicht nur einmal sondern immer gleich 12 mal immer im abstand von je 10 pixeln untereinander.Code:#define DATAPORT PORTC #define DATADDR DDRC #define DATAPIN PINC #define CTRLPORT PORTB #define CTRLDDR DDRB #define RS 0 #define RW 1 #define E 2 #define CS 3 #define F_CPU 12000000 #include <util/delay.h> #include <stdint.h> #include <avr/io.h> void lcd_enable(void){ // Erzeugt eine fallende Flanke am Enable-Pin CTRLPORT |= (1<<E); _delay_us(2); CTRLPORT &= ~(1<<E); _delay_us(2); } #define lcd_busy() _delay_us(3) /*void lcd_busy(void) { // Wartet bis der Controller wieder Daten verarbeiten kann unsigned char tmp; DATAPORT = 0x00; // Datenport wird gelöscht DATADDR = 0x00; // Datenport wird als Eingang deklariert CTRLPORT |= (1<<RW); // R/W auf logisch 1 -> R CTRLPORT |= (1<<RS); // RS auf logisch 1 -> aktiv do{ CTRLPORT |= (1<<E); // Steigende Flanke am Enable-Pin _delay_us(2); tmp = DATAPIN; // Datenport wird eingelesen CTRLPORT &= ~(1<<E); // Fallende Flanke am Enable-Pin _delay_us(2); }while(tmp & (1<<7)); // Schleife bis Busy Flag logisch 0 wird DATADDR = 0xff; // Datenport wird wieder als Ausgang deklariert }*/ void lcd_writecommand(uint8_t command) { // Kommandobyte -> HD61830 lcd_busy(); CTRLPORT &= ~(1<<RW); // R/W auf logisch 0 -> W CTRLPORT |= (1<<RS); // RS auf logisch 1 -> aktiv DATAPORT = command; // übergebenes Kommandobyte wird ausgegeben lcd_enable(); } void lcd_writedata(uint8_t data) { // Datenbyte -> HD61830 lcd_busy(); CTRLPORT &= ~(1<<RW); // R/W auf logisch 0 -> W CTRLPORT &= ~(1<<RS); // RS auf logisch 0 -> inaktiv DATAPORT = data; // übergebenes Datenbyte wird ausgegeben lcd_enable(); } void lcd_send(uint8_t command, uint8_t data) { // Kombination aus Kommando- und Datenbyte lcd_writecommand(command); lcd_writedata(data); } void lcd_init(unsigned char modus){ // Initialisiert das Display DATADDR = 0xff; // Datenport wird als Ausgang deklariert CTRLDDR|= (1<<RW)|(1<<RS)|(1<<E)|(1<<CS); // Kommandoport wird als Ausgang deklariert CTRLPORT &= ~(1<<CS); // CS auf logisch 0 -> aktiv if(modus == 'c'){ // Charaktermodus lcd_send(0x00, 0x30); // Mode Control lcd_send(0x01, 0x75); // Set Character Pitch lcd_send(0x02, 0x27); // Set Number of Characters lcd_send(0x03, 0x0a); // Set Number of Time Divisions lcd_send(0x04, 0x07); // Set Cursor Position } else{ // Grafikmodus lcd_send(0x00, 0x32); // Mode Control lcd_send(0x01, 0x07); // number of bits of 1-byte display data to be displayed lcd_send(0x02, 0x1d); // number of horizontal bytes lcd_send(0x03, 0x0a); // Set Number of Time Divisions } lcd_send(0x08, 0x00); // Set Display Start Low Order Address lcd_send(0x09, 0x00); // Set Display Start High Order Address } void lcd_clear(unsigned char modus){ // Löscht das Display lcd_gotoxy(modus, 0, 0); // Cursor an den Anfang setzen if(modus == 'c'){ // Charaktermodus for(uint16_t i=0; i<320; i++) // Alle Chars durchlaufen und löschen lcd_send(0x0c, 0x20); } else{ // Grafikmodus for(uint16_t i=0; i<1920; i++) // Alle Bytes durchlaufen und löschen lcd_send(0x0c, 0x00); } lcd_gotoxy(modus, 0, 0); // Cursor an den Anfang setzen } void lcd_gotoxy(unsigned char modus, uint8_t x, uint8_t y){ // Setzt den Cursor an eine bestimmte Position uint16_t adress; if(modus == 'c'){ // Charaktermodus adress = (y * 40) + x; } else{ // Grafikmodus adress = (y * 30) + x; } lcd_send(0x0a, (uint8_t)(adress)); // Set Cursor Address (Low Order) lcd_send(0x0b, (uint8_t)(adress >> 8)); // Set Cursor Address (High Order) } void lcd_setdot(uint8_t x, uint8_t y){ // Setzt ein Pixel an einer bestimmte Position lcd_gotoxy('g', (x >> 3), y); lcd_send(0x0f, (x & 0x07)); } void lcd_cleardot(uint8_t x, uint8_t y){ // Löscht ein Pixel an einer bestimmte Position lcd_gotoxy('g', (x >> 3), y); lcd_send(0x0e, (x & 0x07)); } void lcd_puts(char *string){ #define lcd_putc(c) lcd_send(0x0c,c) uint8_t i=0; char c = string[0]; while(c != 0) { /* if(c == '\n') lcd_newline(font.height, startx); else*/ lcd_putc(c); c = string[++i]; } } int main(void){ _delay_ms(10); lcd_init('c'); lcd_puts("Hallo ! Test XY Test XY Test XY Test XY"); while(1); }
ich weiß echt nicht mehr weiter...







Zitieren

Lesezeichen