Gustav |
Nové stránky BETA
Hlavní nabídka
Technika & Bastlení
Média
Reklama Google

AVR - LCD panel - #2 Program PDF Tisk Email
Koutek AVR -
Napsal uživatel Michal, OK1WMR   
Středa, 14 Březen 2012 09:20

Kompatibilní zapojení: LCD panel s ATmega8

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


Untitled
/*
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


 
Poslední aktualizace
 5 January 2016, 07:01 
Webkamera
Webkamera na Blatenském vrchu
Change language
Sociální sít?
Náhodné foto
Podporují nás