/********************************************************************** ** Programma: S1DEB1.C - Versione : 1.1 - 11 Novembre 1999 ** ** Compilatore : GCTR V. 1.1 ** ** Scheda : GPC(r) 188F ** ** 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. */ #include #include #include // // ********************* Dichiarazione delle costanti *********************** // // Registri del port ppi 8255 const unsigned int PA = 0x0F200; // Valore del port A const unsigned int PB = 0x0F201; // Valore del port B const unsigned int PC = 0x0F202; // Valore del port C const unsigned int RS = 0x0F203; // Registro di controllo // Registri linea seriale B const unsigned int RSB = 0x0F080; // Registro di controllo const unsigned int RDB = 0x0F081; // Registro dati // // ********************* 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 // Inizializza la seriale B void iniserb (unsigned long baud,unsigned char bitxchr,unsigned char stopbit,unsigned char parity); // Pulisce lo schermo void clrscr (void); // // **************************** Programma main ****************************** // void main() { unsigned char r; // Variabile locale al main() di uso generico iniserb(19200, 8, 1, 0); //Inizializza la seriale B clrscr(); outportb(RS, 0x8B); // Configura il port A in uscita, // i port B e C in ingresso outportb(PA, 0xFF); // Spegne i led rossi cprintf(" Programma dimostrativo 1 per la sezione 1 della scheda DEB(r) 01\r\n\n"); cprintf(" Riporta sul port 0 il codice esadecimale del tasto premuto sulla console.\r\n\n"); cprintf(" Esecuzione in corso...\r\n\n"); do { cprintf("Digitare carattere: "); // Richiede il carattere c=getch(); // Leggi il tasto premuto cprintf("%c\r\n", c); // Stampalo r=HexAdjust(c); if( r != 16 ) // Se e' una cifra esadecimale { r=~r; // Negala per pilotare i LED in outportb(PA, r); // Logica negativa e ponila in uscita } else // Altrimenti { // Avverti l'utente cprintf("Sono ammessi solo i caratteri da 0 a 9, da A ad F e da a ad f.\r\n"); } } while(1); // Ripeti all'infinito } // // ******************************* Fine del main ***************************** // // // ************************* 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 } void iniserb (unsigned long baud,unsigned char bitxchr,unsigned char stopbit,unsigned char parity) /* Inizializza la linea seriale ser con il protocollo definito nei parametri baud (150 - 115200), bitxchr (5,6,7,8), stopbit (1,2) e parity (0=none, 1=odd, 2=even). */ { unsigned int timec; unsigned char d; outportb(RSB,0x00A); // seleziona funzionamento standard outportb(RSB,0x000); outportb(RSB,0x00B); // TxC = RxC = Baud Rate generator interno outportb(RSB,0x050); timec=(345600/baud)-2; // Programma Baud Rate con quarzo da 11.0592 MHz outportb(RSB,0x00C); outportb(RSB,(timec & 0x000FF)); outportb(RSB,0x00D); outportb(RSB,(timec >> 8)); outportb(RSB,0x00E); // no local loopback, no auto echo, abilita baud outportb(RSB,0x003); // rate generator interno outportb(RSB,0x00F); // disabilita alcune sorgenti interrupt outportb(RSB,0x000); d=0x040; // clock x 16 if (stopbit==1) d=d | 0x004; // 1 stop bit else d=d | 0x00C; // 2 stop bit switch (parity) { case 0: d=d; // No parity break; case 1: d=d | 0x001; // Odd parity break; case 2: d=d | 0x003; // Even parity break; } outportb(RSB,0x004); outportb(RSB,d); switch (bitxchr) { case 5: d=0x008; // 5 Bit x chr, Tx enable break; case 6: d=0x048; // 6 Bit x chr, Tx enable break; case 7: d=0x028; // 7 Bit x chr, Tx enable break; case 8: d=0x068; // 8 Bit x chr, Tx enable break; } d=d | 0x82; // RTS e DTR attivi outportb(RSB,0x005); outportb(RSB,d); switch (bitxchr) { case 5: d=0x001; // 5 Bit x chr, Rx enable break; case 6: d=0x081; // 6 Bit x chr, Rx enable break; case 7: d=0x041; // 7 Bit x chr, Rx enable break; case 8: d=0x0C1; // 8 Bit x chr, Rx enable break; } outportb(RSB,0x003); outportb(RSB,d); outportb(RSB,0x001); // Disabilita interrupts outportb(RSB,0x000); } void clrscr(void) /* Effettua la funzione di clear screen per una generica console */ { unsigned char r; putch('\r'); for (r = 0; r < 25 ; r++) { putch('\n'); // Trasmette 25 Line Feed } } // // *********************** Fine del programma ******************************* //