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
Lesezeichen