/********************************************************************** ** Programma: S1DEB9.BAS - Versione : 1.0 - 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 la accensione di un LED da destra verso sinistra e di uno da sinistra verso destra. */ #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 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 char shifter1; // Valore che pilota i LED rossi unsigned char shifter2; // Valore che pilota gli altri LED unsigned int delay; // Variabile usata per creare un ritardo iniserb(19200, 8, 1, 0); //Inizializza la seriale B clrscr(); cprintf(" Programma dimostrativo 9 per la sezione 1 della scheda DEB(r) 01\r\n\n"); cprintf(" Muove un LED in una direzione e un altro LED nella direzione opposta.\r\n\n"); cprintf(" Esecuzione in corso...\r\n\n"); outportb(RS, 0x82); // Predispone il port B in input, // I port A e C in output do { shifter1=1; // Posizione iniziale per i LED rossi shifter2=0x80; // Posizione iniziale per gli altri LED while(shifter1!=0) { shifter1=~shifter1; // I led funzionano in logica negata shifter2=~shifter2; outportb(PA, shifter1); // Sui LED rossi vanno i primi 8 bits outportb(PC, shifter2); // Sui LED gialli vanno gli ultimi 8 bits shifter1=~shifter1; shifter2=~shifter2; shifter1=shifter1<<1; // Fa scorrere a sinistra i bits di shifter1 shifter2=shifter2>>1; // Fa scorrere a destra i bits di shifter2 for(delay=0; delay<20000; delay++) ; // Ritardo per limitare ad un valore visibile } shifter1=0x80; // Posizione iniziale per la seconda parte shifter2=1; // Del movimento cioe' l'allontanamento while(shifter1!=0) { shifter1=~shifter1; // I led funzionano in logica negata shifter2=~shifter2; outportb(PA, shifter1); // Sui LED rossi vanno i primi 8 bits outportb(PC, shifter2); // Sui LED gialli vanno gli ultimi 8 bits shifter1=~shifter1; shifter2=~shifter2; shifter1=shifter1>>1; // Fa scorrere a destra i bits di shifter1 shifter2=shifter2<<1; // Fa scorrere a sinistra i bits di shifter2 for(delay=0; delay<20000; delay++) ; // Ritardo per limitare ad un valore visibile } } while(1); // Ripete 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 *************************** //