All pastes #437116 Raw Edit

discovery

public text v1 · immutable
·published 2007-04-12 21:40 UTC
rendered paste body
	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