Hallo
Jetzt habe ich noch eine kleine Erweiterung angebaut:
Externes Bild anzeigen
Fünf Taster mit Vorwiderstand (820 Ohm, die hatte ich grad rumliegen) zwischen den Anschlüssen SL1-SL5 und GND. Blöderweise sind die Widerstände zu klein, so kann ich nicht senden wenn eine der Tasten gedrückt ist, aber trotzdem recht brauchbar:
Externes Bild anzeigen
http://www.youtube.com/watch?v=ieltub967Jo
Der Code (Tastenabfrage und Usergraphic):
Viel Spaß mit wenig Aufwand :)Code:// LCD 20x4 (LMC-SSC4A20) an den LEDs 1-6 16.7.2008 mic // 4-Bit-Ansteuerung ohne busy-Abfrage: // 1 - GND - GND // 2 - Vcc - Vcc // 3 - Kontrast (0-0,5V) // 4 - RS - LS3 (BPR) // 5 - R/W - GND // 6 - E - LS6 (BPL) // 7 // 8 // 9 // 10 // 11 - Data4 - LS1 (101) // 12 - Data5 - LS2 (102) // 13 - Data6 - LS4 (103) // 14 - Data7 - LS5 (104) // 15 - A - Vcc // 16 - K - GND #include "rblib.h" #include "rblib.c" #define demospeed 50 #define d4h (PORTC|=SL1) #define d4l (PORTC&=~SL1) #define d5h (PORTC|=SL2) #define d5l (PORTC&=~SL2) #define d6h (PORTB|=SL4) #define d6l (PORTB&=~SL4) #define d7h (PORTB|=SL5) #define d7l (PORTB&=~SL5) #define rsh (PORTC|=SL3) #define rsl (PORTC&=~SL3) #define eh (PORTB|=SL6) #define el (PORTB&=~SL6) //#define vri_on (PORTA |= 1) //#define vri_off (PORTA &= ~1) //#define vra_on (PORTA |= 2) //#define vra_off (PORTA &= ~2) void delay_ms(uint16_t ms) { while(ms--) delay(5); // delay(5) ~ 1,1 ms // hier müßte bei Verwendung der orginalen Library die Funktion mSleep() stehen: // mSleep(ms); } void strobe(void) { eh; delay_ms(1); el; } void lcd_write8(uint8_t wert, uint8_t pause) { if(wert & 16) d4h; else d4l; if(wert & 32) d5h; else d5l; if(wert & 64) d6h; else d6l; if(wert & 128) d7h; else d7l; strobe(); delay_ms(pause); } void lcd_write4(uint8_t wert, uint8_t pause) { if(wert & 16) d4h; else d4l; // high nipple if(wert & 32) d5h; else d5l; if(wert & 64) d6h; else d6l; if(wert & 128) d7h; else d7l; strobe(); if(wert & 1) d4h; else d4l; // low nipple if(wert & 2) d5h; else d5l; if(wert & 4) d6h; else d6l; if(wert & 8) d7h; else d7l; strobe(); delay_ms(pause); } void lcd_cls(void) { rsl; lcd_write4(1,2); rsh; } void lcd_locate(uint8_t x, uint8_t y) { rsl; switch (y) { case 0: lcd_write4(0x80+x, 40); break; // 0. Zeile case 1: lcd_write4(0xc0+x, 40); break; // 1. Zeile case 2: lcd_write4(0x94+x, 40); break; // 2. Zeile case 3: lcd_write4(0xd4+x, 40); break; // 3. Zeile } rsh; } void lcd_writeChar(uint8_t zeichen) { lcd_write4(zeichen,1); } void lcd_writeString(char *string) { while(*string) lcd_writeChar(*string++); } void lcd_writeInteger(int16_t number, uint8_t base) { char buffer[17]; itoa(number, &buffer[0], base); lcd_writeString(&buffer[0]); } uint8_t lcd_getkeys(void) { uint8_t keys=0; el; DDRC &= ~SL1; PORTC|=SL1; DDRC &= ~SL2; PORTC|=SL3; DDRC &= ~SL3; PORTC|=SL2; DDRB &= ~SL4; PORTB|=SL4; DDRB &= ~SL5; PORTB|=SL5; if(PINC & SL1) keys |= 8; if(PINC & SL2) keys |= 4; if(PINC & SL3) keys |= 16; if(PINB & SL4) keys |= 2; if(PINB & SL5) keys |= 1; DDRC |= 0x70; // LED1-3 auf Ausgang und low PORTC &= ~0x70; DDRB |= 0x83; // LED4-6 auf Ausgang und low PORTB &= ~0x83; return(~keys & 0b11111); } void lcd_init(void) { DDRC |= 0x70; // LED1-3 auf Ausgang und low PORTC &= ~0x70; DDRB |= 0x83; // LED4-6 auf Ausgang und low PORTB &= ~0x83; //DDRA |= 3; // ADC0 und ADC1 auf Ausgang und low //PORTA &= ~3; //DDRC |= 0x3; // SCL und SDA auf Ausgang und low //PORTC &= ~0x3; rsl; delay_ms(100); lcd_write8(0b00100000,100); // Function Set: 4bit-Modus starten lcd_write4(0b00101000,40); // Function Set: 2 Zeilen, Font 0 (0010NFxx) lcd_write4(0b00000001,40); // Display Clear lcd_write4(0b00000110,40); // Entry Mode Set: inc, no shift lcd_write4(0b00001100,40); // Display On and Cursor //lcd_write4(0b00001111,40); // Display On and Cursor rsh; delay_ms(1); } int main(void) { uint8_t i=0; // Hilfsvariable rblib_init(); // rblib initialisieren lcd_init(); // lcd initialisieren lcd_cls(); // lcd Inhalt löschen rsl; // Startadresse Usergraphic setzen lcd_write4(64,40); rsh; lcd_writeChar(0b00000); // eigene Zeichen definieren lcd_writeChar(0b00000); lcd_writeChar(0b00100); lcd_writeChar(0b00100); lcd_writeChar(0b00100); lcd_writeChar(0b10101); lcd_writeChar(0b01110); lcd_writeChar(0b00100); for(i=0; i<8;i++) // 5x8-Block { lcd_writeChar(31); } lcd_writeChar(0); lcd_writeChar(31); lcd_writeChar(15); lcd_writeChar(7); lcd_writeChar(3); lcd_writeChar(1); lcd_writeChar(0); lcd_writeChar(0); lcd_writeChar(0b00000); lcd_writeChar(0b01010); lcd_writeChar(0b00000); lcd_writeChar(0b10001); lcd_writeChar(0b01110); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b01010); lcd_writeChar(0b00000); lcd_writeChar(0b01110); lcd_writeChar(0b10001); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b11111); lcd_writeChar(0b10001); lcd_writeChar(0b10001); lcd_writeChar(0b10001); lcd_writeChar(0b10001); lcd_writeChar(0b10001); lcd_writeChar(0b11111); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b00100); lcd_writeChar(0b01110); lcd_writeChar(0b11111); lcd_writeChar(0b01110); lcd_writeChar(0b00100); lcd_writeChar(0b00000); lcd_writeChar(0b00000); lcd_writeChar(0b10101); lcd_writeChar(0b01010); lcd_writeChar(0b10101); lcd_writeChar(0b01010); lcd_writeChar(0b10101); lcd_writeChar(0b01010); lcd_writeChar(0b10101); lcd_writeChar(0b00000); lcd_locate(2,0); lcd_writeString("RP6 ROBOT SYSTEM"); lcd_locate(0,2); lcd_writeString("Bitte Taste druecken"); /* lcd_locate(2,3); for(i=0; i<8;i++) { lcd_writeChar('0'+i); lcd_writeChar(i); } */ delay_ms(2000); while(1){ if(lcd_getkeys()) { i=lcd_getkeys(); while(lcd_getkeys()); delay_ms(10); while(lcd_getkeys()); lcd_locate(0,3); lcd_writeString(" "); if(i & 16) lcd_locate(4,3); if(i & 8) lcd_locate(7,3); if(i & 4) lcd_locate(11,3); if(i & 2) lcd_locate(14,3); if(i & 1) lcd_locate(18,3); lcd_writeChar(0); i=0; } } return 0; }
Gruß
mic







Zitieren


Lesezeichen