diff --git a/articles/2012/avr-lcd-panel-2-program.md b/articles/2012/avr-lcd-panel-2-program.md new file mode 100644 index 0000000000000000000000000000000000000000..1dc978ac6f015da6b156241d6317afef929bc598 --- /dev/null +++ b/articles/2012/avr-lcd-panel-2-program.md @@ -0,0 +1,156 @@ ++++ + +title = "AVR - LCD panel - #2 Program" +perex_e = " + +KompatibilnĂ zapojenĂ: LCD panel s ATmega8 + +Ke staĹľenĂ: LCD_002.c == LCD_002.pdf == LCD_002.htm +. +. +" +tags = ["ÄŚlánek"] ++++ + + + +KompatibilnĂ zapojenĂ: LCD panel s ATmega8 + +Ke staĹľenĂ: LCD_002.c == LCD_002.pdf == LCD_002.htm +. +. + +* * * + +<title>Untitled</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="generator" content="SynEdit HTML exporter"> <style type="text/css">&lt;!-- body { color: #000000; background-color: #FFFFFF; } .cpp1-assembler { } .cpp1-brackets { } .cpp1-comment { color: #008000; font-style: italic; } .cpp1-float { color: #000080; } .cpp1-hexadecimal { color: #000080; } .cpp1-character { } .cpp1-identifier { } .cpp1-illegalchar { } .cpp1-number { color: #000080; } .cpp1-octal { color: #0000FF; } .cpp1-preprocessor { } .cpp1-reservedword { font-weight: bold; } .cpp1-space { color: #008080; } .cpp1-string { color: #800000; } .cpp1-symbol { } --&gt;</style> + +``` +/* +Minule jsme na pĹ™Ăpravku ATmega_LCD_uni vyzkoušeli displej, a nynĂ se pokusĂme +"oĹľivit" i klávesnici. +*/ +/* +ObsluĹľnĂ© rutiny pro klávesnici jsou uloĹľeny v souboru "kbd_2x3dm.c". Tento +soubor je opÄ›t závislĂ˝ na konfiguraci uloĹľenĂ© v souboru "atmega_lcd_uni_cfg.c" +a je proto nutnĂ©, aby soubor "atmega_lcd_uni_cfg.c" byl vloĹľen ještÄ› pĹ™ed +souborem "kbd_2x3dm.c". +Soubor "kbd_2x3dm.c" obsahuje následujĂcĂ dvÄ› rutiny: + +void kbd_ini(void) //inicializace klávesnice (nastavenĂ vstupnĂch a vĂ˝stupnĂch pinĹŻ) +unsigned char kbd_read(void) //tato funkce "pĹ™eÄŤte" klávesnici, kdykoli je +volána, a vrátĂ hodnotu právÄ› stisknutĂ˝ch tlaÄŤĂtek + +Funkce "kbd_read(void)" vracĂ hodnotu kláves kterĂ© jsou stisknuty právÄ› v tom +okamĹľiku, kdy je volána. Pokud tedy chceme na stisk klávesy reagovat okamĹľitÄ›, +je vhodnĂ© tuto funkci volat pĹ™ibliĹľnÄ› 10 - 20 krát za vteĹ™inu. +Jinak by bylapatrná prodleva, kdy je potĹ™eba tlaÄŤĂtko chvĂli drĹľet, neĹľ si +toho procesor "všimne". + +Soubor "kbd_2x3dm.c" takĂ© obsahuje dvÄ› zajĂmavĂ© konstanty, kterĂ© Ĺ™ĂdĂ chovánĂ +klávesnice, pokud je tlaÄŤĂtko drĹľeno dĂ©le. +Tyto konstanty jsou: + +KBD_SKIP +KBD_ACC + +Konstanta "KBD_SKIP" urÄŤuje, kolik cyklĹŻ se má vynechat, pokud je stisknuto +stále totĂ©Ĺľ tlaÄŤĂtko. To znamená, Ĺľe kdyĹľ funkce "kbd_read()" zjistĂ, Ĺľe je +stisknuto stejnĂ© tlaÄŤĂtko (nebo stejná tlaÄŤĂtka), jako kdyĹľ byla volána minule, +vrátĂ mĂsto hodnoty tohoto tlaÄŤĂtka nulu (jako kdyby nebylo stisknuto žádnĂ© +tlaÄŤĂtko). Konstanta "KBD_SKIP" tedy urÄŤuje, kolikrát má funkce "kbd_read()" +toto tlaÄŤĂtko ignorovat, neĹľ opÄ›t vrátĂ jeho hodnotu. +Pokud je tlaÄŤĂtko drĹľeno i nadále, potĂ© co funkce "kbd_read()" jiĹľ podruhĂ© +vrátila jeho hodnotu, zaÄŤĂná se uplatĹovat konstanta "KBD_ACC". Tato konstanta +urÄŤuje, o kolik cyklĹŻ se má vynechat mĂ©nÄ› pĹ™ed kaĹľdĂ˝m dalšĂm navrácenĂm hodnoty +tĂ©hoĹľ tlaÄŤĂtka. + +VĂ˝sledkem tedy je, Ĺľe pokud uĹľivatel stiskne a držà tlaÄŤĂtko, vrátĂ se jeho +hodnota, ÄŤeká se podle "KBD_SKIP", znovu se vrátĂ jeho hodnota, ÄŤeká se +o "KBD_ACC" mĂ©nÄ›, zase se vrátĂ hodnota, ÄŤeká se o dalšà "KBD_ACC" mĂ©nÄ›, +a tak to jde aĹľ do doby, kdy se vracĂ hodnota drĹľenĂ©ho tlaÄŤĂtka pĹ™i kaĹľdĂ©m +cyklu (volánĂ funkce "kbd_read()"), nebo dokud uĹľivatel tlaÄŤĂtko opÄ›t neuvolnĂ. + +Tato funkce se nazĂ˝vá "autorepeat" a hodĂ se napĹ™Ăklad, pokud je potĹ™eba +nastavit nÄ›jakou promÄ›nnou ve velkĂ©m rozsahu. +*/ +/* +NynĂ se tedy mĹŻĹľeme pustit do psanĂ programu. Náš program bude jednoduše +vypisovat kĂłdy stisknutĂ˝ch tlaÄŤĂtek na displej. Tento program bude pro nás +velmi uĹľiteÄŤnĂ˝, protoĹľe aĹľ budeme pozdÄ›ji potĹ™ebovat, aby program reagoval +na danĂ© tlaÄŤĂtko, budeme potĹ™ebovat vÄ›dÄ›t, jakĂ© ÄŤĂslo (kĂłd) toto tlaÄŤĂtko +pĹ™edstavuje. +ÄŚtenĂ klávesnice bude probĂhat vĹľdy jednou za 100 ms (10x za vteĹ™inu), coĹľ +zajistĂme pomocĂ ÄŤasovaÄŤe. pro ÄŤtenĂ klávesnice nám bude staÄŤit jednoduchĂ˝ +ÄŤasovaÄŤ TC0\. +ZároveĹ budeme na displej vypisovat promÄ›nnou "opakovani" která se pokaĹľdĂ©, +kdyĹľ je navrácen kĂłd tlaÄŤĂtka zvýšà o jednnu. Je to promÄ›nná typu unsigned +char - bude se tedy zvyšovat jen do 255, protoĹľe pak pĹ™eteÄŤe a zaÄŤĂná +opÄ›t od nuly. +*/ + +#define F_CPU 1000000 // TaktovacĂ frekvence procesoru 1 MHz + +#include <avr/io.h> //Knihovna vstupĹŻ a vĂ˝stupĹŻ +#include <avr/interrupt.h> //Knihovna pĹ™erušenĂ + +#include "atmega_lcd_uni_cfg.c" //konfigurace vstupĹŻ a vĂ˝stupĹŻ pro pĹ™Ăpravek ATmega_lcd_uni +#include "lcd.c" //ObsluĹľnĂ© rutiny pro display +#include "kbd_2x3dm.c" //ObsluĹľnĂ© rutiny pro klávesnici + +#define TCNT0VAL (256-(F_CPU/1024/10))//Hodnota, od kterĂ© bude ÄŤasovaÄŤ + //poÄŤĂtat, neĹľ pĹ™eteÄŤe a vyvolá pĹ™erušenĂ. + //256 => maximum ÄŤĂtaÄŤe + 1 = pĹ™eteÄŤenĂ + //1024 => dÄ›liÄŤka, + //10 => pĹ™erušenĂ se vyvolá 10x za vteĹ™inu + +volatile unsigned char tlacitko=0;//GlobálnĂ promÄ›nná obsahujĂcĂ kĂłd stisknutĂ©ho + + //tlaÄŤĂtka. PouĹľĂvá se v main() a pĹ™erušenĂ. + +//vektor pĹ™erušenĂ vykoná se vĹľdy kdyĹľ pĹ™eteÄŤe ÄŤasovaÄŤ TC0 (cca 10x za vteĹ™inu) +ISR(TIMER0_OVF_vect) +{ +TCNT0=TCNT0VAL; //nastavenĂ hodnoty, od kterĂ© ÄŤasovaÄŤ poÄŤĂtá + //(jinak by poÄŤĂtal od nuly) +tlacitko=kbd_read(); //pĹ™eÄŤti klávesnici a hodnotu uloĹľ do "tlacitko" +} + +int main(void) +{ +unsigned char opakovani=0; //promÄ›nná, která se pokaĹľdĂ© po vrácenĂ kĂłdu + //tlaÄŤĂtka zvýšà o 1 + +TCCR0=0B00000101; //zapnout TC0 s pĹ™eddÄ›liÄŤkou 1024 +setb (TIMSK,0); //povol pĹ™erušenĂ pĹ™i pĹ™eteÄŤenĂ TC0 (TCNT0==0x100) +SREG |= (1<<7); //povolenĂ globálnĂho pĹ™erušenĂ +TCNT0=TCNT0VAL; //resetTC + +lcd_ini(); //inicializace displeje (nastavenĂ vĂ˝stupnĂch pinĹŻ a zahájenĂ komunikace) +kbd_ini(); //inicializace klávesnice (nastavenĂ vstupnĂch pinĹŻ) + +cls(); //smazánĂ displeje + +gotoxy(1,1); //kurzor na začátek prvnĂho řádku +lcd_text("Tlacitko:"); //napĂšeme text +gotoxy(2,1); //kurzor na začátek druhĂ©ho řádku +lcd_text("Opakovani:"); //napĂšeme text + +while(1) //hlavnĂ smyÄŤka + { + if(tlacitko) //pokud je stisknutĂ© nÄ›jakĂ© tlaÄŤĂtko ("tlacitko" nenĂ nula) + { + gotoxy(1,13); //nastavenĂ kurzoru za text (abychom jej nepĹ™epsali) + lcd_byt(tlacitko); //vypiš kĂłd tlaÄŤĂtka + tlacitko=0; //hodnotu tlaÄŤĂtka uĹľ nepotĹ™ebujeme + gotoxy(2,13); //nastavenĂ kurzoru za text + lcd_byt(opakovani); //vypiš ÄŤĂslo opakovánĂ + opakovani++; + } + + } +} +//konec programu + +//Pro radioklub OK1KVK naspal Vašek Král + +``` \ No newline at end of file