Powrót

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 .

Rysunek 1

W programie przyłączenie klawiatury jest określone w elastyczny sposób, z wykorzystaniem mechanizmu #define – szczegóły przedstawia rysunek 2.

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.

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.