Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //program.c
- #define io_8255 0x80
- #define io_8253 0x100
- #define io_8259 0x200
- #define adr_8255_0 io_8255
- #define adr_8255_1 (io_8255 + 2)
- #define adr_8255_2 (io_8255 + 4)
- #define adr_8255_3 (io_8255 + 6)
- #define adr_8253_0 io_8253
- #define adr_8253_1 (io_8253 + 2)
- #define adr_8253_2 (io_8253 + 4)
- #define adr_8253_3 (io_8253 + 6)
- #define adr_8259_0 io_8259
- #define adr_8259_1 (io_8259 + 2)
- typedef unsigned char Byte8;
- typedef unsigned short Word16;
- void outp(Word16 addr, Byte8 data) {
- _asm{
- push ax
- push dx
- mov dx, addr
- mov al, data
- out dx, ax
- pop dx
- pop ax
- }
- }
- Byte8 inp(Word16 addr) {
- Byte8 result;
- _asm{
- push dx
- mov dx, addr
- in al, dx
- mov result, al
- pop dx
- }
- return result;
- }
- // tajmer
- void init8253(){
- outp(adr_8253_3, 0x56); // cnt1 radi osvezavanje na displeju
- outp(adr_8253_1, 0x10); // na 16 otkucaja timera se generise prekid
- outp(adr_8253_3, 0x36); // cnt0 generise prekid na svaku sekundu
- outp(adr_8253_0, 0xe8); // na 1000 otkucaja tajmera se generise prekid
- outp(adr_8253_0, 0x03); // 1000 = 0x3e8h
- }
- // paralelni port
- void init8255(){
- outp(adr_8255_3, 0x80);
- outp(adr_8255_0, 0xFF);
- }
- // kontroler prekida
- void init8259(){
- outp(adr_8259_0, 0x13); // icw1
- outp(adr_8259_1, 0x20); // icw2
- outp(adr_8259_1, 0x01); // icw4
- outp(adr_8259_1, 0xf8); // ocw1
- outp(adr_8259_0, 0x0b); // ocw3
- }
- Byte8 pozicija = 0;
- Byte8 cifre[] = {0, 0, 0, 0};
- Byte8 min = 0, sec = 0;
- Byte8 dekodujCifru(Byte8 cifra){
- Byte8 ret;
- switch(cifra){
- case 0:
- ret = 0x3f;
- break;
- case 1:
- ret = 0x06;
- break;
- case 2:
- ret = 0x5b;
- break;
- case 3:
- ret = 0x4f;
- break;
- case 4:
- ret = 0x66;
- break;
- case 5:
- ret = 0x6d;
- break;
- case 6:
- ret = 0x7d;
- break;
- case 7:
- ret = 0x07;
- break;
- case 8:
- ret = 0x7f;
- break;
- case 9:
- ret = 0x6f;
- break;
- default:
- ret = 0x00;
- break;
- }
- return ret;
- }
- Byte8 dohvatiCifru(Byte8 pozicija){
- Byte8 ret;
- if(pozicija > 3){
- ret = 10;
- } else {
- ret = cifre[pozicija];
- }
- return ret;
- }
- void pritisnutoDugme(){
- Byte8 i;
- min = 0;
- sec = 0;
- for(i=0; i<4; i++){
- cifre[i] = 0;
- }
- }
- void osveziDisplej(){
- Byte8 cifraZaPrikaz, zaPrikaz;
- outp(adr_8255_0, 0xFF); // ugasi displej
- pozicija = (pozicija + 1) % 4;
- // zaPrikaz = dohvatiCifru(pozicija);
- cifraZaPrikaz = cifre[pozicija];
- zaPrikaz = dekodujCifru(cifraZaPrikaz);
- outp(adr_8255_1, zaPrikaz);
- outp(adr_8255_0, ~(0x01 << pozicija));
- }
- void inkrementirajVreme(){
- sec++;
- if(sec == 60){
- sec = 0;
- min++;
- if(min == 60){
- min = 0;
- }
- }
- cifre[0] = min / 10;
- cifre[1] = min % 10;
- cifre[2] = sec / 10;
- cifre[3] = sec % 10;
- }
- void interrupt prekidnaRutina() {
- Byte8 irLevel, isr, maska = 0x01;
- isr = inp(adr_8259_0);
- for(irLevel = 0; irLevel < 4; irLevel++){
- if(isr & maska)
- break;
- maska <<= 1;
- }
- switch(irLevel){
- case 0:
- pritisnutoDugme();
- outp(adr_8259_0, 0x60 | irLevel);
- break;
- case 1:
- inkrementirajVreme();
- outp(adr_8259_0, 0x60 | irLevel);
- break;
- case 2:
- osveziDisplej();
- outp(adr_8259_0, 0x60 | irLevel);
- break;
- default:
- break;
- }
- }
- void glavnaFunkcija() {
- init8253();
- init8255();
- init8259();
- _asm sti;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement