kramann.info
© Guido Kramann

Login: Passwort:










27.1 Verwendung einer Tastenmatrix

  • Im folgenden soll eine Tastenmatrix zur Eingabe verwendet werden.
  • Die Matrix besteht aus vier Zeilen mit jeweils drei Spalten.
  • Als Anschlüsse gibt es für jede Zeile und für jede Spalte einen Pin.
  • Beim Drücken einer Taste, wird der zugehörige Zeilenpin mit dem zugehörigen Spalten Pin verbunden.
  • Wie kann nach Anschluß dieser Pins an die digitalen Ein/Ausgänge des Mikrocontrollers durch ein Programm die gerade gedrückte Taste bestimmt werden? - s. Vorlesung.
  • Hier ist zunächst das Layout für die Tastenmatrix:
BILDBESCHREIBUNG

Bild 27.1-1: Layout für die Tastenmatrix

  • Folgendes Schema zeigt, wie im testaufbau die Tastenmatrix mit dem Mikrocontroller verbunden wurde:
BILDBESCHREIBUNG

Bild 27.1-2: Verbindungsschema Tastenmatrix / Mikrocontroller.

BILDBESCHREIBUNG

Bild 27.1-3: Versuchsaufbau

  • Es soll nun ein Testprogramm vorgestellt werden, das die gerade gedrückte Taste am Hyperterminal anzeigt.
  • Der Trick des folgenden Programms besteht darin, nacheinander jede Spalte als Ausgang zu setzen, um dann zu prüfen, ob in igendeiner Zeile eine Reaktion erfolgt.
  • Dies ist nur der Fall, wenn eine Taste gerade gedrückt wird:
03_taster_matrix.zip - Download des nachfolgendne Projekts
//Die gedrückte Taste wird über RS232 angezeigt.
//Verbindung Tastenfeld - ATmega
//              1           PC1
//              2           PC2
//              3           PC3
//              4           PC4
//              5           PC5
//              6           PC6
//              7           PC7

//Taste  verbindet PCx mit PCy
//  1                4       1
//  2                4       2
//  3                4       3
//  4                5       1
//  5                5       2
//  6                5       3
//  7                6       1
//  8                6       2
//  9                6       3
//  *                7       1
//  0                7       2
//  #                7       3


#include <avr/io.h>

#define TAKTFREQUENZ 9216000

#include "RS232.h"

RS232 rs232;

int main(void)
{
    rs232.start(true,true);

//PC 1 2 3 als Ausgang
//PC 4 5 6 7 als Eingang
    DDRC = 0b00001110;

//Pullup für Eingänge
    PORTC |= 0b11110000; 

    rs232.sendeText("Test einer Taster-Matrix\n\r");
    while(true)
    {
        //PC1 auf Masse ziehen
        PORTC |= 0b00001110;
        PORTC &= 0b11111101;
        //prüfen, ob PC 4,5,6 oder 7 einen Low-Pegel aufweisen
        //prüfen, ob PC 4,5,6 oder 7 einen Low-Pegel aufweisen
        if( !(PINC & 0b00010000) )
            rs232.sendeText("1\n\r");
        if( !(PINC & 0b00100000) )
            rs232.sendeText("4\n\r");
        if( !(PINC & 0b01000000) )
            rs232.sendeText("7\n\r");
        if( !(PINC & 0b10000000) )
            rs232.sendeText("*\n\r");



        //PC2 auf Masse ziehen
        PORTC |= 0b00001110;
        PORTC &= 0b11111011;
        //prüfen, ob PC 4,5,6 oder 7 einen Low-Pegel aufweisen
        if( !(PINC & 0b00010000) )
            rs232.sendeText("2\n\r");
        if( !(PINC & 0b00100000) )
            rs232.sendeText("5\n\r");
        if( !(PINC & 0b01000000) )
            rs232.sendeText("8\n\r");
        if( !(PINC & 0b10000000) )
            rs232.sendeText("0\n\r");


        //PC3 auf Masse ziehen
        PORTC |= 0b00001110;
        PORTC &= 0b11110111;
        //prüfen, ob PC 4,5,6 oder 7 einen Low-Pegel aufweisen
        if( !(PINC & 0b00010000) )
            rs232.sendeText("3\n\r");
        if( !(PINC & 0b00100000) )
            rs232.sendeText("6\n\r");
        if( !(PINC & 0b01000000) )
            rs232.sendeText("9\n\r");
        if( !(PINC & 0b10000000) )
            rs232.sendeText("#\n\r");
    }
	return 0;
}
 

Code 27.1-1: Testprogramm für Tastenmatrix