$TITLE (SATELLITE NAVIGATOR remote display driver, Ver 0.0) $DATE (11.11.89) $PROCESSOR (8051) $PAGEWIDTH (110) $PAGELENGTH (65) $NOSYMBOLS $NOLIST ;$XREF ;AUTOR Leon Kos, Cerknica C.4.MAY 11A, 61380 Cerknica, Tel:(061)791084 YU START_UP CODE 0032H TIMER0_INT CODE 000BH TIMER1_INT CODE 001BH SERIAL_INT CODE 0023H LAT EQU 8000H ;naslov za LATITUDE vrsto LON EQU 8001H ;naslov za LONGITUDE vrsto HDG EQU 8002H ;naslov za HEADING vrsto SPD EQU 8003H ;naslov za SPEED vrsto MUX EQU 8004H ;naslov za MULTIPLEX kolono DA_LSB BIT P3.3 ;LSB D/A konverterja za osvetlitev displaya DA_NSB BIT P3.4 ;NSB D/A DA_MSB BIT P3.5 ;MSB D/A ;Timer_0 reload value; Cas v ms za refresh displaya T0_REL EQU 0FFFFH - 1667 + 1 ;100Hz refresh za display T0_REL_HI EQU HIGH T0_REL ;High reload value 1667 <- 1e6/[6*100] T0_REL_LO EQU LOW T0_REL ;Low reload value ;Timer_1 reload value za baud rate generator serijskega interfacea ;Timer_1 se uporablja kot "16 bit cascaded" pri hitrostih pod 300 BAUD ;Sicer je Timer_1 uporabljen kot "auto reload" za visje hitrosti prenosa RCAP1L EQU R6 ;Uporabimo R6 in R7 za reload RCAP1H EQU R7 ;timerja_1 BUF_LEN EQU 30 ;Velikost serijskega bufferja WENS DATA 2FH ;WestEastNorthSouth maska NORTH BIT 7EH ;Bit naslov za sever indikator WEST BIT 7FH ;Bit naslov za zahod indikator ;Jumperji za nastavitev konfiguracije imajo sledece funkcije ; X6, X13, X14 == P1.2, P1.1, P1.0 >> osem nivojev osvetlitve displaya ; X2, X4, X5 == P1.5, P1.4, P1.3 >> osem hitrosti prenosa podatkov ; 50,100,110,150,300,1200,2400,4800 BAUD ; X7 == P1.6 >> rezerva ; TIPKA BIT P1.7 ;Bit naslov tipke za nastavitev svetlobe DSEG AT 30H ;Tabela 7 segmentnih vrednosti za display refresh COL_0: DS 4 ;tabela za refresh displaya COL_1: DS 4 ;je orientirana po kolonah COL_2: DS 4 ;od leve proti desni COL_3: DS 4 COL_4: DS 4 COL_5: DS 4 RFSHC: DS 1 ;stevec za refresh KEYC : DS 1 ;stevec za tipko LIGHT: DS 1 ;trenutna osvetlitev BUF_BEG:DS 1 ;kazalec na zacetek serijskega bufferja BUF_END:DS 1 ;kazalec na konec bufferja BUFFER: DS BUF_LEN ;buffer sa serijski port STACK: CSEG AT RESET JMP START_UP CSEG AT TIMER0_INT ;Skok v rutino za JMP REFRESH ;osvezevanje displayev JMP DISPLAY_SERVER ;To je samo testiranje CSEG AT TIMER1_INT ;Baud rate generator za hitrosti MOV TL1,RCAP1L ;50, 100, 110 in 150 baud MOV TH1,RCAP1H RETI CSEG AT SERIAL_INT JMP SERIAL_SERVER ;Klici Rutino za polnjenje bufferja CSEG AT START_UP ; START_UP() CLR EA ;onemogoci prekinitve MOV SP,#STACK ;Nastavi Sklad CALL CLRD ;Brisi Display oz. iskljuci MUX MOV BUF_BEG,#BUFFER ;Nastavimo kazalec na zacetek bufferja MOV BUF_END,BUF_BEG ;Kazalec na konec tabele je enak zacetku CALL CLR_TAB ;Brisi tabelo MOV RFSHC,#0 ;Nastavi stevec za refresh CALL CLRD ;Brisi Display oz. iskljuci MUX CALL INIT_TIMER_0 ;Nastavi in pozeni Timer_0 CALL SET_BAUD ;Nastavimo Baud Rate serijskega porta SETB EA ;Omogoci prekinitve SETB TR0 ;Pozeni Timer_0 MOV A,P1 ;Beremo jakost displaya CALL INI_LIT ;in klicemo nastavitev osvetlitve MOV WENS,#00H ;Brisi WENS CALL OUT_OLEO ; MOV R0,#100 ;4.0s zakasnitve ; CALL DELAY CYC: CALL OBT_KEY JMP CYC CALL DUMP_HEX JMP $ ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * OBT_KEY: ; OBT_KEY() JB TIPKA,OBK_OUT ;skoci ce ni tipka pritisnjena MOV A,#20 ;tipka je pritisnjena CJNE A,KEYC,OBK_NE ;ali je doseznen cas med pritiski OBK_NE: JNC OBK_LOW ;IF zahtevan cas > trenutni cas CPL WEST CPL NORTH INC LIGHT ;povecaj osvetlitev MOV A,LIGHT ;pripravi podatek CALL SET_LIT ;in nastavi osvetlitev OBK_LOW:MOV KEYC,#0 ;resetiraj stevec OBK_OUT:RET ;Nastavi Timer_0 za osvezevanje displaya in ga pozeni ;Timer0 in Timer_1 16 bit cascaded INIT_TIMER_0: MOV TMOD,#00010001B ;Nastavi nacin dela MOV TH0,#0FFH ;Timer bo takoj po zagonu preknil in MOV TL0,#253 ;izvedel refresh SETB ET0 ;Omogoci prekinitve Timerja_0 RET ;Nastavimo Baud Rate Serijskega porta ;Brez parametrov - podatek se bere z porta P1 in jumperjev ;Uporablja A, DPTR, R0, R1, R2 SET_BAUD: ; SET_BAUD() MOV COL_0,#NOT 01111100B ;B izpise na display MOV COL_1,#NOT 01110011B ;P {BPS = bits per second} MOV COL_2,#NOT 11101101B ;S MOV COL_5,#NOT 00111111B ;0 MOV COL_5+2,#NOT 00111111B ;0 CLR TR1 ;Ustavi timer_1 CLR ET1 ;Onemogoci prekinitve timerja_1 CLR ES ;Onemogoci prekinitve serijskega porta MOV SCON,#01011100B ;Mode 1, Enable reception,CLR TI & RI MOV A,P1 ;Beri P1 RR A ;premakni 3 bite v desno RR A RR A ANL A,#111B ;brisi odvecne bite MOV DPTR,#SB_JMPTBL ;Nastavi kazalec na tabelo MOVC A,@A+DPTR ;Izracunaj skok JMP @A+DPTR ;Skoci v rutino SB_JMPTBL: ;Tabela skokov DB SB_50 - SB_JMPTBL DB SB_100 - SB_JMPTBL DB SB_110 - SB_JMPTBL DB SB_150 - SB_JMPTBL DB SB_300 - SB_JMPTBL DB SB_1200 - SB_JMPTBL DB SB_2400 - SB_JMPTBL DB SB_4800 - SB_JMPTBL SB_50: MOV TMOD, #00010001B ;Timer_1 in Timer_0 16bit casc. MOV PCON, #10000000B ;SETB SMOD ;Tocno 2403.84615 BAUD MOV RCAP1L,#LOW (0FFFFH - 1250 +1) MOV RCAP1H,#HIGH(0FFFFH - 1250 +1) ;Tocno 50.0000 BAUD MOV PCON,#10000000B ;SETB SMOD SETB PT1 ;Timer_1 ima najvecjo prioriteto SETB TR1 ;Pozeni Timer_1 SETB ET1 ;Omogoci prekinitve Timerja_1 SETB ES ;Enable serial MOV A,#5 ;Izpisi '5' na display PUSH ACC CALL HEX_TO_7 POP COL_5 RET ;vrni se SB_100: MOV TMOD, #00010001B ;Timer_1 in Timer_0 16bit casc. MOV RCAP1L,#LOW (0FFFFH - 625 +1) ;6.25ms = 1/100/16*1e6 MOV RCAP1H,#HIGH(0FFFFH - 625 +1) ;Tocno 100.0000 BAUD MOV PCON,#10000000B ;SETB SMOD SETB PT1 ;Timer_1 ima najvecjo prioriteto SETB TR1 ;Pozeni Timer_1 SETB ET1 ;Omogoci prekinitve Timerja_1 SETB ES ;Enable serial MOV A,#1 ;Izpisi '1' na display PUSH ACC CALL HEX_TO_7 POP COL_4 RET ;vrni se SB_110: MOV TMOD, #00010001B ;Timer_1 in Timer_0 16bit casc. MOV RCAP1L,#LOW (0FFFFH - 568 +1) ;5.68ms = 1/110/16*1e6 MOV RCAP1H,#HIGH(0FFFFH - 568 +1) ;Tocno 110.03521 BAUD MOV PCON,#10000000B ;SETB SMOD SETB PT1 ;Timer_1 ima najvecjo prioriteto SETB TR1 ;Pozeni Timer_1 SETB ET1 ;Omogoci prekinitve Timerja_1 SETB ES ;Enable serial MOV A,#1 ;Izpisi '110' na display PUSH ACC CALL HEX_TO_7 POP COL_4 INC SP POP COL_5 RET SB_150: MOV TMOD, #00010001B ;Timer_1 in Timer_0 16bit casc. MOV RCAP1L,#LOW (0FFFFH - 417 +1) MOV RCAP1H,#HIGH(0FFFFH - 417 +1) ;Tocno 149.88001 BAUD MOV PCON,#1000000B ;SETB SMOD SETB PT1 ;Timer_1 ima najvecjo prioriteto SETB TR1 ;Pozeni Timer_1 SETB ET1 ;Omogoci prekinitve Timerja_1 SETB ES ;Enable serial MOV A,#1 ;Izpisi '150' na display PUSH ACC CALL HEX_TO_7 POP COL_4 MOV A,#5 PUSH ACC CALL HEX_TO_7 POP COL_5 RET SB_300: MOV PCON, #10000000B ;SETB SMOD ;Tocno 300.48077 BAUD MOV TMOD, #00100001B ;Timer_1 autoreload, Timer_0 16bit casc. MOV TH1,#48 ;Reload vrednost Timerja_1 SETB TR1 ;Pozeni Timer_1 CLR ET1 ;Onemogoci prekinitev timerja_1 CLR PT1 ;Brisi visjo prioriteto Timerja_1 SETB ES ;Enable serial MOV A,#3 ;Izpisi 300 na display PUSH ACC CALL HEX_TO_7 POP COL_4 RET SB_1200:MOV PCON, #10000000B ;SETB SMOD ;Tocno 1201.92308 BAUD MOV TMOD, #00100001B ;Timer_1 autoreload, Timer_0 16bit casc. MOV TH1,#204 ;Reload vrednost Timerja_1 SETB TR1 ;Pozeni Timer_1 CLR ET1 ;Onemogoci prekinitev timerja_1 CLR PT1 ;Brisi visjo prioriteto Timerja_1 SETB ES ;Enable serial MOV A,#1 ;Izpisi 1200 na display PUSH ACC CALL HEX_TO_7 POP COL_3 MOV A,#2 PUSH ACC CALL HEX_TO_7 POP COL_4 RET SB_2400:MOV PCON, #10000000B ;SETB SMOD ;Tocno 2403.84615 BAUD MOV TMOD, #00100001B ;Timer_1 autoreload, Timer_0 16bit casc. MOV TH1,#230 ;Reload vrednost Timerja_1 CLR ET1 ;Onemogoci prekinitev timerja_1 CLR PT1 ;Brisi visjo prioriteto Timerja_1 SETB TR1 ;Pozeni Timer_1 SETB ES ;Enable serial MOV A,#2 ;Izpisi 2400 na display PUSH ACC CALL HEX_TO_7 POP COL_3 MOV A,#4 PUSH ACC CALL HEX_TO_7 POP COL_4 RET SB_4800:MOV PCON, #10000000B ;SETB SMOD ;Tocno 4807.69231 BAUD MOV TMOD, #00100001B ;Timer_1 autoreload, Timer_0 16bit casc. MOV TH1,#243 ;Reload vrednost Timerja_1 SETB TR1 ;Pozeni Timer_1 CLR ET1 ;Onemogoci prekinitev timerja_1 CLR PT1 ;Brisi visjo prioriteto Timerja_1 SETB ES ;Enable serial MOV A,#4 ;Izpisi 4800 na display PUSH ACC CALL HEX_TO_7 POP COL_3 MOV A,#8 PUSH ACC CALL HEX_TO_7 POP COL_4 RET ;Vrni se ;Set Light - Nastavitev jakosti osvetlitve displaya ;v A registru podamo osvetlitev ;Uporablja: A, DPTR INI_LIT: ; SET_LIT(A) MOV COL_0+1,#NOT 00111000B ; L - izpis na display MOV COL_1+1,#NOT 00000110B ; I MOV COL_2+1,#NOT 01111101B ; G MOV COL_3+1,#NOT 01110110B ; H MOV COL_4+1,#NOT 11111000B ; t SET_LIT:ANL A,#111B ;Odrezi odvecne bite MOV LIGHT,A ;zapisi trenutno osvetlitev v spomin PUSH ACC ;Izpisi jakost na display [0..7] CALL HEX_TO_7 POP COL_5+3 MOV DPTR,#SL_JMPTBL ;Nastavi kazalec na tabelo MOVC A,@A+DPTR ;Izracunaj skok JMP @A+DPTR ;Skoci v rutino SL_JMPTBL: ;Tabela skokov DB SL_0 - SL_JMPTBL DB SL_1 - SL_JMPTBL DB SL_2 - SL_JMPTBL DB SL_3 - SL_JMPTBL DB SL_4 - SL_JMPTBL DB SL_5 - SL_JMPTBL DB SL_6 - SL_JMPTBL DB SL_7 - SL_JMPTBL SL_0: SETB DA_LSB ;Rutin za nastavljanje SETB DA_NSB ;jakosti displaya SETB DA_MSB RET SL_1: CLR DA_LSB SETB DA_NSB SETB DA_MSB RET SL_2: SETB DA_LSB CLR DA_NSB SETB DA_MSB RET SL_3: CLR DA_LSB CLR DA_NSB SETB DA_MSB RET SL_4: SETB DA_LSB SETB DA_NSB CLR DA_MSB RET SL_5: CLR DA_LSB SETB DA_NSB CLR DA_MSB RET SL_6: SETB DA_LSB CLR DA_NSB CLR DA_MSB RET SL_7: CLR DA_LSB CLR DA_NSB CLR DA_MSB RET ;Brisi tabelo 7 segmentnih podatkov za display ;Uporablja: R0 ,R1 CLR_TAB: ; CLR_TAB() MOV R0,#24 ;24 polj brisi MOV R1,#COL_0 ;zacni s prvim elementom tabele CLR_TC: MOV @R1,#0FFH ;vstavljaj 0FFH INC R1 ;in povecuj kazalec DJNZ R0,CLR_TC ;ponavljaj se za naslednje RET ;Brisi display ;Uporablja: DPTR, A CLRD: ; CLR_D() MOV DPTR,#MUX ;izberi MUX kolone MOV A,#00H ; MOVX @DPTR,A ;Azuriraj MUX RET ;vrni se ;Konverzija iz ASCII v HEX (0..9) ;Na skladu je vhodni in izhodni podatek ;Uporablja R0 ASC_HEX: ;Function ASC_HEX(A) MOV R0,SP ;Pripravi kazalec na skladu DEC R0 DEC R0 XCH A,@R0 ;Zamenjaj A in ASCII podatek CLR C ;Brisi C SUBB A,#'0' ;Odstej XCH A,@R0 ;Izmenjaj HEX in ACC na skladu RET ;Vrni se ;Konverzija iz HEX v 7 segment ;Na skladu je vhodni in izhodni podatek ;Uporablja R0 HEX_TO_7: ;Function HEX_TO_7(A) MOV R0,SP ;Beri sklad DEC R0 ;Nastavi R0 za DEC R0 ;parameter XCH A,@R0 ANL A,#0FH ADD A,#2 MOVC A,@A+PC XCH A,@R0 RET SEVTBL: DB NOT 00111111B ;Char 0 DB NOT 00000110B ;Char 1 DB NOT 01011011B ;Char 2 DB NOT 01001111B ;Char 3 DB NOT 01100110B ;Char 4 DB NOT 01101101B ;Char 5 DB NOT 01111101B ;Char 6 DB NOT 00000111B ;Char 7 DB NOT 01111111B ;Char 8 DB NOT 01101111B ;Char 9 DB NOT 01110111B ;Char A DB NOT 01111100B ;Char B DB NOT 00111001B ;Char C DB NOT 01011110B ;Char D DB NOT 01111001B ;Char E DB NOT 01110001B ;Char F ;Interrupt rutina za osvezevanje displaya REFRESH: ;Interrupt REFRESH() MOV TL0,#T0_REL_LO ;1C Nastavi Timer_0 MOV TH0,#T0_REL_HI ;1C se high vrednost PUSH PSW ;2C PUSH ACC ;2C PUSH DPL ;2C PUSH DPH ;2C MOV A,KEYC ;kontroliramo ali je stevec za tipko INC A ;dosegel stevilko 255 JZ RFSH_NI ;ce jo je potem ne povecujemo vec INC KEYC ;Povecamo casovni stevec za tipko RFSH_NI:MOV A,WENS ;1C Brisemo kolone ANL A,#11000000B ;1C MOV DPTR,#MUX ;2C MOVX @DPTR,A ;2C MOV A,RFSHC ;1C Povecamo RFSHC za 1 in MOV DPTR,#JMPTBL ;2C izracunamo skok MOVC A,@A+DPTR ;2C JMP @A+DPTR ;2C JMPTBL: DB DISPLAY_0 - JMPTBL ;Tabela skokov DB DISPLAY_1 - JMPTBL DB DISPLAY_2 - JMPTBL DB DISPLAY_3 - JMPTBL DB DISPLAY_4 - JMPTBL DB DISPLAY_5 - JMPTBL DISPLAY_0: MOV A,COL_0 ;1C Osvezimo posamezne MOV DPTR,#LAT ;2C vrstice MOVX @DPTR,A ;2C MOV A,COL_0 + 1 ;1C MOV DPTR,#LON ;2C MOVX @DPTR,A ;2C MOV A,COL_0 + 2 ;1C MOV DPTR,#HDG ;2C MOVX @DPTR,A ;2C MOV A,COL_0 + 3 ;1C MOV DPTR,#SPD ;2C MOVX @DPTR,A ;2C CLR A ;1C prizgemo ustrezne ORL A,WENS ;1C kolone ORL A,#00000001B ;1C MOV DPTR,#MUX ;2C MOVX @DPTR,A ;2C INC RFSHC ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds DISPLAY_1: MOV A,COL_1 ;Osvezimo posamezne MOV DPTR,#LAT ;vrstice MOVX @DPTR,A MOV A,COL_1 + 1 MOV DPTR,#LON MOVX @DPTR,A MOV A,COL_1 + 2 MOV DPTR,#HDG MOVX @DPTR,A MOV A,COL_1 + 3 MOV DPTR,#SPD MOVX @DPTR,A CLR A ;prizgemo ustrezno ORL A,WENS ;kolono ORL A,#00000010B MOV DPTR,#MUX MOVX @DPTR,A INC RFSHC ;1C Izberemo naslednjo POP DPH POP DPL POP ACC POP PSW RETI ;in se vrnemo iz interupta DISPLAY_2: MOV A,COL_2 ;Osvezimo posamezne MOV DPTR,#LAT ;vrstice MOVX @DPTR,A MOV A,COL_2 + 1 MOV DPTR,#LON MOVX @DPTR,A MOV A,COL_2 + 2 MOV DPTR,#HDG MOVX @DPTR,A MOV A,COL_2 + 3 MOV DPTR,#SPD MOVX @DPTR,A CLR A ;prizgemo ustrezno ORL A,WENS ;kolono ORL A,#00000100B MOV DPTR,#MUX MOVX @DPTR,A INC RFSHC ;1C Izberemo naslednjo POP DPH POP DPL POP ACC POP PSW RETI ;in se vrnemo iz interupta DISPLAY_3: MOV A,COL_3 ;Osvezimo posamezne MOV DPTR,#LAT ;vrstice MOVX @DPTR,A MOV A,COL_3 + 1 MOV DPTR,#LON MOVX @DPTR,A MOV A,COL_3 + 2 MOV DPTR,#HDG MOVX @DPTR,A MOV A,COL_3 + 3 MOV DPTR,#SPD MOVX @DPTR,A CLR A ;prizgemo ustrezno ORL A,WENS ;kolono ORL A,#00001000B MOV DPTR,#MUX MOVX @DPTR,A INC RFSHC ;1C Izberemo naslednjo POP DPH POP DPL POP ACC POP PSW RETI ;in se vrnemo iz interupta DISPLAY_4: MOV A,COL_4 ;Osvezimo posamezne MOV DPTR,#LAT ;vrstice MOVX @DPTR,A MOV A,COL_4 + 1 MOV DPTR,#LON MOVX @DPTR,A MOV A,COL_4 + 2 MOV DPTR,#HDG MOVX @DPTR,A MOV A,COL_4 + 3 MOV DPTR,#SPD MOVX @DPTR,A CLR A ;prizgemo ustrezno ORL A,WENS ;kolono ORL A,#00010000B MOV DPTR,#MUX MOVX @DPTR,A INC RFSHC ;1C Izberemo naslednjo POP DPH POP DPL POP ACC POP PSW RETI ;in se vrnemo iz interupta DISPLAY_5: MOV A,COL_5 ;Osvezimo posamezne MOV DPTR,#LAT ;vrstice MOVX @DPTR,A MOV A,COL_5 + 1 MOV DPTR,#LON MOVX @DPTR,A MOV A,COL_5 + 2 MOV DPTR,#HDG MOVX @DPTR,A MOV A,COL_5 + 3 MOV DPTR,#SPD MOVX @DPTR,A CLR A ;prizgemo ustrezno ORL A,WENS ;kolono ORL A,#00100000B MOV DPTR,#MUX MOVX @DPTR,A MOV RFSHC,#0 ;Brisi stevec na nulo POP DPH POP DPL POP ACC POP PSW RETI ;in se vrnemo iz interupta ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;Interrupt rutina serijskega porta za polnjenje cirkularnega bufferja ;Poveca se kazalec na konec bufferja in na mesto kamor kaze buffer se ;vpise vrednost SBUF registra SERIAL_SERVER: ;Interrupt SERIAL_SERVER() CLR RI ;omogoci sprejem sledecega byta PUSH PSW ;shrani pomembne PUSH ACC ;registre MOV PSW,#00001000B ;2C Izberi REGISTER BANK 1 MOV R0,BUF_END ;R0 kaze na mesto MOV @R0,SBUF ;ki ga je potrebno zapolniti INC BUF_END ;Povecamo kazalec MOV A,BUF_END ;na konec bufferja ;Kontroliramo ali je kazalec na konec ;prekoracil vrh bufferja CJNE A, #BUFFER+BUF_LEN, SS_NOT_TOP ; ce ni vrh skoci MOV BUF_END,#BUFFER ;vrh je dosezen -> kazalec na dno MOV A,BUF_END SS_NOT_TOP: CJNE A,BUF_BEG,SS_BUF_OK ;Kontroliramo polnost bufferja MOV A,#0 JMP ERROR ;Buffer je prepolnjen->izpisi napako 0 SS_BUF_OK: POP ACC POP PSW RETI ;Izpise "error" na display in stevilko napake ;V Akumulatorju mora biti stevilka napake 0..0FH ; 0 -> Serial buffer prepolnjen ERROR: ; ERROR(A) CLR TR1 ;ustavi timer_1 in serial port CALL CLR_TAB ;Brisi tabelo PUSH ACC ;Vrednost v A CALL HEX_TO_7 ;pretvori v 7 segment POP ACC MOV COL_5+2,A ;vstavi stevilko v tabelo MOV COL_0,#NOT 01111011B ;'e' MOV COL_1,#NOT 00110001B ;'r' MOV COL_2,#NOT 00110001B ;'r' MOV COL_3,#NOT 00111111B ;'o' MOV COL_4,#NOT 00110001B ;'r' MOV R0,#200 ;Nastavi cakanje 20.0 s CALL DELAY ;in klici rutino za delay JMP RESET ;nato resetiraj sistem RET ;RET je kar tako ;Zakasnitev oziroma tratenje casa v desetinkah sekunde ;Parameter za delay R0 ;Uporablja R0, R1, R2 DELAY: ;Cakaj nekaj casa DEL_L0: MOV R1,#200 ;0.1s delay DEL_L1: MOV R2,#248 ;0.5ms delay DJNZ R2, $ DJNZ R1,DEL_L1 DJNZ R0,DEL_L0 RET ;Interrupt rutina za osvezevanje displaya >> SAMO ZA testiranje DISPLAY_SERVER: ;Interrupt DISPLAY_SERVER () MOV TL0,#T0_REL_LO ;1C Nastavi Timer_0 MOV TH0,#T0_REL_HI ;1C se high vrednost ; MOV P1,#0FFH PUSH PSW ;2C PUSH ACC ;2C PUSH DPL ;2C PUSH DPH ;2C MOV A,RFSHC ;1C Povecamo RFSHC za 1 in MOV DPTR,#DS_JMPTBL ;2C izracunamo skok MOVC A,@A+DPTR ;2C JMP @A+DPTR ;2C DS_JMPTBL: DB D_0 - DS_JMPTBL ;Tabela skokov DB D_1 - DS_JMPTBL DB D_2 - DS_JMPTBL DB D_3 - DS_JMPTBL DB D_4 - DS_JMPTBL D_0: MOV A,COL_0 ;1C Osvezimo posamezne MOVX @DPTR,A ;2C MOV P1,# NOT 10000000B ;Izberi ustrezno kolono INC RFSHC ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds D_1: MOV A,COL_1 ;1C Osvezimo posamezne MOVX @DPTR,A ;2C MOV P1,# NOT 01000000B ;Izberi ustrezno kolono INC RFSHC ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds D_2: MOV A,COL_2 ;1C Osvezimo posamezne MOVX @DPTR,A ;2C MOV P1,# NOT 00100000B ;Izberi ustrezno kolono INC RFSHC ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds D_3: MOV A,COL_3 ;1C Osvezimo posamezne MOVX @DPTR,A ;2C MOV P1,# NOT 00010000B ;Izberi ustrezno kolono INC RFSHC ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds D_4: MOV A,COL_4 ;1C Osvezimo posamezne MOVX @DPTR,A ;2C MOV P1,# NOT 00001000B ;Izberi ustrezno kolono MOV RFSHC,#0 ;1C Izberemo naslednjo POP DPH ;2C POP DPL ;2C POP ACC ;2C POP PSW ;2C RETI ;2C in se vrnemo iz interupta ;sum = 65Cycles == 65 microseconds ;Rutina izpise decimalna vrednost akumulatorja na display OUTA_DEC: ; OUTA_DEC (A) MOV B,#100 DIV AB PUSH ACC CALL HEX_TO_7 POP COL_0 MOV A,#10 XCH A,B DIV AB PUSH ACC CALL HEX_TO_7 POP COL_1 PUSH B CALL HEX_TO_7 POP COL_2 MOV COL_3,#0 RET ;Rutina izpise heksadecimalna vrednost akumulatorja na display ;Uporablja A, R0, COL_0..2, OUTA_HEX: ; OUTA_HEX (A) PUSH ACC CALL HEX_TO_7 POP COL_2 SWAP A PUSH ACC CALL HEX_TO_7 POP COL_1 RET ;Izpisovanje vhodnih podatkov iz serijskega bufferja v hex na display ;Zanka je neskoncna -> ni izhoda iz nje ;Uporablja A, R0 DUMP_HEX: ; DUMP_HEX () CALL CLR_TAB ;Brisi tabelo DU_WA: MOV A,BUF_BEG ;A<- kazalec na zacetek tabele CJNE A,BUF_END,DU_OK ;ali je buffer prazen JMP DU_WA ;zacetek je enak koncu DU_OK: CALL SHIFT_TABEL ;Napravi prostor za eno HEX[00..FF]mesto MOV R0,BUF_BEG MOV A, @R0 CALL OUTA_HEX ;Izpisi Hex INC BUF_BEG ;povecaj BUF_BEG MOV A,BUF_BEG CJNE A,#BUFFER+BUF_LEN,DU_POK ;ali je zacetek na vrhu MOV BUF_BEG,#BUFFER ;BUF_BEG kaze na zacetek bufferja DU_POK: ;kazalec na zacetek je OK {ni na vrhu} JMP DU_WA ;ponovi isto se za naslednji znak RET ;RET kar tako SHIFT_TABEL: ;napravi prostor za eno stevilko PUSH COL_1 + 3 POP COL_3 + 3 PUSH COL_2 + 3 POP COL_3 + 3 PUSH COL_4 + 2 POP COL_2 + 3 PUSH COL_3 + 2 POP COL_1 + 3 PUSH COL_2 + 2 POP COL_4 + 2 PUSH COL_1 + 2 POP COL_3 + 2 PUSH COL_5 + 3 POP COL_2 + 2 PUSH COL_5 + 1 POP COL_1 + 2 PUSH COL_4 + 1 POP COL_5 + 3 PUSH COL_3 + 1 POP COL_5 + 1 PUSH COL_2 + 1 POP COL_4 + 1 PUSH COL_1 + 1 POP COL_3 + 1 PUSH COL_5 + 2 POP COL_2 + 1 PUSH COL_5 + 0 POP COL_1 + 1 PUSH COL_4 + 0 POP COL_5 + 2 PUSH COL_3 POP COL_5 PUSH COL_2 POP COL_4 PUSH COL_1 POP COL_3 RET ;Izpise na display zascitni znak "OLEO" OUT_OLEO: MOV COL_1+2,#NOT 00111111B ;O MOV COL_2+2,#NOT 00111000B ;L MOV COL_3+2,#NOT 01111001B ;E MOV COL_4+2,#NOT 00111111B ;O MOV COL_1+3,#NOT 00111111B ;O obrnjen MOV COL_2+3,#NOT 01001111B ;E obrnjen MOV COL_3+3,#NOT 00000111B ;L obrnjen MOV COL_4+3,#NOT 00111111B ;O obrnjen RET DB ' The program is provided ''as is'' without waranty of any kind, ' DB 'either expressed or implied, including, but not limited to the ' DB '(implied warranties of merchantability and fittness for a particular ' DB 'purpose. The entire risk as to the quality and to the performance ' DB 'of the program is with you. Should the program prove defective, ' DB 'YOU and NOT AUTOR assume the entire cost of all necessary servicing, ' DB 'repair and correction. ' END