Elektronika, ukázky pro STM8S103F3, plus programování v assembleru.


Displej 1602A-1

LCD 16x2 a 20x4 s I2C řadičem HD44780

LCD 16 x 2

Displej 1602A-1 (16x2 LCD a 20x4 LCD s řadičem HD44780) lze velmi pohodlně připojit přes I2C expandér PCF8574, protože ten mapuje osm bitů na datové/vlastní řídicí piny LCD. Na STM8 se to dělá buď v C (pomocí knihovny SPL/STDPeriph, či Arduino-SDuino), nebo jako zde, přímo v assembleru.
Adresa PCF8574 je:0x27 (PCF8574A) nebo 0x20 (PCF8574). Protože LCD s PCF8574 je pro 4bit mód, musí se každý byte posílat ve dvou polovinách: horní nibble + spodní nibble, přičemž se manipuluje s bity RS, EN a bitem pro podsvícení.
Adresu PCF8574_ADDR pro zápis nutno upravit podle modulu (0x27 << 1 = 0x4E, nebo 0x20 << 1 = 0x40). Čekací smyčky jsou orientačně spočítané pro CPU 16 MHz. Pro nižší rychlosti CPU bude třeba zpoždění zkrátit, jinak bude displej zobrazovat pomalu. Pokud máte jinou desku STM8 (např. STM8S105), registry I2C jsou stejné. Funkce pro LCD potřebují pět byte z paměti RAM.

Fukce LCD dostupné s programu níže (jako Arduino knihovna LiquidCrystal_I2C)
  • begin_lcd analogický metodě begin() z Arduino knihovny
  • char_lcd analogický metodě print(char) z Arduino knihovny
  • string_lcd analogický metodě print(char[]) z Arduino knihovny
  • clear_lcd analogický metodě clear() z Arduino knihovny vymaže obrazovku
  • home_lcd analogický metodě home() z Arduino knihovny kurzor na začátek
  • pos_lcd analogický metodě setCursor() z Arduino knihovny kurzor na pozici
  • cur_lcd analogický metodě cursor() z Arduino knihovny zobrazí kurzor
  • nocur_lcd analogický metodě noCursor() z Arduino knihovny skryje kurzor
  • blink_lcd analogický metodě blink() z Arduino knihovny kurzor bliká
  • noblink_lcd analogický metodě noBlink() z Arduino knihovny kurzor nebliká
  • light_lcd analogický metodě backgroud() z Arduino knihovny zapne podsvícení
  • nolight_lcd analogický metodě noBackgroud() z Arduino knihovny vypne podsvícení

U begin_lcd begin() se nezadává, jestli jde o 16x2, nebo 20x4. Důležité je tam nastavení na čtyřbitový přenos dat a font 5x8.
Procedura char_lcd pošle jeden znak umístěný v akumulátoru a string_lcd zobrazí řetězec ukončený nulou, z adresy v registru X. U pos_lcd setCursor() se řádek a pozice zadává v akumulátoru, kde bity 7-5 určují řádek a bity 4-0 sloupec. Tři bity pro řádek teoreticky umožňují zadání celkem osmi řádků a pět bitů pro sloupec třicet dva pozic.

parametr v A pro pos_lcd    7    6    5    4       3    2    1    0
                           (0)   r    r    sl      sl   sl   sl   sl
Ostatní procedury nemají žádné parametry.

Zdrojový kód ukázky:

Modul pro LCD 16x2 a 20x4

LCD displej je poměrně často používané zařízení (alespoň u mne), takže jsem pro něj napsal samostatný modul, který se dá připojit do projektu. Na začátku jsou deklarovány funkce displeje v části public:

  • begin_lcd inicializace LCD displeje
  • char_lcd odešle znak obsažený v akumulátoru (A)
  • string_lcd odešle znaky z adresy v registru X
  • clear_lcd vymaže zobrazené znaky
  • home_lcd nastaví kurzor na začátek
  • pos_lcd nastaví pozici kurzoru podle akkumulátoru
  • cur_lcd zobrazí kurzor
  • nocur_lcd skryje kurzor
  • blink_lcd zapne blikání kurzoru
  • noblink_lcd vypne blikání kurzoru
  • light_lcd zapne podsvícení displeje
  • nolight_lcd vypne podsvícení displeje
U funkce pos_lcd bity v akumulátoru 7-5 určují řádek (r) a bity 4-0 sloupec (sl):
parametr v A pro pos_lcd    7    6    5    4       3    2    1    0
                           (0)   r    r    sl      sl   sl   sl   sl
V prostředí ST visual develop, v okně workspace ve stromu projektů, do větve Source files, se pak musí přidat soubor s modulem LCD níže. V hlavním souboru projektu je pak nutno deklarovat volané funkce displeje jako externály (extern).

Zdrojový kód samostatného modulu:

Příklad volání modulu LCD z hlavního souboru (na začátku nezapomenout inicializovat sběrnici I2C):

...
; externaly pro pripojeny modul LCD - 16x2, nebo LCD 20x4

          extern begin_lcd, char_lcd, string_lcd, clear_lcd, home_lcd
          extern pos_lcd, cur_lcd, nocur_lcd, blink_lcd, noblink_lcd
          extern light_lcd, nolight_lcd
...

;-- init i2c a displeje  --------------------------------------------

               clr    I2C_CR1         ; init i2c
               ld     a, #16
               ld     I2C_FREQR, a
               ld     a, #80          ; CCR = 80 - 100 kHz
               ld     I2C_CCRL, a
               clr    I2C_CCRH
               ld     a, #17          ; TRISE = 16+1
               ld     I2C_TRISER, a
               bset   I2C_CR1, #0     ; PE=1

               call   begin_lcd         ; inciaklizace LCD

;-- hlavni smycka LOOP -----------------------------------------------

infinite_loop.l
               call   clear_lcd         ; vymaz obrazovku
               call   light_lcd         ; rozsvit
               
               ldw    x, #text1a        ; prvni radek
               call   string_lcd
               
               ld     a, #$21           ; 2.radek 2.pos 0010 0001
               call   pos_lcd           ;                rrp pppp
               ldw    x, #text2a        ; druhy radek
               call   string_lcd
...


všeobecné informace

U modulů, které jsem v rámci svých možností odladil a otestoval, jsem vytvořil prográmek, který lze formou copy-paste vytáhnout (buď celý, nebo pouze potřebné kusy kódu) a použít jej v nějaké Vaší aplikaci. Zkopírovat se musí potřebný kód, proměnné v paměti a deklarace konstant (equ).

Na stránkách výrobce ST Microelectronics je ke stažení vývojové prostředí ST Visual develop a dále jsou zde velmí podrobné manuály v PDF (v angličtině) odledně popisu mikrokontroléru a jeho instrukčního souboru.

Každý zde uváděný zdroják má stejnou strukturu. Na začátku jsou deklarace adres použitých systémových registrů (UART, I2C, GPIO...), což je klíčové. Tyto adresy jsou popsány jednak v datasheetu STM8, a také jsou k dispozici ve zdrojovém kódu, který je nainstalován spolu s prostředím ST Visual develop ve složce [Program Files]\ STMicroelectronics\ st_toolset\ asm\ include\ STM8S103F.asm). Asi je možné ji deklarovat jako include, ale zde jsou ve zdrojáku definovány pouze ty, které jsou použity.
Dále je inicializační část, kde je vynulována paměť ram, nastaví se rychost CPU a proběhne základní nastavení použitého hardware, například rychlost UARTu, GPIO input/output, atd. Pak už následují rutiny pro konkrétní modul.V nekonečné smyčce infinite_loop je ukázka činnosti. Samotné rutiny lze podle potřeby vykopírovat do jiného projektu. Úplně na konci je tabulka vektorů přerušení v segmentu vectit s popisy, které zařízení může přerušení vyvolat.

Rychlý návod jak vytvořit nový projekt v prostředí ST Visual Dvelop:
  • V Hlavním menu vybrat File a New workspace.
  • Zvolit položku Create workspace and project
  • Objeví se dialog pro zadání skupiny projektů.
  • Vyplňte pole workspace filename (název skupiny projektů)
  • Vyyplňte pole workspace location (složka pro umístění)
  • Naskočí další okno pro projekt.
  • Vyplňte pole project filename (název projektu)
  • Vyplňte pole project location (složka pro umístěni projektu, zde doporučuji vybrat podsložku skupiny projektů).
  • Do pole toolchain vyberte ST Assembler Linker.
  • Pole toolchain root ponechte nezměněno.
  • Naběhne výběr pro konkrétní CPU.
  • Vyberte v něm STM8S103F3P.

Tím se vytvoří projekt. Na levé straně se objeví strom Workspace, kde ve větvi source files otevřete main.asm, které je hlavní zdroják projektu. Je předvyplněn o počáteční definici segmentů a tabulku přerušení. Můžete jej vyčistit a pak do něj přes copy-paste (CTRL+A - CTRL+C -> CTRL+V) vložit některé s zde uváděných mých (nebo Vašich) zdrojáků. Soubory mapping.asm a mapping.inc systém vytvořil automaticky a není doporučeno do nich zasahovat, protože systém je interně přepisuje. Do téhož workspace můžete vkládat více projektů, každý však musí mít svou složku.
Do existujícího workspace pak lze přidávat libovolný počet projektů, pomocí pravého tlačítka myši na kořenové (nejvyšší) větvi stromu "workspace". Podmínkou je, aby každý projekt byl v samostatné složce (adresáři). Do podvětví source files, nebo include files, každého projektu se mohou přidávat další moduly. Další podrobnosti ohledně práce v prostředí ST Visual develop je v tomto manuálu (anglicky).

Nahrání (vypálení) programu do modulu:

RTC Především připojte k modulu vývojové desky STM8S103F3 programátor ST-Link. K tomu jsou určeny čtyři piny na desce vpravo: 3V3, SWIM, GND a NRST (viz obrázek vlevo).
Program lze vypálit přímo z prostředí "ST Visual Dvelopu" takto: v hlavním menu vyberte Build - Build (F7). Pokud překlad a sestavení proběhhne bez chyb, spusťte Debug - Start debugging. Tím se projekt nahraje (vypálí), naskočí okno debuggeru a případně můžete projekt spustit (F5), nebo krokovat (F10).
Vypálit program do STM8 se dá i jednodušeji pomocí ST Visual Programmer, pokud máte k dispozici již "visual developem" přeložený soubor (F7-build, viz výše) *.s19. Tento vznikne v podsložce projektu DEBUG, nebo RELEASE. Otevřete jej přes hlavní menu-File-Open a přes hlavní menu-Program-Current tab program vypálíte. Případně ještě můžete správnost vypálení ověřit pomocí hlavní menu-Verify-Current tab. Další podobnosti odhledně používání ST Visual Programmeru jsou v jeho nápovědě: hlavní menu-Help-Index.

Dúležité upozornění: Zde presentovaný modul mikrokontroléru má výstupy 5V, 3V3 a GND. Na výstupu 5V ve skutečnosti není 5 voltů, ale vstupní napětí, kterým celý tento modul napájíte, buď přes piny +/-, nebo přes konektor mikroUSB, což může být 4.5 - 15V. Buďte opatrní, co k tomu pinu (5V) připojíte, připojovaný modul můžete tímto zničit. Doporučuji modul napájet výhradně z 5V zdroje.

Vzkazník - dotazy, názory, připominky, hlášení chyb, atd:
případný E-mail nebude nikde zveřejněn, uveďte jej, pouze pokud si přejete odpověď.

Elektronika, ukázky pro Arduino a STM8, plus programování v Delphi (Lazarusu).
Všechna zapojení modulů v ukázkách (viz elektrická schémata) pracují s velmi malým napětím 3.3V až 12V a neobsahují návod na napájecí zdroj. Pokud se rozhodnete některé z těchto zařízení postavit, důrazně doporučuji používat zdroje s výstupním napětím maximálně 12V, podle schválených norem platných v ČR. Autor návodů za případné škody nepřebírá žádnou odpovědnost.
nahoru

(c) 2026 iisivak.xf.cz