/********************************************************************** ** Programma: S1DEB7.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 fa scorrere l'accensione di un LED in una direzione o nell'altra a seconda dello stato dello switch 1; se questo e' OFF scorre dai LED rossi verso quelli gialli, se e' ON scorre nella direzione opposta. */ #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 const unsigned int SW = 0x0F300; // Banco dei Dip Switch // Registri linea seriale B const unsigned int RSB = 0x0F080; // Registro di controllo const unsigned int RDB = 0x0F081; // Registro dati // // ******************** Dichiarazione delle procedure *********************** // // 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 int shifter; unsigned int delay; iniserb(19200, 8, 1, 0); //Inizializza la seriale B clrscr(); cprintf(" Programma dimostrativo 7 per la sezione 1 della scheda DEB(r) 01\r\n\n"); cprintf(" Fa scorrere un LED verso sinistra se lo switch 1 e' OFF, altrimenti\r\n\n"); cprintf(" lo fa scorrere verso destra.\r\n\n"); cprintf(" Esecuzione in corso...\r\n\n"); outportb(RS, 0x82); // Configura in ingresso il port B, // In uscita i port A e C do { if(inportb(SW) & 0x01) // Se il Dip 8 e' OFF { shifter=1; // Inizia a scorrere dai LED rossi verso gli altri } else { shifter=0x8000; // Altrimenti fai viceversa } while(shifter!=0) { shifter=~shifter; // I led funzionano in logica negata outportb(PA, shifter & 0x00FF); // Sui LED rossi vanno i primi 8 bits outportb(PC, shifter>>8); // Sui LED gialli vanno gli ultimi 8 bits shifter=~shifter; // Ripristina il valore della variabile if(inportb(SW) & 0x01) // Anche il banco dei Dip Switch funziona in { // Logica negata. Se Dip 8 e' OFF (il bit e' 1) shifter=shifter<<1; // Fa scorrere a sinistra i bits di shifter } else { shifter=shifter>>1; // Fa scorrere a sinistra i bits di shifter } for(delay=0; delay<20000; delay++) ; // Ritardo per limitare ad un valore visibile // Il numero di scorrimenti } } while(1); // Ripeti all'infinito } // // ****************************** Fine del main ****************************** // 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; } 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 *************************** //