mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3x7 Matrix (Code Verbesserungen?)


Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

Ich habs endlich geschafft, meine Tastatur Matrix zu beschalten, 
auszulesen und auszuwerten.

Ich möchte euch gerne meinen Code hier vorstellen, vielleicht gibt es an 
der ein oder anderen Stelle sogar noch was zu verbessern?

(Ich frage daher, da mein AVR Studio mir nach dem Kompilieren mitteilt, 
das .data schon zu 94,7% Full ist)
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "Diagnose-Terminal.h"
#include "lcd_lib.h"
#include "uart.h"
#include <util/delay.h>

#define UART_BAUD_RATE      57400
#define NOP();  asm volatile("nop"::);
volatile KEY_PRESSED = 0;

ISR( TIMER0_OVF_vect )  
{
  int col =0;
  col = key_scan();
  if(col>0);
  {
    PORTB = 0b00000111; // PB0-2 "high"
    DDRB &= ~ ((1<<DDB0) | (1<<DDB1) | (1<<DDB2)); // PB0-2 Eingang

    PORTC = 0b00000000; // PC0-7 "low"
    DDRC |= ((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6) | (1<<DDC7)); // PC0-7 Ausgang 
  
    NOP();
  }

  if(col>0)
  {
    _delay_ms(50);  //debouncing der Keys
    KEY_PRESSED = col;
  }  
}

int key_scan(void)
{
  int col=0,row=0;

  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5); // 10ms Preloading
  
  NOP();
  if(!(PINB & (1<< PINB0)))
    col = 3;
  if(!(PINB & (1<< PINB1)))
    col = 2;
  if(!(PINB & (1<< PINB2)))
    col = 1;

  if(col)
  {
    PORTB = 0b00000000; // PB0-2 "low"
    DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2); // PB0-2 Ausgang

    PORTC = 0b11111111; // PC0-7 "high"
    DDRC &= ~ ((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6) | (1<<DDC7)); // PC0-7 Eingang!

    NOP();
    _delay_ms(50); // nochmal ein Debounce
    
      if(!(PINC & (1<<PINC0)))
        row = 4;
      if(!(PINC & (1<<PINC1)))
        row = 7;
      if(!(PINC & (1<<PINC2)))
        row = 10;
      if(!(PINC & (1<<PINC3)))
        row = 22;
      if(!(PINC & (1<<PINC4)))
        row = 22;
      if(!(PINC & (1<<PINC5)))
        row = 19;
      if(!(PINC & (1<<PINC6)))
        row = 16;
      if(!(PINC & (1<<PINC7)))
        row = 13;
  }
  return (row-col);
}

int main(void)
{
  PORTB = 0b00000111; // PB0-2 high
  DDRB &= ~ (1<<DDB0) | (1<<DDB1) | (1<<DDB2); // PB0-2 Eingang

  PORTC = 0b00000000; // PC0-7 low
  DDRC = 0xff; // PC0-7 Ausgang

  
  TCCR0 = (1<<CS02) | (1<<CS00); // Teilen durch 1024 / ~10ms
  TIMSK |= 1<<TOIE0;        // Timer aktivieren

  lcd_init(LCD_DISP_ON); // LCD Init
  lcd_clrscr(); // LCD Leeren
  initialize(); // Init 2 ( Nicht wichtig für euch)
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); // UART An

  sei();

  while(1)
  {
    if(KEY_PRESSED) // Zum Test paar Abfragen der Tasten
    {
      if(KEY_PRESSED == KEY_ARROW_DOWN)
        lcd_puts("down pressed");
      else if(KEY_PRESSED == KEY_ENTER)
        lcd_puts("enter pressed");
      else if(KEY_PRESSED == KEY_ARROW_LEFT)
        lcd_puts("left pressed");
      else if(KEY_PRESSED == KEY_ARROW_UP)
        lcd_puts("up pressed");
      else if(KEY_PRESSED == KEY_0)
        lcd_puts("0 pressed");

      KEY_PRESSED = 0;
                        lcd_home();
    }
    
  }
}


Würde mich über Kritiken freuen.
Die Einzelnen Tasten sind in der Diagnose-Terminal.h einfach mittels
#define KEY_ENTER 6

definiert.

Danke :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.