#include #include #include #define DATA_A 0x6f1c /* Data adresse 8274 port A */ #define KNTR_A 0x7f1c /* Kntr adresse 8274 port A */ #define DATA_B 0x6f1e /* Data adresse 8274 port B */ #define KNTR_B 0x7f1e /* Kntr adresse 8274 port B */ #define INN_PORT 0x0f1e /* Adr. INN-port KORT 1 */ #define UT_PORT 0x0f1c /* Adr UT-port KORT 1 */ #define KNT_8254 0x9f1e /* Kntr. adr 8254 */ #define ADR_CH0 0x8f1c /* Data-adresse 8254 ch0 */ #undef inportb() #undef outportb() /* Initialiserings-tabell for port A */ unsigned char init_tabell_a[15] = { 0x18, /* RESET port A */ 0x14,0x4f, /* x16,2 stopp bit,even par,En-par */ 0x13,0xc1, /* 8 bit,ikke auto en.,aktiviser Rx */ 0x15,0x68, /* 8 bit, aktiviser Tx, */ 0x12,0x00, /* Ikke vektor, begge avbrudd */ 0x11,0x00, /* Ingen avbrudd */ 0xff }; /* Initialiserings-tabell for port B */ unsigned char init_tabell_b[15] = { 0x18, /* RESET port B */ 0x14,0x4f, /* x16,2 stopp bit,even par,En-par */ 0x13,0xc1, /* 8 bit,ikke auto en.,aktiviser Rx */ 0x15,0x68, /* 8 bit, aktiviser Tx, */ 0x12,0x00, /* Dummy avbrudds-vektor */ 0x11,0x00, /* Ingen avbrudd */ 0xff }; /* Funksjons-deklarasjoner : */ void Init8274(int port_adr,unsigned char init_tabell[]); void send8274(unsigned kntr_adr,unsigned data_adr,unsigned char data); unsigned char les8274(unsigned kntr_adr, unsigned data_adr); void Init8254(void); void vent(void); main() { unsigned char lest_innport; unsigned char lest_innport0; unsigned char lest8274; Init8254(); /* Initialiser bit-raten */ Init8274(KNTR_A,init_tabell_a); /* Initialiser 8274 */ Init8274(KNTR_B,init_tabell_b); /* Bryterne leses, ved forandring sendes byten ut via 8274 port A, leses inn via 8274 port B og skrives ut på lamper og skjerm. Lesning og skriving av 8274 skjer ved polling. */ lest_innport0 = 0; do { lest_innport = inportb(INN_PORT); if(lest_innport != lest_innport0) { send8274(KNTR_A,DATA_A,lest_innport); lest8274 = les8274(KNTR_B,DATA_B); printf("Sendt %2x lest tilbake %2x\n", (int)lest_innport,(int)lest8274); lest_innport0 = lest_innport; outportb(UT_PORT,lest8274); } }while(kbhit() == 0); /* Trykk på en tast vil avslutte */ getch(); /* Tøm buffer */ } /* Initialiserer 8254 kanal 0 til bit-rate generator */ void Init8254() { outportb(KNTR8254,0x16); /* 8254 kanal 0 til modus 3 */ outportb(ADR_CH0,26); /* Gir bit-rate 9600 */ } /* Leser 8274 port B ved polling */ unsigned char les8274(unsigned kntr_adr, unsigned data_adr) { char tegn_i_buffer = {1}; /* Rx flagget er bit 0 */ unsigned j; j = inportb(kntr_adr); /* Sørg for at reg. 0 leses */ do { j = inportb(kntr_adr); /* Vent på data */ } while((j & tegn_i_buffer) == 0); j = inportb(data_adr); /* Les data */ return j; } /* Sender data ut via 8274 port A ved polling */ void send8274(unsigned kntr_adr,unsigned data_adr,unsigned char data) { char buffer_tomt = {4}; /* Tx flagget er bit 2 */ unsigned char j; j = inportb(kntr_adr); /* Pek på reg. 0 */ do { j = inportb(kntr_adr); /* Vent til Tx-reg. tomt */ } while( (j & buffer_tomt) == 0 ); outportb(data_adr,data); /* Send data ut */ } /* Initialiser 8274 ved å sende init_tabellen. Avsluttes med 0xff */ void Init8274(int port_adr,unsigned char init_tabell[]) { int i; i = 0; while(init_tabell[i] != (unsigned char)0xff) { outportb(port_adr,init_tabell[i]); vent(); i++; } } /* Venteløkke */ void vent() { long l; for(l=1; l<=800000l; l++); }