LJMP START
ORG 0BH
LCALL IRQ_T0
RETI
ORG 13H
LCALL IRQ_AC
RETI
ORG 1BH
LCALL IRQ_T1
RETI
START:
MOV TMOD,#11H ;ustawienie obu timerow do pracy w trybie 1 (16-bitowym)
MOV TH0,#76 ;zaladowaie wartosci
MOV TL0,#0 ; poczatkowych
MOV TH1,#76
MOV TL1,#0
MOV R7,#0 ;dane z przetwornika ac
MOV R4,#4 ;licznik przepelnieni timera 1
MOV SP,#50H ;przesuniecie stosu
SETB EA ;wlaczenie przerwan
SETB EX1 ; i uruchomienie timerow
SETB ET0
SETB ET1
SETB TR1
MOV DPTR,#0FF18H ;wybranie wejscia 0 multipleksera
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#0FF10H ;uruchomienie przetwarzania
MOVX @DPTR,A
HOLD_LOOP: ;programowa realizacja klawisza hold
MOV DPTR,#0FF22H ;do dptr zapisany jest adres drugiej czesci klawiatury matrycowej
MOVX A,@DPTR ;odczytanie jej stanu
CPL A
JZ HOLD_LOOP ;jesli klawisz jest nacisniety, to skacze do etykiety HOLD_LOOP
JNB ACC.7,NOT_ENTER ;jesli klawisz zostanie zwolniony, to sprwadzamy czy byl nacisniety enter
CLR EA ;jesli tak to wylaczamy przerwania od przetwornika ac
CLR P1.7 ;i zapalamy diode
SJMP HOLD_LOOP
NOT_ENTER: ;jesli nacisniety zostal nie enter
JNB ACC.6,NOT_ESC ;to sprawdzamy czy byl to esc
SETB EA ;jesli tak, to wznawiamy przerwania od ac
SETB P1.7 ;i gasimy diode
NOT_ESC:
SJMP HOLD_LOOP
IRQ_T0: ;podprogram obslugi timera 0
PUSH DPL ;sluzy jedynie do wznawiania
PUSH DPH ;przetwarzania napiecia
PUSH PSW
CLR TR0
MOV TH0,#76
MOV TL0,#0
MOV DPTR,#0FF10H
MOVX @DPTR,A
POP PSW
POP DPH
POP DPL
RET
IRQ_T1: ;podprogram obslugi timera 1
PUSH PSW ;sluzy do odswiezania wyniku pomiaru na wyswietlaczu LCD
CLR TR1
MOV TH1,#76
MOV TL1,#0
DJNZ R4,IRQ_QUIT ;timer odlicza czas 50ms, ta linijka wydluza programowo czas realizacji kodu ponizej
MOV R4,#4 ;do 200ms (4*50ms)
LCALL LCD_CLR ;wyczyszczenie wyswietlacza
LCALL PROCESSING ;wywolanie podprogramu przetwarzajacego wynik
MOV R0,#81H
MOV R1,#82H
LCALL SHOW_VOLTAGE ;oraz wyswietlenie wyniku na wyswietlaczu
IRQ_QUIT:
POP PSW
SETB TR1
RET
IRQ_AC: ;podprogram obslugi przetwornika ac
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
MOV DPTR,#0FF00H ;zapisujemy adres sterownika przerwac
MOVX A,@DPTR ;i odczytujemy numer przerwania
ANL A,#03H ;jesli jest to przrwanie od przetowrnika ac
MOVX @DPTR,A
CJNE A,#0,NOT_IAC
MOV DPTR,#0FF10H ;to wznawiamy przetwarzania
MOVX A,@DPTR
MOV R7,A ;a wynik zapisujemy w rej. r7
SETB TR0 ;uruchomienie timera, ktory wlaczy przetwarzanie
NOT_IAC:
POP DPH
POP DPL
POP PSW
POP ACC
RET
PROCESSING: ;przetwarzanie wyniku pomiaru
MOV R0,#33H ;zapisanie komorki, w ktorej znajdowac bedzie sie najmlodsza czesc wyniku
MOV A,R7 ;skopiowanie wyniku przetwarzania
MOV B,#5
MUL AB ;wykonanie dzielenia, otrzymanej wartosci przetwarzania przez 5
MOV @R0,B ;najstarszy bajt wyniku, zapisywany jest do komorki 33h
NEXT:
ADD A,B ;dodanie do siebie mlodszego i starszego bajtu mnozenia
MOV B,#10 ;przygotowanie do dzielenia przez 10
MUL AB ;dzielenie poprzedniego mlodszego bajtu wyniku przez 10
DEC R0 ;zapisanie adresu komorki, do ktrej zapisany bedzie wynik
MOV @R0,B ;zapisanie wyniku do komorki
CJNE R0,#2FH,NEXT
RET
SHOW_VOLTAGE: ;podprogram wyswietla wynik pomiaru an LCD
MOV A,07H
JNZ SHOW
MOV 2FH,#0 ;wyczyszczenie komorek, ktore
MOV 30H,#0 ; przechowuja wynik pomiaru
MOV 31H,#0
MOV 32H,#0
SHOW:
MOV A,33H
ADD A,#30H
LCALL SEND_LCD
MOV A,#','
LCALL SEND_LCD
MOV A,32H
ADD A,#30H
LCALL SEND_LCD
MOV A,31H
ADD A,#30H
LCALL SEND_LCD
MOV A,30H
ADD A,#30H
LCALL SEND_LCD
MOV A,#'V'
LCALL SEND_LCD
RET
SEND_LCD:
PUSH ACC
BUSY:
MOVX A,@R1
JB ACC.7,BUSY
POP ACC
MOVX @R0,A
RET