Klik oraz dwuklik
Wszyscy znamy pojęcie kliku oraz dwukliku, choćby dlatego, że tego wynalazku używa każdy system operacyjny z graficznym interfejsem. Czy coś takiego da się zrealizować w środowisku prostych mikrokontrolerów? Da się i nie jest to skomplikowane.
Standardowa myszka komputerowa ma dwa przyciski określane jako przycisk lewy i prawy. Pojedyncze kliknięcie generuje określone polecenie dla systemu komputerowego. Szybkie dwa kliknięcia, określane jako dwuklik, komputer interpretuje jako odmienne polecenie. A gdyby tak zrobić „dziwną” myszkę ograniczoną jedynie do przycisków, o większej liczbie przycisków (przykładowo czterech), gdzie można by każdym kliknąć, czyli wykonać pojedyncze naciśnięcie oraz wykonać dwuklik, ale w dowolnej kombinacji (klasyczny dwuklik dotyczy tego samego przycisku). Do realizacji tego projektu jest użyty moduł obsługi klawiatury (opisany w ramach Mikroprocesorowej oślej łączki w ZE 9/2025). To rozwiązanie zostało celowo zaprojektowane w taki sposób, by było elastyczne i żeby łatwo można je było adaptować do różnorodnych zastosowań, bez jakichkolwiek modyfikacji samego modułu obsługi klawiatury. W projekcie został również wykorzystany moduł po raz pierwszy opisany w artykule Generowanie dźwięków w ZE 8/2025 przeznaczony do obsługi zdarzeń zakolejkowanych w czasie.
Standardowa obsługa klawiatury o 4 przyciskach
Do tego projektu oprócz samej klawiatury niezbędny jest moduł alfanumerycznego wyświetlacza LCD. Cały schemat pokazuje rysunek 1 .
W programie przyłączenie klawiatury jest określone w elastyczny sposób, z wykorzystaniem mechanizmu #define – szczegóły przedstawia rysunek 2.
Istotne elementy związane z obsługą klawiatury prezentuje listing 1:
#define StandKey0Code 0x10
#define StandKey1Code 0x11
#define StandKey2Code 0x12
#define StandKey3Code 0x13
#define StandEncodeTabeSize 4
static const KeybEncodeElementT StandEncodeTabe [ StandEncodeTabeSize ] PROGMEM =
{ /* 00 */ { 0xFE , StandKey0Code } ,
/* 01 */ { 0xFD , StandKey1Code } ,
/* 02 */ { 0xFB , StandKey2Code } ,
/* 03 */ { 0xF7 , StandKey3Code } } ;
uint8_t HardwareKeybRead ( void )
{
uint8_t KeybData ;
uint8_t Mask ;
KeybData = KbdInputPort ;
Mask = ~ ( ( 1 << KbdPin1 ) | ( 1 << KbdPin2 ) | ( 1 << KbdPin3 ) | ( 1 << KbdPin4 ) ) ;
return ( KeybData | Mask ) ;
} /* HardwareKeybRead */
static void EnvirInit ( void )
{
uint8_t Bits ;
Bits = KbdConfigPort ;
Bits &= ~ ( 1 << KbdPin1 ) ;
Bits &= ~ ( 1 << KbdPin2 ) ;
Bits &= ~ ( 1 << KbdPin3 ) ;
Bits &= ~ ( 1 << KbdPin4 ) ;
KbdConfigPort = Bits ;
KbdConfigPort2 = ( 1 << KbdPin1 ) | ( 1 << KbdPin2 ) |
( 1 << KbdPin3 ) | ( 1 << KbdPin4 ) ;
InitLCDEnvir ( ) ;
} /* EnvirInit */
int main ( void )
{
( . . . )
EnvirInit ( ) ;
( . . . )
KbdInstance = KeybInitInstance ( ( PtrMatrixKeybInstanceType ) 0 ,
HardwareKeybRead , ( HardwSetRowServiceProcT ) 0 , 0 ) ;
AddEncodeTableStandardMode ( KbdInstance , 0 , StandEncodeTabe ) ;
SetKeybMode ( KbdInstance , StandardPressMode ) ;
( . . . )
} /* main */
Znaczenie poszczególnych instrukcji wyjaśnia rysunek 3.
Konfiguracja środowiska mikrokontrolera, gdzie jest przyłączona klawiatura (EnvirInit) określa odpowiedni port jako wejście bez modyfikacji kierunku pracy portu dla pozostałych jego wyprowadzeń z jednoczesnym włączeniem wbudowanych w mikrokontroler rezystorów pull-up. W sytuacji, gdy przycisk nie jest naciśnięty, wymuszany jest stan logicznej jedynki (zwalnia to z użycia zewnętrznych rezystorów podciągających). W funkcji main występują wywołania funkcji określających szczegóły związane z obsługą klawiatury. Przede wszystkim do modułu jej obsługi dołączona jest tabela przekodowań (zamieniająca bitowe kombinacje generowane przez naciśnięte przyciski na użyteczne w programie kody znaków ASCII, choć w tym przypadku mogą to być dowolne liczby 8-bitowe, jedyny wymóg dotyczy ich unikalności). Dodatkowo ustalony jest najprostszy tryb obsługi klawiatury (możliwy jest przykładowo wariant z autorepetycją, lecz w obecnym zastosowaniu ta możliwość nie jest pożądana).
(…)
——– ciach! ——–
To jest tylko fragment artykułu, którego pełna wersja ukazała się w październikowym numerze czasopisma Zrozumieć Elektronikę (ZE 10/2026). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 10/2026 znajduje się tutaj.
Andrzej Pawluczuk
apawluczuk@vp.pl
Uwaga! Wskazówki, jak nabyć pełne wersje dowolnych numerów ZE znajdują się na stronie:
https://piotr-gorecki.pl/n11.


