Operácie

Klávesnica 4x4 s radičom MH1KK1: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“
 
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
 
(14 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko'''
Záverečný projekt predmetu MIPS / LS2024 - '''Tomáš Štibrányi'''




== Zadanie ==
== Zadanie ==


Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
Zapojenie LCD obrazovky cez 4-bitové pripojenie a 4x4 membránovej maticovej klávesnice k vývojovej doske Arduino Uno.
 
[[Obrázok: ViestOBRArduino.jpg|400px|thumb|center|Vývojová doska Arduino UNO]]
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* https://www.openhacks.com/uploadsproductos/eone-1602a1.pdf Dokumentácia k doske Acrob] Katalógový list pre LCD modul 1602-A
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
* https://upload.wikimedia.org/wikipedia/commons/c/c9/Pinout_of_ARDUINO_Board_and_ATMega328PU.svg Pinout výstupy vývojovej dosky
 
* https://cdn.sparkfun.com/assets/f/f/a/5/0/DS-16038.pdf Katalógový list 4x4 membránovej maticovej klávesnice
 
__TOC__
__TOC__


== 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...
K vývojovej doske sme aj za pomoci breadboardu pripojili dve zariadenia. LCD display 1602A a membránovú klávesnicu 4x4. K lepšiemu rozoznaniu výstupných charakterov na obrazovke 16x2 sme pripojili 10KΩ potenciometer a po správnom zvolení odporu na výstup v0 sme po naladení mali možnosť rozoznávať znaky. LCD display sme pripojili len pomocou DB4 až DB7 pinoutov, nakoľko sme chceli 4-bitové pripojenie a týmto krokom sme ušetrili 4 pinouty na vývojovej doske. Overením cez sériovú linku sme zistili, že naše pripojenie membránovej klávesnice je správne a výstupom nášho projektu sú 2 možnosti, "Key" alebo "Write". Po stlačení klávesy 1 nám bolo umožnené zobrazovať stlačené klávesy ako výstup na LCD displayi. Po stlačení klávesy "2" môžeme písať znaky do rozpätia nášho displaya, čo je v našom prípade 32 znakov, po dosiahnutí tohto počtu sa obrazovka vymaže a kurzor nastaví na defaultnú pozíciu.
 
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
 
Nezabudnite doplniť schému zapojenia!


[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
[[Súbor:Pripojenie_stibranyi.jpg|400px|thumb|center|Pripojenie periférií]]




Riadok 34: Riadok 27:
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
// Definovanie LCD pinov
#define RS PD2
#define RW PD3
#define E  PD4
#define D4 PD5
#define D5 PD6
#define D6 PD7
#define D7 PB0
// Definovanie klávesnicových pinov
#define ROWS 4
#define COLS 4
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
uint8_t rowPins[ROWS] = {7, 6, 14, 15};
uint8_t colPins[COLS] = {16, 17, 19, 18};
// Function prototypes
void lcd_init(void);
void lcd_command(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_print(const char *str);
char klavesa(void);
void lcd_init(void) {
  // Set LCD pins as output
  DDRD |= (1 << RS) | (1 << RW) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6);
  DDRB |= (1 << D7);
  _delay_ms(20);
  lcd_command(0x02); // Inicializácia LCD displaya do 4-bitového režimu
  lcd_command(0x28);
  lcd_command(0x0C);
  lcd_command(0x06);
  lcd_command(0x01); // vyčistenie displaya
  _delay_ms(2);
}
void lcd_command(uint8_t cmd) {
  PORTD = (cmd & 0xF0) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_us(200);
  PORTD = ((cmd << 4) & 0xF0) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_ms(2);
}
void lcd_data(uint8_t data) {
  PORTD = (data & 0xF0) | (1 << RS) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_us(200);
  PORTD = ((data << 4) & 0xF0) | (1 << RS) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_ms(2);
}


int main(void)
void lcd_print(const char *str) {
{
  while (*str) {
   unsigned int measuredValue;
    lcd_data(*str++);
   }
}


   while (1)
char klavesa(void) {
  {
   for (uint8_t i = 0; i < COLS; i++) {
     /*  relax  */ 
    DDRB = (1 << colPins[i]);
    PORTB = ~(1 << colPins[i]);
    _delay_us(5);
    for (uint8_t j = 0; j < ROWS; j++) {
      if (!(PINB & (1 << rowPins[j]))) {
        return keys[j][i];
      }
     }
   }
   }
  return 0;
}
int main(void) {
  lcd_init();
  lcd_print("Press 1: Key");
  lcd_command(0xC0); // Nastavenie kurzora do 2 riadku
  lcd_print("Press 2: Write");


   return(0);
   while (1) {
    char key = klavesa();
    if (key == '1') {
      lcd_command(0x01); // vyčistenie displaya
      lcd_print("Key pressed: ");
      while (1) {
        key = klavesa();
        if (key) {
          lcd_command(0x8D); // Nastavenie kurzora na 13 pozíciu, čiže prvú v druhom riadku
          lcd_data(key);
        }
      }
    } else if (key == '2') {
      lcd_command(0x01); // vyčistenie displaya
      uint8_t cursorPosition = 0;
      while (1) {
        key = klavesa();
        if (key) {
          if (cursorPosition == 32) {
            lcd_command(0x01); // vyčistenie displaya
            cursorPosition = 0;
          }
          lcd_command(0x80 + cursorPosition); // Reset kurzora na pôvodnú pozíciu
          lcd_data(key);
          cursorPosition++;
        }
      }
    }
  }
  return 0;
}
}


</source></tab>
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
#include <avr/io.h>


void adc_init(void);                                  // A/D converter initialization


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'':


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
Zdrojový kód: [[Médiá:Stibranyi_mips.txt|Stibranyi_mips.txt]]




=== 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 overenie funkčnosti nášho projektu pripojíme Arduino UNO k počítaču. Opis funkčnosti sa nachádza v časti "Analýza  a opis riešenia". Po stlačení príslušných kláves je možné pozorovať výstup z membránovej klávesnice na LCD displayi.
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.  
 


[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]


'''Video:'''
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
<center><youtube>b2g9FMKdIc4</youtube></center>
<center><youtube>qEQL34As6n0</youtube></center>


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.  
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 15:31, 31. august 2024

Záverečný projekt predmetu MIPS / LS2024 - Tomáš Štibrányi


Zadanie

Zapojenie LCD obrazovky cez 4-bitové pripojenie a 4x4 membránovej maticovej klávesnice k vývojovej doske Arduino Uno.

Vývojová doska Arduino UNO

Literatúra:

Analýza a opis riešenia

K vývojovej doske sme aj za pomoci breadboardu pripojili dve zariadenia. LCD display 1602A a membránovú klávesnicu 4x4. K lepšiemu rozoznaniu výstupných charakterov na obrazovke 16x2 sme pripojili 10KΩ potenciometer a po správnom zvolení odporu na výstup v0 sme po naladení mali možnosť rozoznávať znaky. LCD display sme pripojili len pomocou DB4 až DB7 pinoutov, nakoľko sme chceli 4-bitové pripojenie a týmto krokom sme ušetrili 4 pinouty na vývojovej doske. Overením cez sériovú linku sme zistili, že naše pripojenie membránovej klávesnice je správne a výstupom nášho projektu sú 2 možnosti, "Key" alebo "Write". Po stlačení klávesy 1 nám bolo umožnené zobrazovať stlačené klávesy ako výstup na LCD displayi. Po stlačení klávesy "2" môžeme písať znaky do rozpätia nášho displaya, čo je v našom prípade 32 znakov, po dosiahnutí tohto počtu sa obrazovka vymaže a kurzor nastaví na defaultnú pozíciu.

Pripojenie periférií


Algoritmus a program

Algoritmus programu je....


#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

// Definovanie LCD pinov
#define RS PD2
#define RW PD3
#define E  PD4
#define D4 PD5
#define D5 PD6
#define D6 PD7
#define D7 PB0

// Definovanie klávesnicových pinov
#define ROWS 4
#define COLS 4
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
uint8_t rowPins[ROWS] = {7, 6, 14, 15};
uint8_t colPins[COLS] = {16, 17, 19, 18};

// Function prototypes
void lcd_init(void);
void lcd_command(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_print(const char *str);
char klavesa(void);

void lcd_init(void) {
  // Set LCD pins as output
  DDRD |= (1 << RS) | (1 << RW) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6);
  DDRB |= (1 << D7);
  _delay_ms(20);
  lcd_command(0x02); // Inicializácia LCD displaya do 4-bitového režimu
  lcd_command(0x28); 
  lcd_command(0x0C); 
  lcd_command(0x06); 
  lcd_command(0x01); // vyčistenie displaya
  _delay_ms(2);
}

void lcd_command(uint8_t cmd) {
  PORTD = (cmd & 0xF0) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_us(200);
  PORTD = ((cmd << 4) & 0xF0) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_ms(2);
}

void lcd_data(uint8_t data) {
  PORTD = (data & 0xF0) | (1 << RS) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_us(200);
  PORTD = ((data << 4) & 0xF0) | (1 << RS) | (1 << E);
  _delay_us(1);
  PORTD &= ~(1 << E);
  _delay_ms(2);
}

void lcd_print(const char *str) {
  while (*str) {
    lcd_data(*str++);
  }
}

char klavesa(void) {
  for (uint8_t i = 0; i < COLS; i++) {
    DDRB = (1 << colPins[i]);
    PORTB = ~(1 << colPins[i]);
    _delay_us(5);
    for (uint8_t j = 0; j < ROWS; j++) {
      if (!(PINB & (1 << rowPins[j]))) {
        return keys[j][i];
      }
    }
  }
  return 0;
}

int main(void) {
  lcd_init();
  lcd_print("Press 1: Key");
  lcd_command(0xC0); // Nastavenie kurzora do 2 riadku
  lcd_print("Press 2: Write");

  while (1) {
    char key = klavesa();
    if (key == '1') {
      lcd_command(0x01); // vyčistenie displaya
      lcd_print("Key pressed: ");
      while (1) {
        key = klavesa();
        if (key) {
          lcd_command(0x8D); // Nastavenie kurzora na 13 pozíciu, čiže prvú v druhom riadku
          lcd_data(key);
        }
      }
    } else if (key == '2') {
      lcd_command(0x01); // vyčistenie displaya
      uint8_t cursorPosition = 0;
      while (1) {
        key = klavesa();
        if (key) {
          if (cursorPosition == 32) {
            lcd_command(0x01); // vyčistenie displaya
            cursorPosition = 0;
          }
          lcd_command(0x80 + cursorPosition); // Reset kurzora na pôvodnú pozíciu
          lcd_data(key);
          cursorPosition++;
        }
      }
    }
  }
  return 0;
}


Zdrojový kód: Stibranyi_mips.txt


Overenie

Na overenie funkčnosti nášho projektu pripojíme Arduino UNO k počítaču. Opis funkčnosti sa nachádza v časti "Analýza a opis riešenia". Po stlačení príslušných kláves je možné pozorovať výstup z membránovej klávesnice na LCD displayi.


Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.