Operácie

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

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 157: Riadok 157:
}
}


</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>
</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á:Stibranyi_mips.txt|Stibranyi_mips.txt]]
Zdrojový kód: [[Médiá:Stibranyi_mips.txt|Stibranyi_mips.txt]]

Verzia z 15:16, 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 R3

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í

Nezabudnite doplniť schému zapojenia!

Schéma zapojenia LCD displeja.


Algoritmus a program

Algoritmus programu je....


<tabs> <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">

  1. include <avr/io.h>
  1. include <avr/io.h>
  2. include <util/delay.h>
  3. include <stdio.h>

// Definovanie LCD pinov

  1. define RS PD2
  2. define RW PD3
  3. define E PD4
  4. define D4 PD5
  5. define D5 PD6
  6. define D6 PD7
  7. define D7 PB0

// Definovanie klávesnicových pinov

  1. define ROWS 4
  2. 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.

Aplikácia.

Video:

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