📄 bufor.asm
字号:
rcall LCD_CHAR
sbrc flagi, fOVER_I
rjmp OV_GWI ; jesli flaga =1 to wystapilo przepelnienie
sbrc flagi, fOVER_U
rjmp OV_GWI ; jesli flaga =1 to wystapilo przepelnienie
ldi temp, ' ' ; miejsce 16-te
rcall LCD_CHAR
ldi temp, LCD_D1_C0_B0 ; brak przepelnienia, wiec brak migotania
rcall LCD_COMMAND
ret
; koniec WYSWIETL_WYNIK
OV_GWI: ; przepelnienie sygnalizowane migajacym 'P'
ldi temp, 'P' ; informacja o przepelnieniu
rcall LCD_CHAR
ldi temp, LCD_CURSOR_LEFT ; cofnij
rcall LCD_COMMAND
ldi temp, LCD_D1_C0_B1 ; migaj
rcall LCD_COMMAND
ret
;==============================================================================
;==============================================================================
OBRB_EN: ; test akumulatora energii na wartosc ujemna
ld bin0, y+ ; zaladowanie wartosci zmiennej
ld bin1, y+
ld bin2, y+
ld bin3, y+
; test znaku
sbrs bin3, 7
rjmp OBE_P
; akumulator ujemny -negacja
com bin0
com bin1
com bin2
com bin3
ldi temp, 1
add bin0, temp
clr temp
adc bin1, temp
adc bin2, temp
adc bin3, temp
ldi temp, '-' ; znak liczby ujemnej '-'
std z+3, temp ; ...zapisz w Buforze
OBE_P: ; sprawdzanie wartosci
lds temp, Flagi2
push temp ; zachowuje stan Flagi2
ldi bcd0, low(9999999)
ldi bcd1, byte2(9999999)
ldi bcd2, byte3(9999999)
ldi bcd3, byte4(9999999) ; maksymalna wartosc na LCD
cp bcd0, bin0
cpc bcd1, bin1
cpc bcd2, bin2
cpc bcd3, bin3
brsh OBE_OK ; skacz jesli wartosc "energii" <= od maksymalnej na LCD
cbr temp, 1<<f2EN_WH ; czysc flage Wh
sts Flagi2, temp
rjmp OBE_OK
OBE_OK: rcall BIN_32_BCD ; konwersja wartosci na BCD
rcall ROZPAKUJ_BCD ; rozpakowanie bcd na cyfry i korekta do wyswietlenia
rcall BF_E ; wypelnij bufor znakami
rcall WPISZ_WARTOSC_7 ; wpis wartosci
pop temp ; odtwarza stan Flagi2
sts Flagi2, temp
movw zl, r24 ; adres odpowiedniego tekstu: r25:r24 -> zh:zl
ret
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
BF_P: ; wypelnienie bufora mocy P
ldi temp, 'P'
st z, temp ; Z trzyma adres poczatku bufora
ldi temp, 'W'
std z+9, temp
rjmp BF_PQS
;--------------------------------------
BF_Q: ; wypelnienie bufora mocy Q
ldi temp, 'Q'
st z, temp
ldi temp, 'v'
std z+9, temp
ldi temp, 'a'
std z+10, temp
ldi temp, 'r'
std z+11, temp
rjmp BF_PQS
;--------------------------------------
BF_S: ; wypelnienie bufora mocy S
ldi temp, 'S'
st z, temp
ldi temp, 'V'
std z+9, temp
ldi temp, 'A'
std z+10, temp
BF_PQS: ldi temp, '='
std z+1, temp
ldi temp, ','
std z+7, temp
ret
;------------------------------------------------------------------------------
BF_U: ; wypelnienie bufora U
ldi temp, 'U'
st z, temp
ldi temp, '='
std z+1, temp
ldi temp, ','
std z+7, temp
ldi temp, 'V'
std z+9, temp
sbrs flagi, fOVER_U
ret ; brak przepelnienia jesli flaga =0
; przepelnienie sygnalizowane "max"
BFU_P: ldi temp, 'm'
std z+10, temp
ldi temp, 'a'
std z+11, temp
ldi temp, 'x'
std z+12, temp
ret
;--------------------------------------
BF_I: ; wypelnienie bufora I
ldi temp, 'I'
st z, temp
ldi temp, '='
std z+1, temp
; ldi temp, ','
; std z+5, temp
ldi temp, 'm'
std z+7, temp
ldi temp, 'A'
std z+8, temp
sbrs flagi, fOVER_I
ret ; brak przepelnienia jesli flaga =0
rjmp BFU_P
;------------------------------------------------------------------------------
BF_E: ; wypelnienie bufora Energii
ldi temp, 'E'
st z, temp
std z+1, r23 ; r23 trzyma znacznik taryfy
ldi temp, '='
std z+2, temp
lds temp, Flagi2
sbrc temp, f2EN_WH ; jesli f2EN_WH=0 to wyswietlanie w kWh
rjmp BFE_WH
ldi temp, 'k'
std z+11, temp
ldi temp, 'W'
std z+12, temp
ldi temp, 'h'
std z+13, temp
ret
BFE_WH: ldi temp, 'W'
std z+11, temp
ldi temp, 'h'
lds r0, Status_E1
sbrc r0, STE1_SEK ; dla Energia_SEK jednostka to [Ws]
ldi temp, 's'
std z+12, temp
ret
;------------------------------------------------------------------------------
BF_F: ; wypelnienie bufora czestotliwosci
ldi temp, 'F'
st z, temp
ldi temp, '='
std z+1, temp
ldi temp, ','
std z+5, temp
ldi temp, 'H'
std z+8, temp
ldi temp, 'z'
std z+9, temp
ldi temp, '%'
std z+13, temp
ret
;------------------------------------------------------------------------------
BF_PF: ; wypelnienie bufora wsp. mocy
ldi temp, 'P'
st z, temp
ldi temp, 'F'
std z+1, temp
ldi temp, '='
std z+2, temp
ldi temp, ','
std z+5, temp
ret
;==============================================================================
WPISZ_DATE_O: ; wpisuje date dla Energii_od
ldi temp, LCD_LINE_1 | 6
rcall LCD_COMMAND
lds r0, Od_dzien_st
rcall HEX_1B
ldi temp, '.'
rcall LCD_CHAR
lds r0, Od_mies_st
rcall HEX_1B
ldi temp, '.'
rcall LCD_CHAR
lds r0, Od_rok_st
rcall HEX_1B
rjmp WL_LINE2
;--------------------------------------
WPISZ_DATE_OO: ; wpisuje date dla Energii_oddo
ldi temp, LCD_LINE_1 | 3
rcall LCD_COMMAND
lds r0, Oddo_dzien_st
rcall HEX_1B
ldi temp, '.'
rcall LCD_CHAR
lds r0, Oddo_mies_st
rcall HEX_1B
ldi temp, '-'
rcall LCD_CHAR
lds r0, Oddo_dzien_sp
rcall HEX_1B
ldi temp, '.'
rcall LCD_CHAR
lds r0, Oddo_mies_sp
rcall HEX_1B
rjmp WL_LINE2
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
WPISZ_WARTOSC_4_1: ; wpis wartosci 5-cio cyfrowej -- przecinek za 1 miejscem od konca
ldi temp, 3 ; licznik cyfr PRZED przecinkiem
mov r0, temp
clr yh
ldi yl, adrcyfra0+5 ; adres rejestrow cyfra + cyfra5
adiw zl, 3 ; ustaw adres bufora na poczatku pola wartosci
clt ; czysc flage zer nieznaczacych
WW51_1: ld temp, -y ; laduj cyfre
brts WW51_2 ; jesli T=1 to nie sprawdzaj zer nieznaczacych
cpi temp, '0'
breq WW51_3 ; jesli ='0' to skacz
set ; ustaw flage zer nieznacz.
WW51_2: st z, temp ; zapisz cyfre w buforze
WW51_3: adiw zl, 1
dec r0
brne WW51_1
st z, cyfra1
std z+2, cyfra0
ret
;------------------------------------------------------------------------------
WPISZ_WARTOSC_2_2: ; wpis wartosci 4-cio cyfrowej -- przecinek za 2 miejscem od konca
tst r3 ; jesli wartosc <256 to rozdzielczosc 1mA
breq WW22_2
mov temp, cyfra4
cpi temp, '0'
breq WW22_1 ; jesli rowne, to skacz
std z+3, temp ; jesli <> to zapisz cyfre w buforze
WW22_1: std z+4, cyfra3
std z+6, cyfra2 ; omin przecinek
std z+7, cyfra1
ldi temp, ','
std z+5, temp
ret
WW22_2: mov temp, cyfra2
cpi temp, '0'
breq WW22_3 ; jesli rowne, to skacz
std z+4, temp ; jesli <> to zapisz cyfre w buforze
WW22_3: mov temp, cyfra1
cpi temp, '0'
breq WW22_4
std z+5, temp
WW22_4: std z+6, cyfra0
ret
;------------------------------------------------------------------------------
WPISZ_WARTOSC_3_2: ; wpisywanie wartosci 5-cyfrowej (dla F i PF)
mov temp, cyfra4
cpi temp, '0'
breq WW32_1 ; jesli rowne, to skacz
std z+2, temp ; jesli <> to zapisz cyfre w buforze
WW32_1: mov temp, cyfra3
cpi temp, '0'
breq WW32_2
std z+3, temp
WW32_2: std z+4, cyfra2
std z+6, cyfra1 ; omin przecinek
std z+7, cyfra0
ret
;------------------------------------------------------------------------------
WPISZ_WARTOSC_7:
ldi temp, 6
mov r0, temp ; licznik cyfr
clr yh
ldi yl, adrcyfra0+7+3 ; adres rejestrow cyfra + cyfra10 (kWh)
lds temp, Flagi2
sbrc temp, f2EN_WH ; przeskocz jesli EN_WH=0 (kWh)
ldi yl, adrcyfra0+7 ; adres rejestrow cyfra + cyfra7 (Wh)
adiw zl, 4 ; ustaw adres bufora na poczatku pola wartosci
clt ; czysc flage zer nieznaczacych
WW7_1: ld temp, -y ; laduj cyfre
brts WW7_2 ; jesli T=1 to nie sprawdzaj zer nieznaczacych
cpi temp, '0'
breq WW7_3 ; jesli ='0' to skacz
set ; ustaw flage zer nieznacz.
WW7_2: st z, temp ; zapisz cyfre w buforze
WW7_3: adiw zl, 1
dec r0
brne WW7_1
ld temp, -y ; ostatnia cyfra
st z, temp
ret
.exit
;------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -