/********************************************************************** ** Programma: S1DEB1.C - Versione : 1.1 - 03 Agosto 1999 ** ** Compilatore : HI-TECH C for 8051 V. 7.60 ** ** Scheda : GPC(r) 323 ** ** Ditta: grifo(r) ITALIAN TECHNOLOGY ** ** Via Dell' Artigiano 8/6 40016 San Giorgio di Piano (BO) ** ** Tel.+39 051 892 052 Fax +39 051 893 661 ** ** http://www.grifo.com http://www.grifo.it ** ** sales@grifo.it tech@grifo.it grifo@grifo.it ** ** ** ** Realizzato da: Graziano Gaiba ** ********************************************************************** Questo programma riporta il codice esadecimale del tasto premuto nell'emulatore di terminale, trasmesso sulla linea seriale, sui segnali del port A. Per facilitare la visualizzazione dello stato delle linee e' necessario collegare con un cavo flat a 20 poli, il connettore CN7 della GPC(r) 323 al connettore CN15 della DEB 01. */ #include<8051.h> #include // // ******************** Direttive del compilatore ************************** // // Sono incorporate nel file S1DEB1.PRJ // // ********************* Dichiarazione delle costanti *********************** // volatile far unsigned char Pda @ 0xFFFC; // Registro dati del portA volatile far unsigned char Pdb @ 0xFFFD; // Registro dati del portB volatile far unsigned char Pdc @ 0xFFFE; // Registro dati del portC volatile far unsigned char Cnt @ 0xFFFF; // Registro di controllo // // ********************* Dichiarazione delle variabili ********************** // unsigned char c; // Memorizza il codice carattere letto dalla linea seriale // // ******************** Dichiarazione delle procedure *********************** // unsigned char HexAdjust(unsigned char c); // Procedura che filtra le cifre // Esadecimali e ne restituisce il // Valore; oppure restituisce 16 // // **************************** Programma main ****************************** // void main() { unsigned char r; // Variabile locale al main() di uso generico Cnt=0x8B; // Configura il port A in uscita, // i port B e C in ingresso Pda=0xFF; // Spegne i led rossi printf(" Programma dimostrativo 1 per la sezione 1 della scheda DEB(r) 01\n\n"); printf(" Riporta sul port 0 il codice esadecimale del tasto premuto sul PC.\n\n"); printf(" Esecuzione in corso...\n\n"); do { printf("Digitare carattere: "); // Richiede il carattere while(! kbhit()) // Finche' non viene premuto un ; // Tasto, resta in attesa c=getch(); // Leggi il tasto premuto printf("%c\n", c); // Stampalo r=HexAdjust(c); if( r != 16 ) // Se e' una cifra esadecimale { r=~r; // Negala per pilotare i LED in Pda=r; // Logica negativa e ponila in uscita } else // Altrimenti { // Avverti l'utente printf("Sono ammessi solo i caratteri da 0 a 9, da A ad F e da a ad f.\n"); } } while(1); // Ripeti all'infinito } // // *************************** Fine del programma *************************** // // // ************************* 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 iningresso 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 } // // *********************** Fine del programma ******************************* //