/* ********************************************************************** * File S1deb1.C - Rel. 1.1 con uC/51 V. 1.10.7 * * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * * Schede: GPC 550 d.s. 200702 e DEB01 o TIO16 * * Tel. +39 051 892052 Fax. +39 051 893661 * * http://www.grifo.com http://www.grifo.it * * sales@grifo.it tech@grifo.it grifo@grifo.it * * by Graziano Gaiba del 08.09.03 * ********************************************************************** Rel. 1.1 - 08.09.2003 by Graziano Gaiba Con un flat da 20 vie si collega il CN2 della GPC550 al CN15 della DEB01 o al CN1 della TIO16. Tale programma visualizza sul PORT A del PPI 8255, il codice esadecimale del tasto premuto sulla tastiera del terminale ed effettua echo sul monitor. */ #include #include #include // Frequenza di clock della CPU usata #define FCLOCK 22118400 // Indirizzi allocazione registri delle periferiche di bordo. static unsigned char PORTA @ 0xFFF4, PORTB @ 0xFFF5, PORTC @ 0xFFF6, CNT @ 0xFFF7; /********* Funzioni di utility generale e di gestione sezioni hw ***********/ void iniser(unsigned long baud) /* Inizializza la linea seriale con: Bit x chr = 8 Stop bit = 1 Parity = None Baud rate = baud usando come baud rate generator il timer 1. */ { SCON=0x052; // Modo 1, abilita ricevitore TMOD&=0x00F; // Timer 1 in modo auto-reload TMOD|=0x020; TR1=0; // Stop al TIMER 1 TH1=256-((2*FCLOCK)/(384*baud)); // baud a 14.7456 MHz PCON=PCON|0x080; // Setta SMOD=1 per baud rate alti TR1=1; // Start al TIMER 1 } // ************************ Procedura HexAdjust **************************** // Questa procedure riceve in ingresso un unsigned char e verifica che sia // una cifra esadecimale (numero da 0 a 9 oppure lettera da 'a' ad 'f' oppure // da 'A' ad 'F'. Se la verifica e' positiva viene restituito il valore di // tale cifra (da 0 a 15) altrimenti viene restituito 16. // Parametri in ingresso: // c di tipo unsigned char: contiene il codice del carattere da esaminare // Restituisce il valore della cifra esadecimale ricevuta in ingresso oppure // restituisce 16. unsigned char HexAdjust(unsigned char c) { c-=48; // Si da per scontato che il parametro sia una // cifra esadecimale tra 0 e 9, quindi la // aggiustiamo da ASCII a valore numerico togliendo // il valore del codice ASCII di '0' cioe' 48 if(c>15) // Se il parametro vale ancore piu' di 15 non era // una cifra da 0 9, ora supponiamo che fosse una // cifra da 'A' ad 'F' e aggiustiamo analogamente // a prima { c-=7; // 48 prima 7 ora, si e' tolto ASCII di 'A' (65)+10 if(c<10 || c>15) // Se non era neppure da 'A' ad 'F' forse era da { // Da 'a' ad 'f' c-=32; // Aggiustamento togliendo in totale ASCII di 'a' if(c<10 || c>15) // Se ancora non ha un valore tra 0 e 15 non era { // una cifra esadecimale c=16; // Imposta per restituire 16 } } } return c; // Restituisce il valore della cifra esadecimale // Oppure 16 } // Attesa di assestamento dei segnali void setup(void) { unsigned int i; for(i=10000; i!=0; i--) ; } // Inizializza l'82c55 con il valore passato nel parametro void init8255(unsigned char c) { CNT=c; } // Imposta il valore del port A dell'82c55 void setPortA(unsigned char v) { PORTA=v; } // Imposta il valore del port B dell'82c55 void setPortB(unsigned char v) { PORTB=v; } // Imposta il valore del port C dell'82c55 void setPortC(unsigned char v) { PORTC=v; } // ************************** Programma principale *************************** void main(void) { unsigned char tasto; setup(); // Attesa di assestamento dei segnali iniser(19200); TI=0; RI=0; // Commentare se si usa la seriale in polling (SIOTYPE=p oppure k) ES=1; // Abilita interrupt porta seriale EA=1; // Abilitazione interrupt // Inizializzazione del PPI 8255. init8255(0x80); // PORT A, B, C in OUTPUT. setPortA(0xff); // Clear PORT A. setPortC(0xff); // Clear PORT C. puts("\n********************* Demo S1DEB1 **********************"); for (;;) // Loop infinito. { puts("\nPremere un tasto che corrisponda ad una cifra esadecimale."); putc(tasto = getc()); // Attesa tasto ed echo. tasto = HexAdjust(tasto); if(tasto<=15) // E` un codice esadecimale o un numero ? { setPortA(~tasto); // Visualizzazione sul PORT A del codice. } else { puts("\nError !"); // Errore non e` un codice esadecimale. setPortA(0xff); // Clear PORT A. } } }