⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bufor.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==============================================================================
;  Procedury zwiazane z buforem LCD
;  Projekt:	Miernik energii i mocy na ADE7759
;==============================================================================

;	ADRES BUFORA w rejestrze Z

.cseg
;==============================================================================
WYSWIETL_WYNIK:
	; czyszczenie bufora drugiej linii LCD
	ldi	zl,  low(Bufor)
	ldi	zh, high(Bufor)
	ldi	r20, 14		; 14 spacji
	ldi	temp, ' '
CZYSC_B:	st	z+, temp		; czyszczenie spacjami
	dec	r20
	brne	CZYSC_B
	ldi	temp, 0
	st	z, temp		; koniec tekstu
	ldi	zl,  low(Bufor)
	ldi	zh, high(Bufor)	; Z trzyma adres poczatku bufora

;--------------------------------------
	; spr statusow...
	lds	temp, Status
	sbrc	temp, ST_U
	rjmp	SPR_S_U		; jesli =1 to sprawdzic jakie U wyswietlic
	sbrc	temp, ST_I
	rjmp	SPR_S_I		; jesli =1 to sprawdzic jakie I wyswietlic
	sbrc	temp, ST_M
	rjmp	SPR_S_M		; jesli =1 to spr jakie moce wyswietlic
	sbrc	temp, ST_E1
	rjmp	SPR_S_E1		; jesli =1 to sprawdzic jakie E wyswietlic
	sbrc	temp, ST_E2
	rjmp	SPR_S_E2		; jesli =1 to sprawdzic jakie E wyswietlic
	rjmp	WYSW_F		; jesli =1 to wyswietlic F


SPR_S_M:	lds	temp, Status_M
	sbrc	temp, STM_P
	rjmp	WYSW_P		; jesli =1 to wyswietlic P
	sbrc	temp, STM_Q
	rjmp	WYSW_Q		; jesli =1 to wyswietlic Q
	sbrc	temp, STM_S
	rjmp	WYSW_S		; jesli =1 to wyswietlic S
	rjmp	WYSW_PF		; jesli =1 to wyswietlic PF


SPR_S_U:	lds	temp, Status_U
	sbrc	temp, STU_RMS
	rjmp	WYSW_U_RMS		; wyswietlic RMS U
	sbrc	temp, STU_MAV
	rjmp	WYSW_U_MAV		; wyswietlic MAV (wartosc srednia)
	sbrc	temp, STU_AP
	rjmp	WYSW_U_AP		; wyswietlic amplitude dodatnia
	rjmp	WYSW_U_AM		; wyswietlic amplitude ujemna

SPR_S_I:	lds	temp, Status_I
	sbrc	temp, STI_RMS
	rjmp	WYSW_I_RMS		; wyswietlic RMS I
	sbrc	temp, STI_MAV
	rjmp	WYSW_I_MAV		; wyswietlic MAV (wartosc srednia)
	sbrc	temp, STI_AP
	rjmp	WYSW_I_AP		; wyswietlic amplitude dodatnia
	rjmp	WYSW_I_AM		; wyswietlic amplitude ujemna

SPR_S_E1:	lds	temp, Status_E1
	sbrc	temp, STE1_SUMA
	rjmp	WYSW_E1_S		; wyswietlic energie T1 suma
	sbrc	temp, STE1_OD
	rjmp	WYSW_E1_O		; wyswietlic energie T1 od
	sbrc	temp, STE1_ODDO
	rjmp	WYSW_E1_OO		; wyswietlic energie T1 oddo
	sbrc	temp, STE1_POZ
	rjmp	WYSW_E1_P		; wyswietlic energie T1 pozorna
	sbrc	temp, STE1_SEK
	rjmp	WYSW_E1_K		; energia sekundowa
	rjmp	WYSW_E1_D		; wyswietlic energie T1 sesji

SPR_S_E2:	lds	temp, Status_E2
	sbrc	temp, STE2_SUMA
	rjmp	WYSW_E2_S		; wyswietlic energie T2 suma
	sbrc	temp, STE2_OD
	rjmp	WYSW_E2_O		; wyswietlic energie T2 od
	sbrc	temp, STE2_ODDO
	rjmp	WYSW_E2_OO		; wyswietlic energie T2 oddo
	sbrc	temp, STE2_POZ
	rjmp	WYSW_E2_P		; wyswietlic energie T1 pozorna
	rjmp	WYSW_E2_D		; wyswietlic energie T2 sesji

;--------------------------------------
	; rejestr Z trzyma adres poczatku bufora
	; rejestry X i Y sa uzywane w procedurach konwersji bin2bcd
	; wolna od obliczen para rejestrow: r25:r24 jest wykorzystana
	;    na trzymanie adresu komunikatu
	; r23 zawiera znacznik taryfy
WYSW_P:	rcall	BF_P		; wypelnij bufor odpowiednimi znakami
	ldi	r25, high(2*txt_moc_p)	; laduj adres tekstu do wyswietlenia
	ldi	r24,  low(2*txt_moc_p)
	lds	bin0, Moc_P		; laduj wartosc odpowiedniej zmiennej
	lds	bin1, Moc_P+1
	rjmp	WYSW_PQS
	
WYSW_Q:	rcall	BF_Q
	ldi	r25, high(2*txt_moc_q)
	ldi	r24,  low(2*txt_moc_q)
	lds	bin0, Moc_Q
	lds	bin1, Moc_Q+1
	rjmp	WYSW_PQS

WYSW_S:	rcall	BF_S
	ldi	r25, high(2*txt_moc_s)
	ldi	r24,  low(2*txt_moc_s)
	lds	bin0, Moc_S
	lds	bin1, Moc_S+1
	;rjmp	WYSW_PQS

WYSW_PQS:	rcall	BIN_16_BCD		; konwersja wartosci na BCD
	rcall	ROZPAKUJ_BCD	; rozpakowanie bcd na cyfry i korekta do wyswietlenia
	rcall	WPISZ_WARTOSC_4_1	; wpis wartosci 5-cio cyfrowej do bufora
	movw	zl, r24		; adres odpowiedniego tekstu:  r25:r24 -> zh:zl
	rjmp	WYSW_LCD


WYSW_F:	rcall	BF_F
	ldi	r25, high(2*txt_czest)
	ldi	r24,  low(2*txt_czest)
	lds	bin0, Czestosc
	lds	bin1, Czestosc+1
	rcall	BIN_16_BCD
	rcall	ROZPAKUJ_BCD
	rcall	WPISZ_WARTOSC_3_2
	lds	bin0, Wypeln
	clr	bin1
	rcall	BIN_16_BCD
	rcall	ROZPAKUJ_BCD
	ldi	temp, 0b00110000
	or	cyfra1, temp
	std	z+11, cyfra1
	or	cyfra0, temp
	std	z+12, cyfra0
	movw	zl, r24
	rjmp	WYSW_LCD

WYSW_PF:	lds	bin0, Pf_mocy
	clr	bin1
	rcall	BF_PF
	ldi	r25, high(2*txt_wsp_m)
	ldi	r24,  low(2*txt_wsp_m)
	rcall	BIN_16_BCD
	rcall	ROZPAKUJ_BCD
	rcall	WPISZ_WARTOSC_3_2
	movw	zl, r24		; adres odpowiedniego tekstu:  r25:r24 -> zh:zl
	rjmp	WYSW_LCD


WYSW_U_RMS:	ldi	r25, high(2*txt_u_rms)	; laduj adres tekstu do wyswietlenia
	ldi	r24,  low(2*txt_u_rms)
	lds	bin0, Napiecie_rms
	lds	bin1, Napiecie_rms+1
	rjmp	WYSW_UX

WYSW_U_MAV:	ldi	r25, high(2*txt_u_mav)
	ldi	r24,  low(2*txt_u_mav)
	lds	bin0, Napiecie_mav
	lds	bin1, Napiecie_mav+1
	rjmp	WYSW_UX

WYSW_U_AP:	ldi	r25, high(2*txt_u_ap)
	ldi	r24,  low(2*txt_u_ap)
	lds	bin0, Napiecie_ap
	lds	bin1, Napiecie_ap+1
	rjmp	WYSW_UX

WYSW_U_AM:	ldi	r25, high(2*txt_u_am)
	ldi	r24,  low(2*txt_u_am)
	lds	bin0, Napiecie_am
	lds	bin1, Napiecie_am+1
	;rjmp	WYSW_UX

WYSW_UX:	rcall	BF_U		; wypelnij bufor znakami
	rjmp	WYSW_PQS		; reszta identycznie jak dla mocy


WYSW_I_RMS:	ldi	r25, high(2*txt_i_rms)	; laduj adres tekstu do wyswietlenia
	ldi	r24,  low(2*txt_i_rms)
	lds	bin0, Prad_rms
	lds	bin1, Prad_rms+1
	rjmp	WYSW_IX

WYSW_I_MAV:	ldi	r25, high(2*txt_i_mav)
	ldi	r24,  low(2*txt_i_mav)
	lds	bin0, Prad_mav
	lds	bin1, Prad_mav+1
	rjmp	WYSW_IX

WYSW_I_AP:	ldi	r25, high(2*txt_i_ap)
	ldi	r24,  low(2*txt_i_ap)
	lds	bin0, Prad_ap
	lds	bin1, Prad_ap+1
	rjmp	WYSW_IX

WYSW_I_AM:	ldi	r25, high(2*txt_i_am)
	ldi	r24,  low(2*txt_i_am)
	lds	bin0, Prad_am
	lds	bin1, Prad_am+1
	;rjmp	WYSW_IX

WYSW_IX:	movw	r2, bin0		; kopia wartosci
	rcall	BF_I		; wypelnij bufor znakami
	rcall	BIN_16_BCD		; konwersja wartosci na BCD
	rcall	ROZPAKUJ_BCD	; rozpakowanie bcd na cyfry i korekta do wyswietlenia
	rcall	WPISZ_WARTOSC_2_2	; wpis wartosci
	movw	zl, r24		; adres odpowiedniego tekstu:  r25:r24 -> zh:zl
	rjmp	WYSW_LCD


WYSW_E1_S:	ldi	yh, high(Energia1+3)	; laduj adres zmiennej (trzy bajty LSB sie odrzuca)
	ldi	yl,  low(Energia1+3)
	ldi	r23, '1'		; przekazanie numeru taryfy
	rjmp	WYSW_ES12
WYSW_E2_S:	ldi	yh, high(Energia2+3)
	ldi	yl,  low(Energia2+3)
	ldi	r23, '2'

WYSW_ES12:	ldi	r25, high(2*txt_en_sum)	; laduj adres tekstu do wyswietlenia
	ldi	r24,  low(2*txt_en_sum)
	rjmp	WYSW_EX


WYSW_E1_P:	ldi	yh, high(Energia1_poz+3)
	ldi	yl,  low(Energia1_poz+3)
	ldi	r23, '1'
	rjmp	WYSW_EP12
WYSW_E2_P:	ldi	yh, high(Energia2_poz+3)
	ldi	yl,  low(Energia2_poz+3)
	ldi	r23, '2'

WYSW_EP12:	ldi	r25, high(2*txt_en_poz)
	ldi	r24,  low(2*txt_en_poz)
	rjmp	WYSW_EX


WYSW_E1_O:	ldi	yh, high(Energia1_od+3)
	ldi	yl,  low(Energia1_od+3)
	ldi	r23, '1'
	rjmp	WYSW_EO12
WYSW_E2_O:	ldi	yh, high(Energia2_od+3)
	ldi	yl,  low(Energia2_od+3)
	ldi	r23, '2'

WYSW_EO12:	ldi	r25, high(2*txt_en_od)
	ldi	r24,  low(2*txt_en_od)
	lds	temp, Flagi3
	sbr	temp, 1<<f3EN_O
	sts	Flagi3, temp
	rjmp	WYSW_EX


WYSW_E1_OO:	ldi	yh, high(Energia1_oddo+3)
	ldi	yl,  low(Energia1_oddo+3)
	ldi	r23, '1'
	rjmp	WYSW_EOO12
WYSW_E2_OO:	ldi	yh, high(Energia2_oddo+3)
	ldi	yl,  low(Energia2_oddo+3)
	ldi	r23, '2'

WYSW_EOO12:	ldi	r25, high(2*txt_en_oddo)
	ldi	r24,  low(2*txt_en_oddo)
	lds	temp, Flagi3
	sbr	temp, 1<<f3EN_OO
	sts	Flagi3, temp
	rjmp	WYSW_EX


WYSW_E1_K:	ldi	yh, high(Energia_sek)
	ldi	yl,  low(Energia_sek)
	ldi	r23, 'S'
	ldi	r25, high(2*txt_en_sek)
	ldi	r24,  low(2*txt_en_sek)
	rjmp	WYSW_EX


WYSW_E1_D:	ldi	yh, high(Energia1_ses+3)
	ldi	yl,  low(Energia1_ses+3)
	ldi	r23, '1'
	rjmp	WYSW_ED12
WYSW_E2_D:	ldi	yh, high(Energia2_ses+3)
	ldi	yl,  low(Energia2_ses+3)
	ldi	r23, '2'

WYSW_ED12:	ldi	r25, high(2*txt_en_ses)
	ldi	r24,  low(2*txt_en_ses)
	;rjmp	WYSW_EX


WYSW_EX:	rcall	OBRB_EN		; zaladowanie, konwersja, wypelnienie bufora
	;rjmp	WYSW_LCD


;--------------------------------------
WYSW_LCD:	; wyswietlanie na LCD
	ldi	temp, LCD_LINE_1
	rcall	LCD_COMMAND		; linia pierwsza
	rcall	LCD_STR_FLASH	; wyswietl linie pierwsza (tekst)
	ldi	temp, ' '
	rcall	LCD_CHAR		; miejsce 15-te na LCD
	sbrs	flagi, fTARYFY	; przeskocz jesli licznik dwutaryfowy
	rjmp	WL_CHR1
	ldi	temp, '1'
	sbrc	flagi, fTARYFA2	; ktora taryfa?
	ldi	temp, '2'
WL_CHR1:	rcall	LCD_CHAR

	lds	temp, Flagi3
	sbrc	temp, f3EN_O	; przeskocz jesli Energia_od niewyswietlana
	rjmp	WPISZ_DATE_O	; uzupelnia napis w pierwszej linii LCD
	sbrc	temp, f3EN_OO	; przeskocz jesli Energia_oddo niewyswietlana
	rjmp	WPISZ_DATE_OO	; uzupelnia napis w pierwszej linii LCD
WL_LINE2:	lds	temp, Flagi3
	cbr	temp, (1<<f3EN_O) | (1<<f3EN_OO)
	sts	Flagi3, temp

	ldi	temp, LCD_LINE_2
	rcall	LCD_COMMAND		; linia druga
	ldi	zl,  low(Bufor)
	ldi	zh, high(Bufor)
	rcall	LCD_STR_RAM		; wyswietl linie druga

	ldi	temp, ' '
	lds	r0, Flagi2
	sbrc	r0, f2EN_MI		; test ujemnej ostatniej probki energii
	ldi	temp, '*'		; informacja o ujemnej probce energii

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -