oderlachs
05.06.2014, 22:09
Hallo Kenner !
Ich bin gerade dabei eine Routine zuum Auswerten eines 4x4 Keypads zu schreiben. Am KPd Port sind 4 Pins auf Input und 4 auf Output geschaltet. Je nach Maskierung(Binäre Angabe) ist immer eine Spalte COL1...4 auf Low gezogen. Je nach gedrückter Taste wird dann einer der 4 Eingänge, von HI auf Low gezogen..
Bei der Auswertungschleife breche ich mir den Kopf entwei und finde keinen rechten Anfang.
Ich habe hier mal den Code und hoffe er ist gut genug kommentiert, um zu zeigen wo nach ich suche. Am Port D sind erst mal 8 LED vom Stk500 als Auswertung(Binär).
Ich hoffe es kann mir wer einen "Tritt in den ..." geben, damit ich weiterfinde. ;)
/* ================================================== ======================== */
/* */
/* 4x4 Keypad-Abfrage */
/* */
/* ================================================== ======================== */
#include<avr/io.h>
#ifndef F_CPU
#define F_CPU 1600000UL
#endif
#include<util/delay.h>
#include <avr/io.h>
/* ================================================== ======================== */
/* PC0...PC3 = Row1...Row4 Taste gedrückt = LOW Pegel */
/* */
/* PC4...PC7 = Col4...Col1 über 5k6 R Schutzwiderstand */
/* */
/* ================================================== ======================== */
int main(void)
{
//DDR PortD als Ausgabe für LED Auswertung
DDRD = 0xFF;
//alles auf HI = LED OFF(STK500)
PORTD = 0xFF;
//INPUT/OUTPUT Einstellen für PORTC
DDRC = 0xF0; // PC0..3 Input PC4..7 Output
PORTC = 0x0F; // PullUpR an PC0..3
while (1)
{
// Voreinstellungen je Col Abfrage
//PORTC = 0b01111111 //Col 1 abfragen
//PORTC = 0b10111111 //Col 2 abfragen
//PORTC = 0b11011111 //Col 3 abfragen
//PORTC = 0b11101111 //Col 4 abfragen
if (bit_is_clear(PINC, 0)) PORTD = 0xFE; // 0xFE = LED 0 am STK500 ON ..COL1/ROW1
else PORTD =0xFF;
if (bit_is_clear(PINC, 1)) PORTD = 0xFD; // 0xFD = LED 1 am STK500 ON...COL1/ROW2
else PORTD =0xFF;
}
return 0;
}
Gruss und Dank
Gerhard
Ich bin gerade dabei eine Routine zuum Auswerten eines 4x4 Keypads zu schreiben. Am KPd Port sind 4 Pins auf Input und 4 auf Output geschaltet. Je nach Maskierung(Binäre Angabe) ist immer eine Spalte COL1...4 auf Low gezogen. Je nach gedrückter Taste wird dann einer der 4 Eingänge, von HI auf Low gezogen..
Bei der Auswertungschleife breche ich mir den Kopf entwei und finde keinen rechten Anfang.
Ich habe hier mal den Code und hoffe er ist gut genug kommentiert, um zu zeigen wo nach ich suche. Am Port D sind erst mal 8 LED vom Stk500 als Auswertung(Binär).
Ich hoffe es kann mir wer einen "Tritt in den ..." geben, damit ich weiterfinde. ;)
/* ================================================== ======================== */
/* */
/* 4x4 Keypad-Abfrage */
/* */
/* ================================================== ======================== */
#include<avr/io.h>
#ifndef F_CPU
#define F_CPU 1600000UL
#endif
#include<util/delay.h>
#include <avr/io.h>
/* ================================================== ======================== */
/* PC0...PC3 = Row1...Row4 Taste gedrückt = LOW Pegel */
/* */
/* PC4...PC7 = Col4...Col1 über 5k6 R Schutzwiderstand */
/* */
/* ================================================== ======================== */
int main(void)
{
//DDR PortD als Ausgabe für LED Auswertung
DDRD = 0xFF;
//alles auf HI = LED OFF(STK500)
PORTD = 0xFF;
//INPUT/OUTPUT Einstellen für PORTC
DDRC = 0xF0; // PC0..3 Input PC4..7 Output
PORTC = 0x0F; // PullUpR an PC0..3
while (1)
{
// Voreinstellungen je Col Abfrage
//PORTC = 0b01111111 //Col 1 abfragen
//PORTC = 0b10111111 //Col 2 abfragen
//PORTC = 0b11011111 //Col 3 abfragen
//PORTC = 0b11101111 //Col 4 abfragen
if (bit_is_clear(PINC, 0)) PORTD = 0xFE; // 0xFE = LED 0 am STK500 ON ..COL1/ROW1
else PORTD =0xFF;
if (bit_is_clear(PINC, 1)) PORTD = 0xFD; // 0xFD = LED 1 am STK500 ON...COL1/ROW2
else PORTD =0xFF;
}
return 0;
}
Gruss und Dank
Gerhard