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