LCDInfo.com http://forum.lcdinfo.com/ |
|
T6963 Display with Infineon XC800 µC http://forum.lcdinfo.com/viewtopic.php?f=9&t=2423 |
Page 1 of 1 |
Author: | nergal [ Fri Feb 29, 2008 9:55 ] |
Post subject: | T6963 Display with Infineon XC800 µC |
Hi! I've got some problems with the initialisation my graphics display (resolution 240x128) with the t6963 controller. i'm using an Infineon XC800 controller. the reset works, but after that nothing shows up at the display except some senseless crap (but only sometimes - in most cases there is nothing to see). Does anybody have experience with the XC800 Controller and t6963-displays? Here is the code: Code: //************************************************************************
// T6963.C // LowLevel Routinen für LCD-Displays mit T6963 //************************************************************************ #include <t6963.h> #include <io.c> #include <io.h> #include <MAIN.H> unsigned char LCD_STAT; // Status-Byte unsigned char LCD_DATA; unsigned char LCD_CMD; unsigned int t; unsigned int i; /**** LCD-Display-Routinen **********************************************/ void lcd_init(void) { P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 1; P1_5 = 0; for(i = 0; i< 1000;i++); //IO_vSetPin(P1_5); P1_5=1; for(i = 0; i< 1000;i++); // ca. 125us. Reset // LCD_RST_H(); // Display Reset fertig lcd_send_data(G_BASE%256); lcd_send_data(G_BASE>>8); lcd_send_cmd(0x42); // set graphics memory to address G_BASE lcd_send_data(BYTES_PER_ROW%256); lcd_send_data(BYTES_PER_ROW>>8); lcd_send_cmd(0x43); // n bytes per graphics line lcd_send_data(T_BASE%256); lcd_send_data(T_BASE>>8); lcd_send_cmd(0x40); // text memory at address T_BASE lcd_send_data(BYTES_PER_ROW%256); lcd_send_data(BYTES_PER_ROW>>8); lcd_send_cmd(0x41); // n bytes per text line lcd_send_cmd(0x81); // mode set: Graphics OR Text, ROM CGen lcd_send_cmd(0xa7); // cursor is 8 lines high lcd_send_data(0x00); lcd_send_data(0x00); lcd_send_cmd(0x21); // put cursor at (x,y) location lcd_send_cmd(0x9C); lcd_clear_text(); lcd_clear_graph(); // (For cursor to be visible, need to set up position } // Display's loeschen void lcd_status(void) { P3_DIR = 0x00; P1_0 = 0; P1_3 = 1; // Commando High P1_1 = 0; // Read Low P1_2 = 0; // Chip Enable Low LCD_STAT = P3_DATA; // Status lesen for(t = 0; t<100;t++); P1_2 = 1; // Chip Enable High P1_1 = 1; // Read High LCD_STAT &= (0x03); // Bits ausmaskieren P3_DIR = 0xff; /*P3_DATA=LCD_STAT; for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);} P3_DATA = 0; for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);}*/ } void lcd_status_am(void) { P3_DIR = 0x00; P1_0 = 0; P1_3 = 1; //Commando High P1_1 = 0; // Read Low P1_2 = 0; // Chip Enable Low LCD_STAT = P3_DATA; // Status lesen for(t = 0; t<100;t++); P1_2 = 1; // Chip Enable High P1_1 = 1; // Read High LCD_STAT &= (0x03); // Bits ausmaskieren P3_DIR = 0xff; } void lcd_send_cmd(char cmd) // Commando an Display senden { do { lcd_status(); } while (LCD_STAT != 0x03); P3_DIR = 0xFF; //DATA_DIR_OUT(); // Port 2 als Ausgang P3_DATA = cmd; //LCD_WRITE = cmd; P1_3 = 1; // Commando High P1_1 = 1; //Read Low P1_0 = 0; // Write Low P1_2 = 0; // Chip Enable Low for(t = 0; t<100;t++); P1_2 = 1; // Chip Enable High P1_0 = 1; // Write High // P3_DATA=P0_DATA; /*for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);} P3_DATA = 0; for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);}*/ } void lcd_send_data(char dat) // Daten an Display senden { do { lcd_status(); } while (LCD_STAT != 0x03); P3_DIR = 0xFF; // Port 2 als Ausgang P1_3 = 0; // Commando High P1_0 = 0; // Write Low P3_DATA = dat; P1_2 = 0; // Chip Enable Low for(t = 0; t<100;t++); P1_2 = 1; // Chip Enable High P1_0 = 1; // Write High //P3_DATA=P0_DATA; /*for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);} P3_0 = 0; for(i = 0; i<1000;i++){ for(t = 0; t<1000;t++);} */ } void lcd_send_data_am(char dat) // Daten an Display senden { do { lcd_status_am(); } while (LCD_STAT != 0x03); P3_DIR = 0xFF; // Port 2 als Ausgang P3_DATA = dat; for(t = 0; t<100;t++); P1_3 = 0; // Daten Low P1_0 = 0; // Write Low P1_2 = 0; // Chip Enable Low for(t = 0; t<100;t++); P1_2 = 1; // Chip Enable High P1_0 = 1; // Write High //P3_DATA=dat; for(t = 0; t<100;t++); } /* void lcd_printp(const char *progmem_s, char adress_h, char adress_l) { char c; lcd_send_data(adress_l); lcd_send_data(adress_h); lcd_send_cmd(0x24); lcd_send_cmd(0xB0); while ( (c = pgm_read_byte(progmem_s++))) { lcd_send_str(c); } lcd_send_cmd(0xB2); } */ void lcd_print(int x,int y,char *string) // send string of characters to LCD { int i; int c; lcd_xy(x,y); for (i=0;string[i]!=0;i++) { c = string[i] - 0x20; // convert ASCII to LCD char address if (c<0) c=0; lcd_send_data(c); lcd_send_cmd(0xc0); // write character, increment memory ptr. } // end for } // end lcd_string void lcd_xy(int x, int y) // set memory pointer to (x,y) position (text) { int addr; addr = T_BASE + (y * BYTES_PER_ROW) + x; lcd_set_address(addr); // set LCD addr. pointer } // lcd_xy() /* void lcd_print(char *txt, char adress_h, char adress_l) { char c; lcd_send_data(adress_l); lcd_send_data(adress_h); lcd_send_cmd(0x24); while((c = *txt)) //Solange Zeichen groeßer 0x00 { txt++; //Naechstes Zeichen if (c == 0) break; //Raus wenn Zeichen gleich 0 lcd_send_str(c); lcd_send_cmd(0xc0); } } */ void lcd_send_str(unsigned char lcd_dat) { lcd_dat -= 0x20; // 20h subtrahieren da Display nicht ASCII lcd_send_data_am(lcd_dat); // Daten an Display senden } void lcd_clear_graph() // clear graphics memory of LCD { int i; lcd_set_address(G_BASE); // addrptr at address G_BASE for (i=0;i<3840;i++) { // must be 3840 ????????????????? 5120 lcd_send_data(0); lcd_send_cmd(0xc0); // write data, inc ptr. } // end for(i) } // end lcd_clear_graph() //---------------------------------------------------------------- void lcd_clear_text() { int i; lcd_set_address(T_BASE); // addrptr at address T_BASE for (i=0;i<480;i++) { // must be 480 ??????????? 640 lcd_send_data(0); lcd_send_cmd(0xc0); // write data, inc ptr. } // end for(i) } // lcd_clear_text() //------------------------------------------------------------------------------- void lcd_set_address(unsigned int addr){ lcd_send_data(addr%256); lcd_send_data(addr>>8); lcd_send_cmd(0x24); } /* void lcd_printg(const char *progmem_s, char adress_h, char adress_l) { unsigned int length =5120; //< dieses ist die Bildgroesse in Bytes unsigned char c; lcd_send_data(adress_l); lcd_send_data(adress_h); lcd_send_cmd(0x24); lcd_send_cmd(0xB0); while (length !=0) //es wird ein Bild in der Groesse 128*64 Pixel { //mit Font 6*8 angezeigt c = pgm_read_byte(progmem_s++); lcd_send_strg(c); length--; } lcd_send_cmd(0xB2); } */ void lcd_send_strg(unsigned char lcd_dat) { lcd_send_data(lcd_dat); // Daten an Display senden } void lcd_setpixel(int column, int row) // set single pixel in 240x64 array { int addr; // memory address of byte containing pixel to write if( (column>=XMAX) || (row>=YMAX) )return; addr = G_BASE + (row*BYTES_PER_ROW) + (column/8); lcd_set_address(addr); // set LCD addr. pointer lcd_send_cmd(0xf8 | ((7-column%8)) ); // set bit-within-byte command } void lcd_clrpixel(int column, int row) { int addr; // memory address of byte containing pixel to write if( (column>=XMAX) || (row>=YMAX) )return; addr = G_BASE + (row*BYTES_PER_ROW) + (column/8); lcd_set_address(addr); // set LCD addr. pointer lcd_send_cmd(0xf0 | ((7-column%8)) ); // set bit-within-byte command } //-------------------------------------------------------------------------------- void lcd_print_ram(int x,int y,char *string) // send string of characters to LCD { int i; int c; lcd_xy(x,y); for (i=0;string[i]!=0;i++) { c = string[i] - 0x20; // convert ASCII to LCD char address if (c<0) c=0; lcd_send_data(c); lcd_send_cmd(0xc0); // write character, increment memory ptr. } // end for } // end lcd_string //--------------------------------------------------------------------------------- void show(char * s,int start_line,int how_many_line){ int addr,i; addr = G_BASE +start_line*30; lcd_set_address(addr); // set LCD addr. pointer lcd_send_cmd(0xB0); for(i=0;i<how_many_line*30;i++){ lcd_send_data(s[i]); } lcd_send_cmd(0xB2); } //--------------------------------------------------------------------------------- void lcd_pixel(int column, int row,char show) { int addr; // memory address of byte containing pixel to write if( (column>=XMAX) || (row>=YMAX) )return; addr = G_BASE + (row*BYTES_PER_ROW) + (column/8); lcd_set_address(addr); // set LCD addr. pointer if(show) lcd_send_cmd(0xf8 | ((7-column%8)) ); // set bit-within-byte command else lcd_send_cmd(0xf0 | ((7-column%8)) ); // set bit-within-byte command } //--------------------------------------------------------------------------------- /***************************************************************************** Name: Int To Ascii Hex Parameters: dest_string Pointer to a buffer will the string will reside min_digits Specifies the minimum number of characters the output string will have. Leading zeros will be written as '0' characters. Returns: A pointer to the string's NULL character in the string that was just created. Description: This function is used to convert a passed unsigned int into a ASCII string represented in Hexidecimal format. *****************************************************************************/ /* char * IntToAsciiHex(char * dest_string,int min_digits,unsigned int value) { unsigned int i, total_digits = 0; char buff[4]; for(i=0;i<4;i++) { buff[i] = (char)(value & 0x0F); value = value >> 4; if( buff[i] <= 9) buff[i] += '0'; else buff[i] = (char)(buff[i] - 0xA + 'A'); if(buff[i] != '0') total_digits = i+1; } if( total_digits < min_digits) total_digits = min_digits; i = total_digits; while(i) { *dest_string++ = buff[i-1]; i--; } *dest_string = 0; return dest_string; } */ /***************************************************************************** Name: Int To Ascii Dec Parameters: dest_string Pointer to a buffer will the string will reside min_digits Specifies the minimum number of characters the output string will have. Leading zeros will be written as '0' characters. Returns: A pointer to the string's NULL character in the string that was just created. Description: This function is used to convert a passed unsigned int into a ASCII string represented in base 10 decimal format. *****************************************************************************/ /* char * IntToAsciiDec(char * dest_string,int min_digits,unsigned int value) { const unsigned long base10[] = {1,10,100,1000,10000,100000}; unsigned int tmp; unsigned int i, total_digits = 0; char buff[5]; for(i=0;i<5;i++) { tmp = (int)( value % base10[i+1] ); value -= tmp; buff[i] = (char)( tmp / base10[i] ); buff[i] += '0'; if(buff[i] != '0') total_digits = i+1; } if( total_digits < min_digits) total_digits = min_digits; i = total_digits; while(i) { *dest_string++ = buff[i-1]; i--; } *dest_string = 0; return dest_string; } */ thanks for the help |
Page 1 of 1 | All times are UTC + 2 hours |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |