Hallo

Jetzt habe ich noch eine kleine Erweiterung angebaut:

Bild hier  

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:

Bild hier  
http://www.youtube.com/watch?v=ieltub967Jo

Der Code (Tastenabfrage und Usergraphic):
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;
}
Viel Spaß mit wenig Aufwand :)

Gruß

mic