// Ansteuerung des LCD-Displays #include #include //#include #define STOP_WATCHDOG WDTCTL = WDTPW + WDTHOLD; // Watchdog anhalten //#define SetE P5OUT, BIT3; #define EN BIT2 #define RW BIT1 #define RS BIT0 #define CMD_FUNCTION_SET_2x16 0x38 #define CMD_DISPLAY_ON_BL 0x0F // Display an, Cursor blinkt #define CMD_DISPLAY_ON 0x0E // Display an, Cursor blinkt nicht #define CMD_CLEAR_DISPLAY 0x01 #define CMD_CURSOR_AUTOINCREMENT 0x06 #define CMD_CURSOR_HOME 0x02 #define CMD_DD_RAM_ADDRESS_SET BIT7 #define CMD_DISPLAY_SHIFT 0x07 #define CMD_2nd_LINE_2x16 0xC0 #define CMD_FUNCTION_SET_4x20 0x34 // 8 Bit ER=1 #define CMD_SET_EXTENTION_REGISTER_4x20 0x34 // 8 Bit ER=1 #define CMD_4_LINE_MODE_4x20 0x09 // 4 Zeilen , ER muss gesetzt sein #define CMD_CLEAR_EXT_REG_4x20 0x30 // 8 Bit ER=0 unsigned char zeichen = 0; char* text; char zahl[10]; int main(void); void init(void); void LCD_clear(void); void LCD_init_2x16(void); void wait(long i); void clock_init(void); long i=0; void clock_init() { /** clock_init(void) Warten bis der Quarz eingeschwunngen ist Einstellungen für Quarz und Taktrate **/ volatile unsigned int i; STOP_WATCHDOG; DCOCTL = 0xE0; // Einstellen der DCO-Frequenz BCSCTL1 &= ~XT2OFF; // XT2 einschalten (Bit löschen) do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? BCSCTL2 |= SELS+DIVS_1; /* SMCLK Source 1:XT2CLK/LFXTCLK SMCLK 1/2 */ BCSCTL2 |= SELM_2; /* MCLK Source Select 2: XT2CLK/LFXTCLK */ } void init(){ /* Display-Ansteuerung Port 5.0 : RS-Bit für Umschaltung Befehl/Daten Port 5.1 : R/W-Bit High = Read, Low = Write Port 5.2 : E Enable mit fallender Flanke benötigt Zeit Port 4.0 .. 4.7 DB0-DB7 Display Data */ STOP_WATCHDOG; // watchdog aus P1DIR = 0xFF; P1IE = 0x00; // Interrupts aus P1SEL = 0x00; // port1 I/O Funktion for Pin P1OUT = 0x00; P1DIR = 0xEF; // port 1.0 = output (Blaue LED) Pin 12 // port 1.4 = input (Taster 1) Pin 16 //P1IN &= ~BIT4; // port 1.4 = input low signal ???? Fehler: kann nicht gesetzt werden? //für LCD P4SEL = 0x00; // I/O Funktion selected for port4 P5SEL = 0x00; // I/O Funktion selected for port5 P5DIR = 0xFF; // Port5 auf output schalten P4DIR = 0xFF; // Port4 auf output schalten : LCD Datenbus P4OUT = 0x00; // Port4 auf Low P5OUT = 0x00; // Port5 auf Low } void wait(long i) { while (i-- > 0) ; } void LCDcommand(unsigned char command) { wait(1000); P5OUT |= EN; // set enable bit P5OUT &= ~(RW+RS); // clear RS and RW bits (command mode) wait(1000); P4OUT = command; // function set command wait(1000); P5OUT &= ~EN; // clear Enable bit --> execute command wait(1000); } void LCD_clock(){ // erzeugt fallende Flanke E-Bit zur übernahme der Daten wait(1000); P5OUT |= 0x04; // clock-bit erst mal auf high P5OUT &= ~(RW+RS); // clear RS and RW bits (command mode wait(1000); P5OUT &= ~0x04; // und jetzt auf low wait(1000); } void LCD_init_2x16(void){ P1OUT |= BIT5; // LED an P5DIR |= 0x07; // set P5.0,P5.1,P5.2 to output direction P4DIR = 0xFF; // all P4 pins used as output lines P5OUT &= ~0x07; // preset P5OUT bits wait(50000); LCDcommand(CMD_FUNCTION_SET_2x16); LCDcommand(CMD_CLEAR_DISPLAY); LCDcommand(CMD_DISPLAY_ON); LCDcommand(CMD_CURSOR_HOME); LCDcommand(CMD_CURSOR_AUTOINCREMENT); wait(1000); //P5OUT=0x05; // RS und E high, R/W low //P4OUT = 0x53; // 's' schreiben P1OUT &= ~BIT5; // LED aus } void sendChar(char zeichen) { P4OUT = zeichen; P5OUT=0x05; // RS und E high, R/W low wait(50); P5OUT&=~0x04; // und jetzt auf low } void sendString(char* Zeichenkette) { int i; char zeile=0; char spalte=0; LCDcommand(CMD_CLEAR_DISPLAY); LCDcommand(CMD_CURSOR_HOME); for (i=0;Zeichenkette[i]!='\0';i++) { sendChar(Zeichenkette[i]); spalte++; wait(70000); if((Zeichenkette[i]==' ')&&(spalte>12)&&(zeile==0)){ LCDcommand(CMD_2nd_LINE_2x16); zeile++; } if((spalte==15)&&(zeile==0)) { LCDcommand(CMD_2nd_LINE_2x16); zeile=1; } if((Zeichenkette[i]==' ')&&(spalte>29)&&(zeile==1)){ LCDcommand(CMD_CLEAR_DISPLAY); LCDcommand(CMD_CURSOR_HOME); zeile=0; spalte=0; } if(spalte==30) { LCDcommand(CMD_CLEAR_DISPLAY); LCDcommand(CMD_CURSOR_HOME); zeile=0; spalte=0; } } } void sendInt(int a) { LCDcommand(CMD_CLEAR_DISPLAY); LCDcommand(CMD_CURSOR_HOME); sprintf (text,"+ %d +",a); sendString(text); } int strlen(char s[]) // liefert länge von S { int i; i =0; while (s[i]!= '0') i++; return i; } void reverse(char s[]) // s an Ort und Stelle umkehren { int c,i,j; for(i =0,j=strlen(s)-1; i 0); if(sign < 0) s[i++] = '-'; s[i]= '\0'; reverse(s); } int main(void) { clock_init(); init(); LCD_init_2x16(); sendString("hallo das ist ein Test"); itoa(12345,zahl); sendString(zahl); wait(1000); //for(;;); }