Operácie

Ovládač maticovej klávesnice: Rozdiel medzi revíziami

Z SensorWiki

 
(16 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 7: Riadok 7:
 
  [https://techfun.sk/produkt/tlacidlovy-matrix-4x4/ 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.  
 
  [https://techfun.sk/produkt/tlacidlovy-matrix-4x4/ 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. Komunikácia s PC je cez uart protokol. Ak sa stlačia dve klávesy naraz, tak nenapíše nič.
+
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.
 +
 
 +
[[Súbor:arduino_uno.jpg|400px|thumb|center|Vývojová doska ARDUINO-UNO.]]
  
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ARDUINO-UNO.]]
 
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
+
*[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Dokumentácia k doske Arduino UNO]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
+
*[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p]
  
  
Riadok 20: Riadok 21:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
Zapojila som maticovú klávesnicu, tak, že riadky sú pripojené na PC0-PC3 a stĺpce na PB0-PB3. Program hneď na začiatku vypíše '''''PRESS A KEY''''', potom 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.
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
[[Súbor:matic_klaves.jpg|400px|thumb|center|Schéma maticovej klávesnice.]]
  
Nezabudnite doplniť schému zapojenia!
 
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
 
 +
[[Súbor:schem_zap.png|400px|thumb|center|Schéma zapojenia maticovej klávesnice.]]
  
  
Riadok 35: Riadok 36:
  
 
<tabs>
 
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
<tab name="AVR C-code"><source lang="c" style="background: LightYellow;">
 +
#define BAUD 9600
 
#include <avr/io.h>
 
#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)
 
int main(void)
 
{
 
{
  unsigned int measuredValue;
+
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
 +
 +
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 ((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");
 +
}
 +
 +
else 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);
 +
}
 +
</source></tab>
 +
<tab name="uart.h"><source lang="c" style="background: LightYellow;">
  
  while (1)
+
void uart_init( void );
  {
+
   
    /* relax  */ 
+
void uart_putc( char c );
  }
+
void uart_puts( const char *s );
  
  return(0);
+
char uart_getc( void );
}
 
  
 
</source></tab>
 
</source></tab>
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
<tab name="uart.c"><source lang="c" style="background: LightYellow;">
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <util/setbaud.h>
  
void adc_init(void);                                   // A/D converter initialization
+
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;
 +
}
  
unsigned int adc_read(char a_pin);
 
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  
+
Kompletný projekt:  
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
+
Zdrojový kód: [[Médiá:projektHortenziaWollentova.rar|maticova klavesnica.rar]]
  
  
 
=== Overenie ===
 
=== Overenie ===
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.  
+
Na používanie našej aplikácie stačí maticová klávesnica a terminál, do ktorého bude vypisovať stlačené klávesy. Postup vykonania programu je opísaný v sekcii popis riešenia.  
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.  
+
Na konci uvádzam fotku záverečnej obrazovky po vypísaní všetkých 16 kláves a stlačení viacerých kláves naraz.
 +
 
 +
[[Súbor:zapojenie_klav.jpg|400px|thumb|center|Zapojenie.]]
 +
[[Súbor:term_klav.jpg|400px|thumb|center|Výpis znakov v termináli.]]
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
 
  
'''Video:'''
 
<center><youtube>_l02MBu41n0</youtube></center>
 
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Aktuálna revízia z 12:23, 8. jún 2023

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.

Vývojová doska ARDUINO-UNO.


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 hneď na začiatku vypíše PRESS A KEY, potom 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.

Schéma maticovej klávesnice.


Schéma zapojenia maticovej klávesnice.


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
						
			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 ((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");
				}
								
				else 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 vykonania programu je opísaný v sekcii popis riešenia. Na konci uvádzam fotku záverečnej obrazovky po vypísaní všetkých 16 kláves a stlačení viacerých kláves naraz.

Zapojenie.
Výpis znakov v termináli.