Desky Evb Display a Evb Keyboard



Podobné dokumenty
9. Rozšiřující desky Evb_Display a Evb_keyboard

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky. Aplikace mikroprocesorů.

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 8

Modul LCD displeje se čtyřmi tlačítky. Milan Horkel

Ovládání LCD. Ing. Josef Grosman. TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií

SEMESTRÁLNÍ PROJEKT Y38PRO

Komunikace modulu s procesorem SPI protokol

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky. Aplikace mikroprocesorů KROKOVÝ MOTOREK

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

SIC1602A20. Komunikační protokol

Modul řízení otáček stejnosměrného motorku

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

FREESCALE TECHNOLOGY APPLICATION

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Fakulta informačních technologií

Razer Deathstalker česká příručka

Česká příručka. Seznam: Obsah balení a systémové požadavky:

TW15 KONCOVÝ PRVEK MSKP. Popis výrobku Technická data Návod k obsluze. Technologie 2000 s.r.o., Jablonec nad Nisou

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Česká příručka. Seznam: Obsah balení a systémové požadavky:

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 11

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

15. Projekt Kalkulačka

Rozšiřující desce s dalšími paralelními porty Rozšiřující desce s motorkem Elektrickém zapojení Principu činnosti Způsobu programování

Mikropočítačová vstupně/výstupní jednotka pro řízení tepelných modelů. Zdeněk Oborný

Česká příručka. Seznam: Obsah balení a systémové požadavky:

Uživatelská příručka

Společnost pro elektronické aplikace. SEA s.r.o. Dolnoměcholupská 21 CZ Praha 10

Cvičení 2. Obsah a cíle cvičení. Obsah. A5MPL Programování mikropočítačů Digitální vstupy a výstupy - LED a tlačítka.

Programování mikropočítačů platforma Arduino

EMULÁTOR PS/2 KLÁVESNICE

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

- jak udělat konstantu long int: L long velka = 78L;

Výuková laboratorní sestava seminář pro učitele

Struktura programu v době běhu

Razer Orbweaver česká příručka

RAZER HUNTSMAN ELITE

KNIHOVNA LETNI_CAS. edice verze 1.0. Knihovna letni_cas. Ing. Zdeněk Rozehnal MICROPEL s.r.o. 2008

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

TMU. USB teploměr. teploměr s rozhraním USB. měření teplot od -55 C do +125 C. 26. května 2006 w w w. p a p o u c h. c o m

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Razer Abyssus česká příručka

POKLADNÍ DISPLEJ LCD. hotline: strana 1

MS Excel makra a VBA

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Školní kolo soutěže Baltík 2009, kategorie C

Česká příručka. Seznam: Obsah balení a systémové požadavky:

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Popis funkcí a parametrů programu. Reliance External communicator. Verze 1.5.0

Programovací jazyk Pascal

Postupy práce se šablonami IS MPP

Projekt: Přístupový terminál

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Analyzátor sériového rozhraní RSA1B

Knihovna RecDBXLib ZÁZNAMY V DATABOXU TXV

Popis programu EnicomD

POZOR!!! INSTALACE POD WINDOWS 200 / XP / VISTA PROBÍHÁ VE DVOU ETAPÁCH A JE NUTNÉ DOKON

Úvod do filtrace, Quick filtr

PROGRAMOVÁNÍ V C++ CVIČENÍ

NÁVOD K OVLÁDÁNÍ PÁLÍCÍHO STROJE A ŘÍDÍCÍHO SYSTÉMU RIPAST 401

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Digitální tlačítkové moduly pro DUO systém TD2100MA

Razer Deathstalker Chroma česká příručka

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

1. Otevřete dokument, který chcete číst. 2. Na kartě Zobrazení klikněte ve skupině Zobrazení dokumentů na položku Čtení na celé obrazovce.

Konfigurátor Duo. Manuál pro konfiguraci systémů DUO Standard / Basic. Obsah + vybraná nastavení: - 1 -

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Příloha č. I: Schéma zapojení vývojové desky PVK-PRO

PCKEYB JEDNOTKA PRO OBSLUHU KLÁVESNICE TYPU PC AT. Příručka uživatele a programátora

Operační systémy. Cvičení 4: Programování v C pod Unixem

TCP-Wedge ZDARMA. Přidává podporu TCP/IP: Sběr dat z adres portu IP na libovolné síti TCP/IP - ethernet / internet.

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

1. Vkládání čísel a základní funkce DO

HPS-120. Manuál nastavení bezdrátového modemu

INTERFACE GSM VT-GSM-007

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Ovladač příslušenství - XbusTCO

2.4 Cykly 2. ZÁKLADY JAZYKA C

SW24x3 programovatelné relé

Ares 10/12 První spuštění

Návrh konstrukce odchovny 3. dil

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Spinelterminal. Terminálový program pro ladění aplikací s protokolem Spinel. 20. září 2005 w w w. p a p o u c h. c o m v

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

RAZER ABYSSUS ESSENTIAL

1. Univerzální watchdog WDT-U2

PRT3 tiskový modulu manuál pro EVO ústředny

Návod pro práci s aplikací

Micro:bit lekce 4. Cyklus s určeným počtem opakování cyklus Repeat. Cyklus s počtem opakování daným řídicí proměnnou cyklus For from to

PicoBlaze lekce 4: Aplikace pro výuku asembleru procesoru PicoBlaze Jiří Svozil, Jaroslav Stejskal, Leoš Kafka, Jiří Kadlec

Gabriela Janská. Středočeský vzdělávací institut akademie J. A. Komenského

Transkript:

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky Aplikace mikroprocesorů Desky Evb Display a Evb Keyboard Návod k použití Lukáš Lahoda 2010

Obsah 1 DESKA EVB DISPLAY... 2 1.1 PROPOJENÍ DESKY EVB IO S DESKOU EVBHCS08... 2 1.2 KOMUNIKACE S DISPLEJEM... 3 1.3 INICIALIZACE DISPLEJE... 3 1.4 ODESÍLÁNÍ PŘÍKAZŮ A ZANKŮ NA DIPLEJ... 4 1.5 DOSTUPNÉ PŘÍKAZY... 4 1.6 PODSVÍCENÍ DISPLEJE... 4 1.7 PROGRAMOVÝ PRACOVNÍ RÁMEC PRO DISPLEJ... 5 1.7.1 Funkce pro čekání... 5 1.7.2 Definice konstant... 5 1.7.3 Funkce pro odeslání bajtu... 6 1.7.4 Funkce pro odeslání příkazu/znaku... 6 1.7.5 Funkce pro výběr řádku... 7 1.7.6 Fukce pro inicializaci displeje... 7 1.7.7 Funkce pro odeslání řetězce nebo matice znaků na displej... 8 2 DESKA EVB KEYBOARD... 9 2.1 PROPOJENÍ DESKY EVB IO S DESKOU EVBHCS08... 9 2.2 PROGRAMOVÝ PRACOVNÍ RÁMEC PRO KLÁVESNICI... 10 2.2.1 Definice konstant... 10 2.2.2 Funkce pro detekci stisku klávesy... 10 3 UKÁZKOVÝ PROGRAM HAD... 13 4 LITERATURA... 16 1

1 Deska Evb Display Deska Evb Display je osazena čtyřřádkovým LCD displejem, délka každého řádku je 16 znaků. Schéma displeje uvádí obr. 1. Jak je na schématu vidět, samotný displej je ve skutečnosti složen ze dvou dvouřádkových displejů. V praxi to má své důsledky, a sice že třetí řádek je prodloužením prvního a čtvrtý řádek druhého řádku. Pokud tedy zapisujeme znaky na první řádek, tak po jeho zaplnění skočí kurzor na řádek č. 3, pak na řádek č. 2 a nakonec na řádek č. 4. Na to je nutné v programu pamatovat. Obr. 1. Schéma desky Evb Display 1.1 Propojení desky Evb IO s deskou EvbHCS08 Desku Evb Display je možné ovládat přes desku Evb HCS08. Obě desky je nutné propojit přes paralelní port za pomoci plochého desetižilového kabelu, který naleznete v laboratoři. V tomto návodu budeme dále předpokládat, že propojení je realizováno přes port PTB 1 desky EvbHCS08. Po propojení můžete přes piny portu PTB (PTB0 až PTB7) přistupovat k pinům displeje. Tabulka tab. 1 uvádí, jak jsou si piny vzájemně přiřazeny. V tabulce je uveden i význam pinů displeje. 1 POZOR! Na deskách EvbHCS08 přítomných v laboratoři AL02 je prohozeno označení portů PTA a PTB! 2

Tab. 1. Přiřazení bitů displeje bitům portu PTB a jejich význam PTB displej význam PTB0 RS určuje, zda je zadáván znak, nebo příkaz PTB1 RW určuje, zda se bude číst, nebo zapisovat PTB2 E povoluje přístup k bitům D4 D7 PTB3 LED podsvícení displeje PTB4 D4 příjem 0. a 4. bitu znaku PTB5 D5 příjem 1. a 5. bitu znaku PTB6 D6 příjem 2. a 6. bitu znaku PTB7 D7 příjem 3. a 7. bitu znaku 1.2 Komunikace s displejem Komunikace s displejem je řízena bity RS, RW a E a probíhá pomocí bitů D4 D7, přes které můžeme odesílat řídicí příkazy, nebo znaky. O tom, zda se jedná o příkaz, nebo znak, rozhoduje hodnota bitu RS (0 příkaz, 1 znak). 1.3 Inicializace displeje Abychom mohli zahájit komunikaci s displejem, musíme nejprve (1x na začátku programu) odeslat sérii výrobcem definovaných příkazů. Inicializace probíhá v následujících krocích 1) Nastavení všech pinů portu PTB pro zápis 2) Nastavit bit RS na 0 a zbývající bity na 1 3) Nastavit bit RS na 1 a zbývající bity na 0 4) Odeslat na displej příkazy v pořadí dle tab. 2. Postup pro odeslání příkazu je uveden v odst. 1.4. Tab. 2. Inicializační příkazy displeje pořadí hodnota bin hodnota hex 1 0b00000011 0x03 2 0b00000011 0x03 3 0b00000011 0x03 4 0b00000010 0x02 5 0b00101000 0x28 6 0b00001000 0x08 7 0b00000001 0x01 8 0b00000110 0x06 9 0b00101000 0x28 10 0b00001100 0x0C 11 0b00000110 0x06 12 0b00001100 0x0C 3

1.4 Odesílání příkazů a znaků na displej Pro odeslání znaku či příkazu na displej je nutné dodržet následující postup: 1) bit RW nastavit na 0 (= zápis) 2) bit RS nastavit na 0, jedná-li se o příkaz, nebo na 1, jedná-li se o znak 3) bit E nastavit na 1 4) zápis horních 4 bitů bajtu 5) bit E nastavit na 0 6) bit E nastavit opět na 1 7) zápis dolních 4 bitů bajtu 8) bit E nastavit na 0 Na displeji je možné zobrazit znaky ASCII kódu 32 127. 1.5 Dostupné příkazy V tab. 2 jsou uvedeny příkazy, které je možné při práci s displejem použít. Tab. 3. Dostupné příkazy pro displej hodnota 0b00000001 0b00001000 0b00000001 0b10000000 0b11000000 0b10000001 0b10010000 0b11010000 0b00001100 0b00001101 0b00001110 0b00001111 význam zapne displej vypne displej smaže obsah displeje nastaví kurzor na začátek prvního řádku nastaví kurzor na začátek druhého řádku nastaví kurzor na 2.pozici prvního řádku (přičtením požadovaného čísla k příkazu 0b10000000 můžete kurzor nastavit na libovolnou pozici) nastaví kurzor na začátek třetího řádku (1. řádek + 16 pozic) nastaví kurzor na začátek čtvrtého řádku (2. řádek + 16 pozic) kurzor neviditelný kurzor podtržítko bliká kurzor plný kurzor plný bliká 1.6 Podsvícení displeje Nastavením bitu LED na 1 se rozsvítí LED podsvícení displeje. Zápisem 0 naopak zhasne. 4

1.7 Programový pracovní rámec pro displej Abychom mohli jednoduše ovládat displej, tj. přistupovat k jednotlivým řádkům, zapisovat znaky, řetězce nebo matice znaků, vytvoříme si v prostředí CodeWarrior několik funkcí, které tyto činnosti budou zajišťovat. Funkce můžete umístit do samostatných souborů, které uložíte do složky Sources v pracovním adresáři projektu. Tyto soubory poté nalinkujete do souboru main.c pomocí direktivy #include "vas_soubor.c". Všechny funkce musí být do souborů umístěny ve stejném pořadí, v jakém jsou uváděny v tomto návodu. 1.7.1 Funkce pro čekání Mezi jednotlivými příkazy je vždy nutné ponechat displeji čas na jejich zpracování. Vytvořte soubor wait.c a umístěte do něj následující 2 funkce, které umožňují realizovat časovou prodlevu volitelné délky. void wait() { unsigned int j; for (j=0;j<200;j++) { RESET_WATCHDOG(); void waitmore(unsigned int times) { unsigned int i; for (i=0;i<times;i++) { wait(); 1.7.2 Definice konstant V souboru main.c definujte následující konstanty představující bity displeje. Nalinkování externích souborů proveďte až po definici těchto konstant. #include <hidef.h> #include "derivative.h" //... #define RS #define RW #define E #define LED #define D4 #define D5 #define D6 #define D7 PTBD_PTBD0 PTBD_PTBD1 PTBD_PTBD2 PTBD_PTBD3 PTBD_PTBD4 PTBD_PTBD5 PTBD_PTBD6 PTBD_PTBD7 #include "wait.c" #include "disp.c" //... Vytvořte si soubor disp.c ve složce Sources a umístěte do něj tyto dvě konstanty představující počet řádků a délku řádku displeje. Do tohoto souboru umisťujte i funkce pro displej (viz dále). #define disprowcount 4 #define dispcolcount 16 5

1.7.3 Funkce pro odeslání bajtu Nejprve vytvořte funkci dispsend() pro odeslání jednoho bajtu. Funkce přejímá bajt v podobě argumentu typu unsigned char a následně odešle na displej nejdříve horní a poté dolní 4 bity. void dispsend (unsigned char byte) { E=1; D4=(byte&0b00010000)>>4; D5=(byte&0b00100000)>>5; D6=(byte&0b01000000)>>6; D7=(byte&0b10000000)>>7; E=0; E=1; D4=(byte&0b00000001)>>0; D5=(byte&0b00000010)>>1; D6=(byte&0b00000100)>>2; D7=(byte&0b00001000)>>3; E=0; wait(); 1.7.4 Funkce pro odeslání příkazu/znaku Ve funkci dispsend() jsme neurčili, odesíláme-li příkaz, nebo znak. Pro odeslání příkazů a znaků vytvoříme 2 zvláštní funkce, které přejmou bajt ve formě argumentu, nastaví bity RS a RW a předají funkci dispsend() bajt k odeslání. Nejdříve vytvořte funkci dispcommand() pro odeslání příkazu void dispcommand (unsigned char command) { RW=0; RS=0; dispsend(command); a poté funkci dispchar() pro odeslání znaku. Funkce kontroluje povolený ASCII rozsah. void dispchar (unsigned char character) { if (character<32 character>127) return; RW=0; RS=1; dispsend(character); 6

1.7.5 Funkce pro výběr řádku Vytvořte funkci dispsetrow() pro nastavení kurzoru na začátek řádku, jehož číslo se bude předávat přes argument funkce. void dispsetrow (unsigned int row) { switch(row) { case 1: dispcommand(0b10000000); case 2: dispcommand(0b11000000); case 3: dispcommand(0b10000000+dispcolcount); case 4: dispcommand(0b11000000+dispcolcount); 1.7.6 Funkce pro inicializaci displeje Na začátku programu musíte displej inicializovat odesláním série příkazů. Funkci dispinit() zavolejte vždy na začátku funkce main(). Přidejte navíc funkci dispclear(), která odesílá příkaz na smazání displeje. void dispclear() { dispcommand(0b00000001); void dispinit() { PTBDD=0b11111111; PTBD=0b11111110; PTBD=0b00000001; dispcommand(0b00000011); //0x03 dispcommand(0b00000011); //0x03 dispcommand(0b00000011); //0x03 dispcommand(0b00000010); //0x02 dispcommand(0b00101000); //0x28 dispcommand(0b00001000); //0x08 dispcommand(0b00000001); //0x01 dispcommand(0b00000110); //0x06 dispcommand(0b00101000); //0x28 dispcommand(0b00001100); //0x0C dispcommand(0b00000110); //0x06 dispcommand(0b00001100); //0x0C LED=1; dispclear(); 7

1.7.7 Funkce pro odeslání řetězce nebo matice znaků na displej Funkce dispstring() přejímá řetězec, jehož délka je rovna počtu znaků na řádek displeje. Tento řetězec vypíše na řádek určený funkcí dispsetrow(). void dispstring(char str[dispcolcount]) { unsigned int i; for (i=0;i<dispcolcount;i++) { dispchar(str[i]); Funkce dispmatrix() zobrazí celou matici znaků. Argumentem je 2D pole o rozměrech (počet řádků) x (počet sloupců) displeje. void dispmatrix(unsigned char matrix[disprowcount][dispcolcount]) { unsigned int i; for (i=0;i<disprowcount;i++) { dispsetrow(i+1); dispstring(matrix[i]); 8

2 Deska Evb Keyboard Deska Evb Keyboard je osazena maticovou klávesnicí o čtyřech řádcích a čtyřech sloupcích. Schéma desky je uvedeno na obr. 2. Obr. 2. Schéma desky Evb Keyboard 2.1 Propojení desky Evb IO s deskou EvbHCS08 Tuto desku propojte přes paralelní port PTA s deskou EvbHCS08. K ovládání klávesnice je k dispozici 8 bitů S1 S4 indikujících stisk tlačítka ve sloupci 1 4 a R1 R4 indikujících stisk tlačítka na řádku 1 4. Tyto bity jsou určeny výhradně pro čtení a jejich propojení s bity portu PTA uvádí tab. 4. Pozor řádky jsou číslovány zdola nahoru a sloupce zprava doleva!. Tab. 4. Přiřazení bitů klávesnice bitům portu PTA a jejich význam PTB displej význam PTA0 S1 indikace stisku tlačítka v 1. řádku PTA1 S2 indikace stisku tlačítka v 2. řádku PTA2 S3 indikace stisku tlačítka v 3. řádku 9

PTA3 S4 indikace stisku tlačítka v 4. řádku PTA4 R1 indikace stisku tlačítka v 1. sloupci PTA5 R2 indikace stisku tlačítka v 2. sloupci PTA6 R3 indikace stisku tlačítka v 3. sloupci PTA7 R4 indikace stisku tlačítka v 4. sloupci Pro čtení znaku z klávesnice je potřeba nastavit všechny piny PTA pro čtení a následně číst vždy nejprve řádek a poté sloupec. Pokud odečteme hodnotu 1, znamená to, že příslušná klávesa nebyla stisknuta, 0 znamená, že v daném řádku/sloupci byla klávesa stisknuta. 2.2 Programový pracovní rámec pro klávesnici Podobně jako u displeje i pro klávesnici vytvoříme několik funkcí, které nám později usnadní práci. 2.2.1 Definice konstant Do souboru main.c umístěte definice potřebných konstant a naliknujte soubor kb.c, který vytvořte ve složce Sources a do kterého umístíte funkce pro klávesnici. Dále je potřeba nalinkovat soubor wait.c obsahující funkce pro zpoždění (odst. 1.7.1). Váš soubor main.c by měl začínat nějak takto: #include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ //konstanty pro klávesnici: #define S1 PTAD_PTAD0 #define S2 PTAD_PTAD1 #define S3 PTAD_PTAD2 #define S4 PTAD_PTAD3 #define R1 PTAD_PTAD4 #define R2 PTAD_PTAD5 #define R3 PTAD_PTAD6 #define R4 PTAD_PTAD7 //další konstanty, např. pro displej #include "wait.c" #include "kb.c" //další include //další kód 2.2.2 Funkce pro detekci stisku klávesy Pro zjištění, která klávesa byla stisknuta, vytvoříme tři funkce: kbgetcol() pro zjištění řádku, kbgetrow() pro zjištění sloupce a kbgetchar() pro určení, jaký znak odpovídá dané kombinaci řádek-sloupec. Dále je potřeba vytvořit globální proměnnou kbpressed, která se v okamžiku stisku klávesy nastaví na 1 a zamezí tak opakovanému vkládání znaku po dobu, kdy klávesa zůstává stisknutá. Pokud bychom chtěli číst více stisknutých kláves zároveň, bylo by nutné kód upravit. Kód z tohoto odstavce umístěte do souboru kb.c. 10

unsigned char kbpressed=0; unsigned char kbgetrow() { PTADD= 0b11110000; PTAPE= 0b00001111; //řádky waitmore(5); if (!S1) return 4; else if (!S2) return 3; else if (!S3) return 2; else if (!S4) return 1; return 0; unsigned char kbgetcol() { PTADD= 0b00001111; PTAPE= 0b11110000; //sloupce waitmore(5); if (!R1) return 4; else if (!R2) return 3; else if (!R3) return 2; else if (!R4) return 1; return 0; unsigned char kbgetchar() { unsigned char row; unsigned char col; if(!(row=kbgetrow())!(col=kbgetcol()) { return (kbpressed=0); if (!kbpressed) { kbpressed=1; switch (row) { case 1: switch(col) { case 1: return '1'; case 2: return '2'; case 3: return '3'; case 4: return 'A'; case 2: switch(col) { case 1: return '4'; case 2: return '5'; case 3: return '6'; case 4: return 'B'; case 3: switch(col) { case 1: return '7'; case 2: return '8'; case 3: return '9'; case 4: return 'C'; 11

case 4: switch(col) { case 1: return '*'; case 2: return '0'; case 3: return '#'; case 4: return 'D'; return 0; Čtení sloupce a řádku se děje sekvenčně, protože současné čtení není možné. Čtené bity je nutné nastavit pro čtení a ostatní bity pro zápis. Pro čtené bity se navíc musí nastavit pullup enable na 1. Čteme nejprve horní a pak dolní čtyři bity portu. Mezi nastavením registrů portu a samotným čtením hodnoty jeho pinů je nutné ponechat určitou časovou prodlevu. Samostatný úkol S využitím funkcí uvedených v tomto návodu realizujte psaní znaků na displej. Program upravte tak, aby po zaplnění řádku kurzor skočil na správný nový řádek a aby se displej po zaplnění smazal a kurzor nastavil na začátek prvního řádku. 12

3 Ukázkový program Had V této kapitole demonstrujeme využití funkcí, které jsme vytvořili pro manipulaci s displejem a klávesnicí. Vytvoříme hru Had známou především z raných mobilních telefonů. Zde uvedená verze je poněkud zjednodušená, jelikož had bude mít pevnou délku a nebude přijímat žádnou potravu a růst. Bude se pouze pohybovat a měnit směr pomocí kláves 2, 4, 6, 8. Jeho tělo bude tvořeno znaky o. Funkce pro hada umístíme do samostatného souboru snake.c a ve funkci main() zajistíme jejich volání v nekonečné smyčce, přičemž v každé iteraci nejprve zjistíme, byla-li stisknuta směrová klávesa a pak posuneme hada o 1 jednotku. Had bude mít délku 4 znaky a souřadnice jeho segmentů budou uloženy v globálním 2D poli o čtyřech prvcích, přičemž každý prvek bude dvouprvkové pole uchovávající souřadnice, tj. řádek a sloupec segmentu. Celková situace se bude zobrazovat jako matice znaků o rozměrech displeje, kde znaky o souřadnicích hadových segmentů budou vyplněny znakem o a ostatní prvky prázdným znakem (mezerou). snake.c: #define snakelength 4 unsigned int snakedirection=0; //0-east, 1-north, 2-west, 3-south unsigned char snake[4][2]={{2,5,{2,6,{2,7,{2,8; //počáteční stav unsigned char plane[disprowcount][dispcolcount]; //pracovní plocha void snakeinit() { //vyplní pracovní plochu mezerami unsigned int i; unsigned int j; for (i=0;i<=disprowcount;i++) { for (j=0;j<=dispcolcount;j++) { plane[i][j]=' '; void snakecheckdirection() { //zjistí, zda byla stisknuta směrová klávesa a případně změní směr unsigned char key=kbgetchar(); switch (key) { case '6': if (snakedirection==1 snakedirection==3) { snakedirection=0; case '2': if (snakedirection==0 snakedirection==2) { snakedirection=1; 13

case '4': if (snakedirection==1 snakedirection==3) { snakedirection=2; case '8': if (snakedirection==0 snakedirection==2) { snakedirection=3; void snakemove() { //posune hada o 1 jednotku zvoleným směrem unsigned char begin[2]; unsigned char end[2]; unsigned int i; begin[0]=snake[3][0]; begin[1]=snake[3][1]; end[0]=snake[0][0]; end[1]=snake[0][1]; plane[end[0]][end[1]]=' '; switch (snakedirection) { case 0: //east if (begin[1]==dispcolcount-1) begin[1]=0; else begin[1]++; case 2: //west if (begin[1]==0) begin[1]=dispcolcount-1; else begin[1]--; case 1: //north if (begin[0]==0) begin[0]=disprowcount-1; else begin[0]--; case 3: //south if (begin[0]==disprowcount-1) begin[0]=0; else begin[0]++; for (i=0;i<3;i++) { snake[i][0]=snake[i+1][0]; snake[i][1]=snake[i+1][1]; plane[snake[i][0]][snake[i][1]]='o'; snake[3][0]=begin[0]; snake[3][1]=begin[1]; plane[begin[0]][begin[1]]='o'; 14

dispmatrix(plane); main.c: #include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ //display constants #define RS PTBD_PTBD0 #define RW PTBD_PTBD1 #define E PTBD_PTBD2 #define LED PTBD_PTBD3 //podsvícení (1=svítí) #define D4 PTBD_PTBD4 #define D5 PTBD_PTBD5 #define D6 PTBD_PTBD6 #define D7 PTBD_PTBD7 //keyboard constants #define S1 PTAD_PTAD0 #define S2 PTAD_PTAD1 #define S3 PTAD_PTAD2 #define S4 PTAD_PTAD3 #define R1 PTAD_PTAD4 #define R2 PTAD_PTAD5 #define R3 PTAD_PTAD6 #define R4 PTAD_PTAD7 #include "wait.c" #include "disp.c" #include "kb.c" #include "snake.c" void main(void) { SOPT_COPE=0; //zákaz watchdog dispinit(); snakeinit(); for(;;) { snakecheckdirection(); snakemove(); waitmore(50); //určuje rychlost hada 15

4 Literatura [1] Freescale Semiconductor MC9S08GB/GT Data Sheet 16