📄 bufor.asm
字号:
;==============================================================================
; 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 + -