Klávesnica 4x4 s radičom MH1KK1: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(13 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 4: | Riadok 4: | ||
== Zadanie == | == Zadanie == | ||
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: | |||
'''Literatúra:''' | '''Literatúra:''' | ||
* | * https://www.openhacks.com/uploadsproductos/eone-1602a1.pdf Dokumentácia k doske Acrob] Katalógový list pre LCD modul 1602-A | ||
* | * 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 == | ||
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: | [[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); | |||
} | |||
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; | |||
} | } | ||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá: | |||
Zdrojový kód: [[Médiá:Stibranyi_mips.txt|Stibranyi_mips.txt]] | |||
=== Overenie === | === Overenie === | ||
Na | 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:''' | '''Video:''' |
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.
Literatúra:
- https://www.openhacks.com/uploadsproductos/eone-1602a1.pdf Dokumentácia k doske Acrob] Katalógový list pre LCD modul 1602-A
- 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
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.
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.