Ovládač maticovej klávesnice
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2023 - Hortenzia Wollentová
Zadanie
Maticová klávesnica 4x4 - treba napísať rutiny pre načítanie hodnoty z maticovej klávesnice, vrátane detekcie stlačenia dvoch kláves súčasne. Predvedenie funkcie si vymyslite.
Pripojenie maticovej klávesnice 4x4 k arduinu uno, napísanie rutín pre načítanie hodnoty z maticovej klávesnice v prostredí avr-studio. Komunikácia s PC je cez uart protokol. Ak sa stlačia dve a viac tlačidiel naraz, tak výpis detekcie viac stlačených kláves a následne čaká na ďalší vstup.
Literatúra:
Analýza a opis riešenia
Zapojila som maticovú klávesnicu, tak, že riadky sú pripojené na PC0-PC3 a stĺpce na PB0-PB3. Program sníma stlačenie tlačidla. Ak zaznamená, že tlačidlo je stlačené, tak zapíše jeho súradnicu riadka a potom deteguje súradnicu stĺpca, ktorá sa tiež zapíše. Na každej súradnici je definovaný znak, ktorý sa vypíše, podľa stlačenia tlačidla a jeho daných súradníc. Ak je zosnímaných viacero riadkov alebo stĺpcov, t.j., ak je stlačená viac ako jedna klávesa, tak program vypíše hlášku pressed two or more keys. Komunikácia je zabezpečená cez UART protokol, na ktorý som využila knižnicu, ktorá nám bola poskytnutá počas semestra.
Nezabudnite doplniť schému zapojenia!
Algoritmus a program
Algoritmus programu je....
#define BAUD 9600
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
int main(void)
{
uart_init(); //inicializacia uart
stdout = &mystdout; // funkcnost funkcie printf
int coll = 0;
int row = 0;
printf("PRESS A KEY\n");
DDRC=0xF0; //nastavenie PORTC ako input, riadky
_delay_ms(5);
PORTC=0x0F;
_delay_ms(5);
DDRB=0x0F; //nastavenie PORTB ako output, stlpce
_delay_ms(5);
PORTB=0xF0;
_delay_ms(5);
while(1) {
if (PINC != 0x0F) { //detekcia stlacenia tlacidla riadok
_delay_ms(50);
row = PINC; //zapis hodnoty riadku
if ((row != 0x30) && (row != 0x0F) && //ak je stlacenych viac ako 1 riadok, vypis, je stlacenych viac tlacidiel
(row != 0x0E) && (row != 0x0D) &&
(row != 0x0B) && (row != 0x07)) {
printf("\npressed two or more keys\n");
}
DDRC=0x0F; //nastavenie PORTC ako output
_delay_ms(1);
PORTC=0xF0;
_delay_ms(1);
DDRB=0xF0; //nastavenie PORTB ako input, aby sa mohla hladat suradnica stlpca
_delay_ms(1);
PORTB=0x0F;
_delay_ms(1);
if (PINB != 0x0F) { //detekcia stlacenia stlpca
_delay_ms(50);
coll = PINB;
if ((coll != 0x30) && (coll != 0x0F) && //ked je stlaceny viac ako 1 stlpec vypis stlacenych viac tlacidiel
(coll != 0x0E) && (coll != 0x0D) &&
(coll != 0x0B) && (coll != 0x07)) {
printf("\npressed two or more keys\n");
}
DDRB=0x0F; //nastavenie PORTB ako output
_delay_ms(1);
PORTB=0xF0;
_delay_ms(1);
DDRC=0xF0; //nastavenie PORTC ako input
_delay_ms(1);
PORTC=0x0F;
_delay_ms(1);
//zakodovanie konkretnych znakov klavesnice
if((row == 0x0E) && (coll == 0x0E)) {
printf("1");
}
else if((row == 0x0E) && (coll == 0x0D)) {
printf("2");
}
else if((row == 0x0E) && (coll == 0x0B)) {
printf("3");
}
else if((row == 0x0E) && (coll == 0x07)) {
printf("A");
}
else if((row == 0x0D) && (coll == 0x0E)) {
printf("4");
}
else if((row == 0x0D) && (coll == 0x0D)) {
printf("5");
}
else if((row == 0x0D) && (coll == 0x0B)) {
printf("6");
}
else if((row == 0x0D) && (coll == 0x07)) {
printf("B");
}
else if((row == 0x0B) && (coll == 0x0E)) {
printf("7");
}
else if((row == 0x0B) && (coll == 0x0D)) {
printf("8");
}
else if((row == 0x0B) && (coll == 0x0B)) {
printf("9");
}
else if((row == 0x0B) && (coll == 0x07)) {
printf("C");
}
else if((row == 0x07) && (coll == 0x0E)) {
printf("*");
}
else if((row == 0x07) && (coll == 0x0D)) {
printf("0");
}
else if((row == 0x07) && (coll == 0x0B)) {
printf("#");
}
else if ((row == 0x07) && (coll == 0x07)) {
printf("D");
}
}
}
}
return(0);
}
void uart_init( void );
void uart_putc( char c );
void uart_puts( const char *s );
char uart_getc( void );
#include <avr/io.h>
#include <util/setbaud.h>
void uart_init( void )
{
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
UCSR0A &= ~(_BV(U2X0));
#endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */
}
void uart_putc(char c)
{
if (c == '\n')
{
uart_putc('\r');
}
loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
UDR0 = c;
}
void uart_puts(const char *s)
{
while(*s!='\0'){
uart_putc(*s);
s++;
}
}
char uart_getc(void) {
loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
return UDR0;
}
Kompletný projekt:
Zdrojový kód: maticova klavesnica.rar
Overenie
Na používanie našej aplikácie stačí maticová klávesnica a terminál, do ktorého bude vypisovať stlačené klávesy. Postup používania je opísaný v sekcii popis riešenia. Na konci uvádzam fotku záverečnej obrazovky pred resetom, po vypísaní všetkých kláves.
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.