;******************************************************************************* ;****** DEKLARACE PROMENNYCH *************************************************** LCD EQU P1 ;port LCD B1 EQU P3.2 ;tlačítko MEZIČAS, deklarováno pro ošetření zákmitů B2 EQU P3.3 ;tlačítko START/STOP, deklarováno pro ošetření zákmitů ZP1 EQU 9 ;deklarace proměnných pro zpoždění ZP2 EQU 10 ZP3 EQU 11 BSTART EQU 32.0 ;běží- 1, zastaveno - 0 CHANGE0 EQU 32.1 ;změna = 0 CHANGE1 EQU 32.2 ;změna = 0 CHANGE2 EQU 32.3 ;změna = 0 TEMPA EQU 34 ;pomocná proměnná pro ošetření zákmitů TEMPB EQU 35 ;pomocná proměnná pro ošetření zákmitů TEMPC EQU 36 ;pomocná proměnná pro ošetření zákmitů TEMPD EQU 37 ;pomocná proměnná pro ošetření zákmitů TL EQU 38 ;pomocná proměnná pro zálohování časovače TH EQU 39 ;pomocná proměnná pro zálohování časovače TIML EQU 47 ;konstanty pro nastavení časovače 0 TIMH EQU 48 TSETS EQU 55 ;paměť vymezená pro zálohu času TDESS EQU 54 TJSEC EQU 53 TDSEC EQU 52 TJMIN EQU 51 TDMIN EQU 50 SETS EQU 65 ;paměť vymezená pro měření času DESS EQU 64 JSEC EQU 63 DSEC EQU 62 JMIN EQU 61 DMIN EQU 60 MSETS EQU 75 ;paměť vymezená pro zápis mezičasu MDESS EQU 74 MJSEC EQU 73 MDSEC EQU 72 MJMIN EQU 71 MDMIN EQU 70 ;****** PRERUSOVACI VEKTORY **************************************************** JMP INIT ;uvodni inicializace ORG 003H ;vnejsi preruseni EXT0 JMP EXT0 ORG 00BH ;preruseni od casovace T0 JMP TIMER0 ORG 013H ;vnejsi preruseni EXT1 JMP EXT1 ORG 01BH ;preruseni od casovace T1 JMP TIMER1 ORG 023H ;preruseni od serioveho kanalu JMP SKANAL ORG 02BH ;preruseni od casovace T2 JMP TIMER2 ;****** OBSLUHA VNEJSIHO PRERUSENI 0 ***MEZICAS********************************* EXT0: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW JNB BSTART,FEX0END ;neběží-li stopky, pak se nepřepisuje JMP ZALOH ;zálohuj FEX0END:LJMP EX0END ;skok na konec přerušení (neběží měření) ZALOH: MOV TL,TL0 ;vytvoření zálohy časových údajů MOV TH,TH0 MOV TSETS,SETS MOV TDESS,DESS MOV TJSEC,JSEC MOV TDSEC,DSEC MOV TJMIN,JMIN MOV TDMIN,DMIN ;__DEBOUNCIG_____________ MOV TEMPC,#240 ;přednastavení pro hledání časového úseku MOV TEMPD,#10 BNCA2: MOV TEMPA,#240 MOV TEMPB,#10 DJNZ TEMPC,DOWNB2 MOV TEMPC,#240 DJNZ TEMPD,DOWNB2 JMP EX0END ;vyvoláno pustěním tlačítka, neobsluhuje se DOWNB2: JB B1,BNCA2 MOV TEMPC,#240 MOV TEMPD,#10 DJNZ TEMPA,DOWNB2 MOV TEMPA,#240 DJNZ TEMPB,DOWNB2 ;__DEBOUNCING_END________ ;__ROUNDING_____________________________________________________________ CLR CHANGE0 ;povolení přepsání hodnot mezičasu na LCD CLR C MOV A,TH ;hodnota v rozmezí 177 až 255 ADD A,#40 ;216 + 40 = SET C (přetečení) JC VETSI2 ;zaokrohlení nahoru JMP PREPIS VETSI2: CLR C INC TSETS MOV A,TSETS CJNE A,#10,PREPIS MOV TSETS,#0 INC TDESS MOV A,TDESS CJNE A,#10,PREPIS MOV TDESS,#0 INC TJSEC MOV A,TJSEC CJNE A,#10,PREPIS MOV TJSEC,#0 INC TDSEC MOV A,TDSEC CJNE A,#6,PREPIS MOV TDSEC,#0 MOV TDSEC,#0 INC TJMIN MOV A,TJMIN CJNE A,#10,PREPIS MOV TJMIN,#0 INC TDMIN MOV A,TDMIN CJNE A,#6,PREPIS MOV TDMIN,#0 ;__ROUNDING_END_________________________________________________________ PREPIS: MOV MSETS,TSETS ;přepis zaokrouhlených záloh. hodnot do mezičasu MOV MDESS,TDESS MOV MJSEC,TJSEC MOV MDSEC,TDSEC MOV MJMIN,TJMIN MOV MDMIN,TDMIN EX0END: CLR IE0 ;nulování vektoru přerušení0(součást DEBOUNCING) POP PSW ;obnovení PSW POP ACC ;obnovení ACC RETI ;****** OBSLUHA VNEJSIHO PRERUSENI 1 ***START/STOP****************************** EXT1: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW JB BSTART, STOPT ;testování, zda je již spuštěno měření MOV TL0,#TIML ;přednastavení časovače MOV TH0,#TIMH SETB TR0 ;spuštění časovače ;__DEBOUNCIG_____________ MOV TEMPC,#240 ;přednastavení pro hledání časového úseku MOV TEMPD,#10 BNCA: MOV TEMPA,#240 MOV TEMPB,#10 DJNZ TEMPC,DOWNB MOV TEMPC,#240 DJNZ TEMPD,DOWNB JMP FALSEA ;vyvoláno pustěním tlačítka, neobsluhuje se DOWNB: JB B2,BNCA MOV TEMPC,#240 MOV TEMPD,#10 DJNZ TEMPA,DOWNB MOV TEMPA,#240 DJNZ TEMPB,DOWNB ;__DEBOUNCING_END________ SETB ET0 ;povolení přerušení od časovače SETB BSTART ;nastavení příznaku spuštění měření CLR CHANGE1 ;povolení přepsání hodnot start/stop na LCD CLR CHANGE0 ;povolení přepsání hodnot mezičasu na LCD MOV R0,#60 CLEARM: MOV @R0,#0 ;nulování hodnot času INC R0 MOV A,R0 CJNE A,#67,CLEARM MOV R0,#70 CLEARM2:MOV @R0,#0 ;nulování hodnot mezičasu INC R0 MOV A,R0 CJNE A,#77,CLEARM2 SETB EX0 ;povolení přerušení od vnějšího přerušení 0 JMP EX1END ;skok na konec přerušení FALSEA: CLR TR0 ;zastavení časovače CLR TF0 ;vymazat vektor od casovace..... JMP EX1END ;skok na konec přerušení STOPT: MOV TL,TL0 ;vytvoření zálohy časových údajů MOV TH,TH0 MOV TSETS,SETS MOV TDESS,DESS MOV TJSEC,JSEC MOV TDSEC,DSEC MOV TJMIN,JMIN MOV TDMIN,DMIN ;__DEBOUNCIG_____________ MOV TEMPC,#240 MOV TEMPD,#10 BNCB: MOV TEMPA,#240 MOV TEMPB,#10 DJNZ TEMPC,DOWNA MOV TEMPC,#240 DJNZ TEMPD,DOWNA JMP EX1END ;vyvoláno pustěním tlačítka, neobsluhuje se DOWNA: JB B2,BNCB MOV TEMPC,#240 MOV TEMPD,#10 DJNZ TEMPA,DOWNA MOV TEMPA,#240 DJNZ TEMPB,DOWNA ;__DEBOUNCING_END________ CLR EX0 ;zakáže přerušení od vnějšího přerušení 0 CLR ET0 ;zakázání přerušení od časovače CLR BSTART ;nulování příznaku spuštění měření CLR TR0 ;zastavení časovače CLR CHANGE1 ;povolení přepsání hodnot start/stop na LCD CLR TF0 ;nulování vektoru přerušení od časovače MOV TL0,TL ;načtení zálohovaných údajů MOV TH0,TH MOV SETS,TSETS MOV DESS,TDESS MOV JSEC,TJSEC MOV DSEC,TDSEC MOV JMIN,TJMIN MOV DMIN,TDMIN ;__ROUNDING_____________________________________________________________ CLR C MOV A,TH0 ;hodnota v rozmezí 177 až 255 ADD A,#40 ;216 + 40 = SET C (přetečení) JC VETSI ;zaokrohlení nahoru JMP EX1END VETSI: CLR C INC SETS MOV A,SETS CJNE A,#10,EX1END MOV SETS,#0 INC DESS MOV A,DESS CJNE A,#10,EX1END MOV DESS,#0 INC JSEC MOV A,JSEC CJNE A,#10,EX1END MOV JSEC,#0 INC DSEC MOV A,DSEC CJNE A,#6,EX1END MOV DSEC,#0 MOV DSEC,#0 INC JMIN MOV A,JMIN CJNE A,#10,EX1END MOV JMIN,#0 INC DMIN MOV A,DMIN CJNE A,#6,EX1END MOV DMIN,#0 ;__ROUNDING_END_________________________________________________________ EX1END: CLR IE1 ;nulování vektoru přerušení1(součást DEBOUNCING) POP PSW ;obnovení PSW POP ACC ;obnovení ACC RETI ;****** OBSLUHA PRERUSENI OD CASOVACE 0 **************************************** ;vyvoláván po 1cs (setině vteřiny) ;maximální čas je 1hod-1cs, při přetečení ;čítá opět od nuly, bez signalizace TIMER0: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW CLR TR0 MOV TL0,TIML ;přednastavení hodnot pro další čítání MOV TH0,TIMH SETB TR0 INC SETS MOV A,SETS CJNE A,#10,TIMEND MOV SETS,#0 INC DESS MOV A,DESS CJNE A,#10,TIMEND MOV DESS,#0 INC JSEC MOV A,JSEC CJNE A,#10,TIMEND MOV JSEC,#0 INC DSEC MOV A,DSEC CJNE A,#6,TIMEND MOV DSEC,#0 MOV DSEC,#0 INC JMIN MOV A,JMIN CJNE A,#10,TIMEND MOV JMIN,#0 INC DMIN MOV A,DMIN CJNE A,#6,TIMEND MOV DMIN,#0 TIMEND: CLR CHANGE2 POP PSW ;obnovení PSW POP ACC ;obnovení ACC RETI ;****** OBSLUHA PRERUSENI OD CASOVACE 1 **************************************** TIMER1: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW POP PSW ;obnovení PSW POP ACC ;obnovení ACC RETI ;****** OBSLUHA PRERUSENI OD CASOVACE 2 **************************************** TIMER2: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW POP PSW ;obnovení PSW POP ACC ;obnovení ACC ANL T2CON,#01111111B ;nulovani priznaku TF2 RETI ;****** OBSLUHA PRERUSENI OD SERIOVEHO KANALU ********************************** SKANAL: PUSH ACC ;uložení ACC PUSH PSW ;uložení PSW POP PSW ;obnovení PSW POP ACC ;obnovení ACC CLR RI ;nulovani priznaku CLR TI ;nulovani priznaku RETI ;******************************************************************************* ;****** UVODNI INICIALIZACE **************************************************** ;******************************************************************************* INIT: MOV SP,#82 ;posunutí zásobníku na adresu 82 v RAM MOV R0,#127 ;nulovani RAM CLRR: MOV @R0,#0 DJNZ R0,CLRR MOV TIML,#0EEH ;konstanta pro nastavení čítače 0 MOV TIMH,#0B1H ;optimalizováno, 45550, delta 19985 MOV TCON,#00000101B ;nastavení vnějších přerušení na sestupnou hranu MOV TMOD,#00010001B ;nastavení čítačů/časovačů - oba v režimu 16bitů MOV TL0,TIML ;přednastavení časovače 0 MOV TH0,TIMH MOV IE,#10000110B ;povolení přerušení (global, ext1, timer0) MOV IP,#00000110B ;vyšší priority pro přerušení ext1 a timer0 CALL LCDINI ;inicializece displeje CALL CLEARD ;vymazání displeje CLR BSTART ;nulování příznaku spuštění měření CLR CHANGE0 ;nulování příznaků pro úvodní zobrazení CLR CHANGE1 CLR CHANGE2 ;vypise "MEZICAS" MOV A,#0 ;do A vloží 0 CALL LINE2 ;přesun kurzoru na řádek 2, na pozici v A MOV DPTR,#TXT5 ;přesun adresy textu TXT5 do DPTR (text MEZICAS) CALL SHOWTXT ;volání podprogramu pro zobrazení textu ;/////////////////////////////// JMP MAIN ;skok na hlavni smycku ;****** HLAVNI PROGRAMOVA SMYCKA *********************************************** MAIN: JB CHANGE2,M1 ;pokud došlo ke změně času, pak se vypíše SETB CHANGE2 MOV A,#8 ;do A vloží 8 CALL LINE1 ;přesun kurzoru na řádek 1, na pozici v A MOV R0,#60 ;od adresy 60 je v RAM uložen měřený čas CALL SHOWT ;volání podprogramu pro zobrazení času/mezičasu M1: JB CHANGE0,M2 ;pokud došlo ke změně mezičasu, pak se vypíše SETB CHANGE0 MOV A,#8 ;do A vloží 8 CALL LINE2 ;přesun kurzoru na řádek 2, na pozici v A MOV R0,#70 ;od adresy 70 je v RAM ulozen mezicas CALL SHOWT ;volání podprogramu pro zobrazení času/mezičasu M2: JB CHANGE1,MAIN ;došlo ke změně, přepíše se START/STOP SETB CHANGE1 JB BSTART,RUN ;není-li příznak nastaven, pak neměří, zobrazuje START MOV A,#0 ;do A vloží 0 CALL LINE1 ;přesun kurzoru na řádek 1, na pozici v A MOV DPTR,#TXT1 ;přesun adresy textu TXT1 do DPTR (text START) CALL SHOWTXT ;volání podprogramu pro zobrazení textu JMP MAIN ;skok na zacatek hlavni smycky RUN: MOV A,#0 ;příznak nastaven, pak měří a na LCD zobrazuje STOP CALL LINE1 ;přesun kurzoru na řádek 1, pozice v A MOV DPTR,#TXT2 ;přesun adresy textu TXT2 do DPTR (text STOP) CALL SHOWTXT ;volání podprogramu pro zobrazení textu JMP MAIN ;skok na zacatek hlavni smycky ;******************************************************************************* ;podprogram pro zobrazení textu, čte data z tabulky ;textů, dokud nedojde na konec řádku symbolizovaného číslem 255. ;vysílá po jednotlivých znacích SHOWTXT:MOV A,#0 MOVC A,@A+DPTR CJNE A,#255,OK RET OK: CALL SDATA INC DPTR JMP SHOWTXT TXT0: DB '.',255 TXT1: DB 'START ',255 TXT2: DB 'STOP ',255 TXT3: DB ':',255 TXT5: DB 'MEZICAS',255 ;****************** PODPROGAMY ************************************************* ;inicializace LCD LCDINI: MOV LCD,#255 CALL DEL1S CALL DEL1S MOV LCD,#0 CALL DEL1S CALL DEL1S MOV R3,#250 DJNZ R3,$ MOV R3,#250 DJNZ R3,$ ;function set, nastavení čtyřbitové komunikace, ;čte se jako osmibitová instrukce #00000010B MOV A,#00000010B CALL SPORT ;function set, nastavení čtyřbitové komunikace, ;nastavení počtu řádků (2), fontu na 5x8 #00101000B MOV A,#00101000B ; 001DLNF-- CALL VYSINST ; display on/off, zapnut (D=1), kurzor vypnut(C=0), blikání kurzoru vypnuto (B=0) MOV A,#00001100B ; 00001DCB CALL VYSINST ;entry mode set, inkrementace o 1 v DDRAM, po zapsani znaku (I/D=1), ;posun celého displeje vypnut (S=0) MOV A,#00000110B ; 000001ISS CALL VYSINST CALL CLEARD RET CLEARD: MOV A,#00000001B ;instrukce pro vymazani displeje MOV R2,#0 ;bez maskování CALL SBYTE CALL DEL2MS CALL DEL2MS RET SNUM: ORL A,#00110000B JMP SDATA VYSINST:MOV R2,#00000000B JMP SBYTE SDATA: MOV R2,#00100000B SBYTE: PUSH ACC SWAP A ANL A,#0FH ;maskování horního niblu pro vyslání, data jsou zachována ORL A,R2 CALL SPORT POP ACC ANL A,#0FH ;maskování horního niblu pro vyslání, data jsou zachována ORL A,R2 CALL SPORT RET LINE2: ORL A,#11100000B ;nastavi kurzor na druhy radek a na poz v A ANL A,#11011111B CALL VYSINST RET LINE1: ORL A,#11100000B ;nastavi kurzor na prvni radek a na poz v A ANL A,#10011111B CALL VYSINST RET SPORT: MOV LCD,A ;vyšle zapíše data na port LCD, zajistí zápis MOV R3,#200 DJNZ R3,$ SETB LCD.4 MOV R3,#200 DJNZ R3,$ CLR LCD.4 MOV R3,#250 DJNZ R3,$ MOV R3,#250 DJNZ R3,$ RET ;******ZOBRAZI*CAS************************************************************* SHOWT: MOV A,@R0 ;minuty CALL SNUM INC R0 MOV A,@R0 CALL SNUM MOV DPTR,#TXT3 ;DVOJTECKA CALL SHOWTXT INC R0 ;vteřiny MOV A,@R0 CALL SNUM INC R0 MOV A,@R0 CALL SNUM MOV DPTR,#TXT0 ;TECKA CALL SHOWTXT INC R0 ;desetiny, setiny MOV A,@R0 CALL SNUM INC R0 MOV A,@R0 CALL SNUM RET ;*******CASOVE*ZPOZDENI********************************************************* DEL1S: MOV ZP1,#255 DEL3: MOV ZP2,#8 DEL2: MOV ZP3,#255 DJNZ ZP3,$ DJNZ ZP2,DEL2 DJNZ ZP1,DEL3 RET DEL2MS: MOV ZP1,#4 DEL22: MOV ZP2,#250 DJNZ ZP2,$ DJNZ ZP1,DEL22 RET