/* =================================================================== ** Název souboru : touch.c ** Mikrokontroler : ATmega16 ** Popis : Funkce pro ovládáná digitálního touchscreenu ** ** Autor : Petr Marcň ** Předmýt : Mikroprocesory pro přístrojové aplikace ** Kompilátor : AVG-GCC ** Poslední změna : 27.04.09 ** Funkce jsou psány univerzálně, jediné co musí bý dorženo, je to, že ** jednotlivé piny musejí být v daném portu, ale je jedno v jakém pořadí ** Funkčnost programu spočívá v tom,že se cyklicky vysílá do jednotlivých ** řádků logická úroveň "L" a pokud je stisknut daný dotykový bod, tak se ** logická úroveň L přenese i do sloupce a tato hodnota je snímána na vstupech ** =================================================================== */ /* ** Hlavičkové soubory */ #include // hlavičkový soubor pro mikrokontrolér ATmega16 #include #define F_CPU 16000000UL // frekvence krystalu (nutne pro delay.h) #include // hlaviŔkovř soubor pro zpo×dýnÝ #include "touch.h" // hlavičkový soubor pro obsluhu touchscreenu /* ** Globální proměnné */ ;unsigned int Tx,Ty ; // souřadnice jednotlivých bodů touchscreenu /*********************************************************************** Prototypy funkcí ************************************************************************/ void Toch_Col_Test (void); /*********************************************************************** Funkce pro testování sloupců ************************************************************************/ void Toch_Col_Test (void) { _delay_ms( 100 ) ; // zpozdeni 100ms if bit_is_clear (TOUCH_COL_PIN,COL_1) Tx=1; // testování vstupů if bit_is_clear (TOUCH_COL_PIN,COL_2) Tx=2; if bit_is_clear (TOUCH_COL_PIN,COL_3) Tx=3; if bit_is_clear (TOUCH_COL_PIN,COL_4) Tx=4; if bit_is_clear (TOUCH_COL_PIN,COL_5) Tx=5; if bit_is_clear (TOUCH_COL_PIN,COL_6) Tx=6; if bit_is_clear (TOUCH_COL_PIN,COL_7) Tx=7; if bit_is_clear (TOUCH_COL_PIN,COL_8) Tx=8; if bit_is_clear (TOUCH_CLRW_PIN,COL_9) Tx=9; if bit_is_clear (TOUCH_CLRW_PIN,COL_10) Tx=10; _delay_ms( 10 ); } /*********************************************************************** Funkce pro zjisteni dotyku Funkce je psana univerzalne, s tim ze nevim ktere piny budou konkretne definovany, velke zjednoduseni by bylo kdyby byly piny nebyly prehazene, stacilo by pote jen rolovani bitu a cyklus for ************************************************************************/ void touch ( void ) { Tx = 0; Ty = 0; TOUCH_CLRW_PORT |= (_BV(ROW_5)); // nulování prvního řádku TOUCH_CLRW_PORT &= ~(_BV(ROW_1)); Toch_Col_Test (); if (Tx) { Tx=0; Toch_Col_Test (); if (Tx) Ty=1; TOUCH_CLRW_PORT |= (_BV(ROW_1)); // nastavení prvního řádku } else { _delay_ms( 100 ) ; // zpozdeni TOUCH_CLRW_PORT |= (_BV(ROW_1)); // nulování druhého řádku TOUCH_CLRW_PORT &= ~(_BV(ROW_2)); Toch_Col_Test (); if (Tx) { Tx=0;Ty=0; Toch_Col_Test (); if (Tx) Ty=2; TOUCH_CLRW_PORT |= (_BV(ROW_2)); // nastavení prvního řádku } else { TOUCH_CLRW_PORT |= (_BV(ROW_2)); // nulování třetího řádku TOUCH_CLRW_PORT &= ~(_BV(ROW_3)); Toch_Col_Test (); if (Tx) { Tx=0;Ty=0; Toch_Col_Test (); if (Tx) Ty=3; TOUCH_CLRW_PORT |= (_BV(ROW_3)); // nastavení prvního řádku } else { TOUCH_CLRW_PORT|= (_BV(ROW_3)); // nulování čtvrtého řádku TOUCH_CLRW_PORT &= ~(_BV(ROW_4)); Toch_Col_Test (); if (Tx) { Tx=0;Ty=0; Toch_Col_Test (); if (Tx) Ty=4; TOUCH_CLRW_PORT |= (_BV(ROW_4)); // nastavení prvního řádku } else { TOUCH_CLRW_PORT |= (_BV(ROW_4)); // nulování pátého řádku TOUCH_CLRW_PORT &= ~(_BV(ROW_5)); Toch_Col_Test (); if (Tx) { Tx=0;Ty=0; Toch_Col_Test (); if (Tx) Ty=5; TOUCH_CLRW_PORT |= (_BV(ROW_5)); // nastavení prvního řádku } }//else 4 } // else 3 } // else 2 }//else */ } // *********************************************************************** // Funkce pro inicializaci dotykového panelu // *********************************************************************** void touch_init( void ) { TOUCH_COL_DDR = 0x00; // Port pro sloupce je definován jako vstupní TOUCH_CLRW_DDR = 0x00; // Port pro sloupce je definovan jako vstupní TOUCH_CLRW_DDR = ((_BV(5))|(_BV(ROW_1))|(_BV(ROW_2))|(_BV(ROW_3))|(_BV(ROW_4))|(_BV(ROW_5))); // Nastavení řádků jako výstupy : TOUCH_COL_PORT = 0xFF; // Nastavení pull up rezistorů pro všechy vstupy TOUCH_CLRW_PORT = 0xFF; // Nastavení pull up rezistorů pro všechy vstupy a zároveň v // vyslání logických jedniček na výstupy } //----------------------------------------------------------------------