avr-lcd-panel-2-program.md 6.46 KB
Newer Older
Isabella Skořepová's avatar
Isabella Skořepová committed
1
```
2 3

title = "AVR - LCD panel - #2 Program"
Miroslav Koncik's avatar
Miroslav Koncik committed
4 5 6 7 8 9 10
perex_e = "

Kompatibilní zapojení: LCD panel s ATmega8

Ke stažení: LCD_002.c == LCD_002.pdf == LCD_002.htm
.
.
11
"
12
tags = ["Články","Programování","C/C++","Rozbité články"]
Isabella Skořepová's avatar
Isabella Skořepová committed
13
```
14

Miroslav Koncik's avatar
Miroslav Koncik committed
15 16 17 18 19
Kompatibilní zapojení: LCD panel s ATmega8

Ke stažení: LCD_002.c == LCD_002.pdf == LCD_002.htm
.
.
20

21
---
22

23
<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">&amp;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 { } --&amp;gt;</style>
24 25 26 27 28 29 30

```
/*
Minule jsme na přípravku ATmega_LCD_uni vyzkoušeli displej, a nyní se pokusíme
"oživit" i klávesnici.
*/
/*
31
Obslužné rutiny pro klávesnici jsou uloženy v souboru "kbd_2x3dm.c". Tento
32 33 34 35 36 37
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ů)
38
unsigned char kbd_read(void) //tato funkce "přečte" klávesnici, kdykoli je
39 40 41 42
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ě,
43 44
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
45 46
toho procesor "všimne".

47
Soubor "kbd_2x3dm.c" také obsahuje dvě zajímavé konstanty, které řídí chování
48 49 50 51 52 53
klávesnice, pokud je tlačítko drženo déle.
Tyto konstanty jsou:

KBD_SKIP
KBD_ACC

54 55
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
56
stisknuto stejné tlačítko (nebo stejná tlačítka), jako když byla volána minule,
57
vrátí místo hodnoty tohoto tlačítka nulu (jako kdyby nebylo stisknuto žádné
58 59
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.
60
Pokud je tlačítko drženo i nadále, poté co funkce "kbd_read()" již podruhé
61
vrátila jeho hodnotu, začíná se uplatňovat konstanta "KBD_ACC". Tato konstanta
62
určuje, o kolik cyklů se má vynechat méně před každým dalším navrácením hodnoty
63 64
téhož tlačítka.

65
Výsledkem tedy je, že pokud uživatel stiskne a drží tlačítko, vrátí se jeho
66
hodnota, čeká se podle "KBD_SKIP", znovu se vrátí jeho hodnota, čeká se
67
o "KBD_ACC" méně, zase se vrátí hodnota, čeká se o další "KBD_ACC" méně,
68 69 70
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í.

71
Tato funkce se nazývá "autorepeat" a hodí se například, pokud je potřeba
72 73 74
nastavit nějakou proměnnou ve velkém rozsahu.
*/
/*
75 76 77 78
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
79 80
představuje.
Čtení klávesnice bude probíhat vždy jednou za 100 ms (10x za vteřinu), což
81 82
zajistíme pomocí časovače. pro čtení klávesnice nám bude stačit jednoduchý
časovač TC0\.
83 84
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
85
char - bude se tedy zvyšovat jen do 255, protože pak přeteče a začíná
86 87 88
opět od nuly.
*/

89
#define F_CPU 1000000  // Taktovací frekvence procesoru 1 MHz
90 91 92 93 94 95 96 97

#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

98
#define TCNT0VAL	(256-(F_CPU/1024/10))//Hodnota, od které bude časovač
99 100
					//počítat, než přeteče a vyvolá přerušení.
					//256 => maximum čítače + 1 = přetečení
101
					//1024 => dělička,
102 103 104 105 106 107 108 109 110
					//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)
{
111 112
TCNT0=TCNT0VAL; //nastavení hodnoty, od které časovač počítá
				//(jinak by počítal od nuly)
113 114 115 116 117
tlacitko=kbd_read();	//přečti klávesnici a hodnotu ulož do "tlacitko"
}

int main(void)
{
118
unsigned char opakovani=0; 	//proměnná, která se pokaždé po vrácení kódu
119 120 121 122
							//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)
123
SREG  |= (1<<7);	//povolení globálního přerušení
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
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

154
```