📄 menu.asm
字号:
ret
;==============================================================================
M_EN_O_W: ; wyswietlenie zakresu czasu akumulacji Energia_od
ldi zl, low(Od_rok_st)
ldi zh, high(Od_rok_st)
rcall LCD_CLEAR
rcall DATACZAS
ret
;==============================================================================
M_EN_OO_W: ; wyswietlenie zakresu czasu akumulacji Energia_oddo
push yl
push yh
ldi zl, low(Bufor)
ldi zh, high(Bufor)
rcall LCD_CLEAR
ldi yl, low(Oddo_rok_st) ; najpierw zakres start
ldi yh, high(Oddo_rok_st)
ldi temp, 2
mov r1, temp
MEOW: ld r0, y
st z, r0
ldd r0, y+2
std z+1, r0
ldd r0, y+4
std z+2, r0
ldd r0, y+6
std z+3, r0
ldd r0, y+8
std z+4, r0
rcall DATACZAS
adiw yl, 1 ; potem zakres stop w drugiej linii
ldi temp, LCD_LINE_2
rcall LCD_COMMAND
dec r1
brne MEOW
pop yh
pop yl
ret
;------------------------------------------------------------------------------
CZASED: ; zmiana zakresu czasu ...
; 'temp' zawiera ilosc zmiennych do edycji
; oraz 'temp' zwraca 0xFF jesli TAK
push yl
push yh
push r22
mov r22, temp ; ilosc zmiennych do edycji -kopia
movw zl, par0 ; adres pierwszej danej do z
clr yh
CZD_N: lpm yl, z ; adres zmiennej do Y
ld r0, y
push r0 ; zmienna na stos (ochrona przed anulowaniem)
adiw zl, 4
dec temp
brne CZD_N
push zl
push zh
rcall M_CZAS_ED ; par1:par0 -dane
; rejestr Z zawiera status wykonania:
cpi zh, 0xFF
pop zh
pop zl
breq CZD_TAK
; anulowanie
mov temp, r22
CZD_POP: sbiw zl, 4
lpm yl, z
pop r0 ; zdejmij ze stosu i zapisz
st y, r0 ; ...stare wartosci
dec temp
brne CZD_POP
rjmp CZD_K
CZD_TAK: ; jest zatwierdzenie
mov temp, r22
CZD_TP: pop r0
dec temp
brne CZD_TP
ser temp
CZD_K: pop r22
pop yh
pop yl
ret
;------------------------------------------------------------------------------
M_EN_O: ; zmiana zakresu czasu akumulacji Energia_od
ldi temp, 5
rcall CZASED
cpi temp, 0xFF
brne MENO_NIE
; zatwierdzenie
rcall POROWNAJ_CZAS
ldi zl, low(Energia1_od)
ldi zh, high(Energia1_od)
cli
rcall CZYSC_ENERG
rcall ZAPISZ_EO_EE
sei
MENO_NIE: rjmp M_EN_O_W
;------------------------------------------------------------------------------
M_EN_OO: ; zmiana zakresu czasu akumulacji Energia_oddo
ldi temp, 10
rcall CZASED
cpi temp, 0xFF
brne MENOO_NIE
; zatwierdzenie
rcall POROWNAJ_CZAS
ldi zl, low(Energia1_oddo)
ldi zh, high(Energia1_oddo)
cli
rcall CZYSC_ENERG
rcall ZAPISZ_EOO_EE
sei
MENOO_NIE: rjmp M_EN_OO_W
;------------------------------------------------------------------------------
M_TAR2: ; wyswietlenie zakresu godzin taryfy2
push yl
push yh
ldi temp, ' '
rcall LCD_CHAR
rcall LCD_CHAR
movw zl, par0 ; adres pierwszej danej do z
lpm yl, z ; adres zmiennej do Y
clr yh
adiw zl, 4
ld temp, y ; wartosc dzien_start
rcall MC_DNI
ld temp, y
tst temp ; jesli dzien_start=0 to ten zakres nieaktywny
breq MT2_WL
ldi temp, '-'
rcall LCD_CHAR
lpm yl, z
ld temp, y ; dzien_stop
rcall MC_DNI
MT2_WL: ldi temp, LCD_LINE_2
rcall LCD_COMMAND
adiw zl, 4
lpm yl, z
ld r0, y ; godz_st
rcall HEX_1B
ldi temp, ':'
rcall LCD_CHAR
adiw zl, 4
lpm yl, z
ld r0, y ; minuty_st
rcall HEX_1B
ldi temp, '-'
rcall LCD_CHAR
adiw zl, 4
lpm yl, z
ld r0, y ; godz_sp
rcall HEX_1B
ldi temp, ':'
rcall LCD_CHAR
adiw zl, 4
lpm yl, z
ld r0, y ; minuty_st
rcall HEX_1B
pop yh
pop yl
ret
;------------------------------------------------------------------------------
M_TAR2ED: ; edycja zakresu godzin taryfy2
ldi temp, 6
rcall CZASED
cpi temp, 0xFF
brne MT2E_NIE
; jest zatwierdzenie
cli
rcall SPRAWDZ_TARYFE
rcall ZAPISZ_TAR_EE
sei
MT2E_NIE: ldi temp, LCD_LINE_1 | 2
rcall LCD_COMMAND
rjmp M_TAR2
;------------------------------------------------------------------------------
M_CZEN: ; zeruje akumulator energii: par1:par0
ldi zl, low(2*txt_jp) ; "czy na pewno?"
ldi zh, high(2*txt_jp)
rcall LCD_STR_FLASH ; wyswietl linie
MCZEN_KL: wdr
sbrc flagi, fKLAW_WCIS ; przeskocz, jesli flaga wyzerowana
rjmp MCZEN_KL ; na poczatek petli
lds temp, Klawisze ; laduj zmienna o stanie klawiszy
tst temp
breq MCZEN_KL ; brak nacisniecia
; rozpoznanie wcisnietego klawisza
KLAWISZ_WCISNIETY ; ustaw bit wcisniecia klawisza
sbrc temp, KLAW_TAK ; przeskocz, jesli to nie klawisz TAK
rjmp MCZEN_TAK ; klawisz TAK wcisniety - zatwierdzenie
sbrc temp, KLAW_NIE
rjmp PUST2
rjmp MCZEN_KL ; na poczatek petli
MCZEN_TAK:
movw zl, par0
cli
rcall CZYSC_ENERG
rcall ZAP_EN_DS1307
sei
rjmp MADE_W ; komunikat "Zrobione"
;------------------------------------------------------------------------------
M_ZEN: ; zapisuje energie z RAM do EEPROMu
cli
rcall ZAPISZ_EN_EE
sei
rjmp MADE_W ; komunikat "Zrobione"
;------------------------------------------------------------------------------
M_CEN: ; odczytuje energie z EEPROM do RAM (przydatne np. po wymianie baterii)
cli
rcall CZYTAJ_EN_EE
rcall ZAP_EN_DS1307
sei
rjmp MADE_W ; komunikat "Zrobione"
;------------------------------------------------------------------------------
M_ZEE: ; zapisuje konfiguracje do EEPROMu
cli
rcall ZAPISZ_KONF_EE
sei
rjmp MADE_W ; komunikat "Zrobione"
;--------------------------------------
M_IE: ; ustawienie komorki 2h EEPROM na wartosc 150 (nie zeruj energii)
; potem RESET
cli
ldi ee_adr, 4 ; testowana komorka pamieci
ldi ee_dane, 150 ; wartosc inna niz 74 ==> zapisz
rcall EE_ZAPIS ; ...eeprom wartosciami domyslnymi
MIE_1: sbic EECR, EEWE ; czekaj koniec zapisu
rjmp MIE_1
rjmp RESET
;==============================================================================
;==============================================================================
M_K_I: ; kalibracja zera dla pradu
cli
ldi temp, ADE_CH1OS_ADR
clr r0
sts Ade_ch1os, r0
rcall SPI_ADE_WRITE_1B ; Ade_ch1os
sei
clr temp
ldi zl, low(Off_I_dc)
ldi zh, high(Off_I_dc)
rcall MKDC_ZER
ldi zl, low(Off_x1)
ldi zh, high(Off_x1)
rcall MKDC_ZER
ldi temp, CYKLI_POM ; ilosc cykli pomiarowych (czyli ilosc sekund)
std z+4, temp
ser temp
st z, temp
std z+1, temp ; poniewaz pierwsza jest wykonywana kalibracja CH?OS
ldi temp, (1<<f4KAL_DCI) | (1<<f4KAL_CH) | (1<<f4KAL_CH0)
MK_NIE: sts Flagi4, temp
KLAWISZ_PUSZCZONY
ldi temp, 1<<KLAW_NIE
sts Klawisze, temp ; wyjscie z menu
ret
;--------------------------------------
M_K_U: ; kalibracja zera dla napiecia
lds r0, Napiecie_rms
lds r1, Napiecie_rms+1
ldi zl, low(100)
ldi zh, high(100) ; amplituda do detekcji podlaczenia do sieci
cp r0, zl
cpc r1, zh
brlo MKU_Z
ldi zl, low(2*txt_zdn) ; komunikat "Za duze napiecie"
ldi zh, high(2*txt_zdn)
rcall LCD_STR_FLASH ; wyswietl linie
ret
MKU_Z: cli
ldi temp, ADE_CH2OS_ADR
clr r0
sts Ade_ch2os, r0
rcall SPI_ADE_WRITE_1B ; Ade_ch2os
sei
clr temp
ldi zl, low(Off_U_dc)
ldi zh, high(Off_U_dc)
rcall MKDC_ZER
ldi zl, low(Off_x1)
ldi zh, high(Off_x1)
rcall MKDC_ZER
ldi temp, CYKLI_POM ; ilosc cykli pomiarowych (czyli ilosc sekund)
std z+4, temp
ser temp
st z, temp
std z+1, temp ; poniewaz pierwsza jest wykonywana kalibracja CH?OS
ldi temp, (1<<f4KAL_DCU) | (1<<f4KAL_CH) | (1<<f4KAL_CH0)
rjmp MK_NIE
;--------------------------------------
M_K_E: ; kalibracja zera dla energii
cli
ldi zl, low(Energia1_ses)
ldi zh, high(Energia1_ses)
rcall CZYSC_ENERG ; czysci energie tymczasowa
clr r0
clr r1
sts Ade_apos, r0
sts Ade_apos+1, r0
ldi temp, ADE_APOS_ADR
rcall SPI_ADE_WRITE_2B
sei
ldi temp, CYKLI_POM
sts Cykli, temp
ldi temp, 1<<f4KAL_E
rjmp MK_NIE
;--------------------------------------
MKDC_ZER: st z, temp ; zerowanie offsetow
std z+1, temp
std z+2, temp
std z+3, temp
std z+4, temp
ret
.exit
;==============================================================================
Struktura menu:
1 "menu1"
11 "podmenu1"
12 "podmenu1"
13 "podmenu1"
2 "menu2"
3 "menu3"
31 "podmenu3"
32 "podmenu3"
321 "podmenu32"
322 "podmenu32"
323 "podmenu32"
33 "podmenu3"
34 "podmenu3"
4 "menu4"
41 "podmenu4"
42 "podmenu4"
----poziom--->
zapisana jest kolejno za pomoca liczb "poziom" i "numer":
P: poziom zaglebienia w strukturze menu,
N: numer kolejny na danym poziomie
P N
----
1 1 "menu1"
2 1 "podmenu1"
2 2 "podmenu1"
2 3 ...
1 2
1 3
2 1
2 2
3 1
3 2
3 3
2 3
2 4
1 4
2 1
2 2
0 0 KONIEC
Kazdy wiersz zawiera rowniez dwubajtowy adres komunikatu do wyswietlenia oraz
dwubajtowy adres procedury ktora zostanie wykonana (skok lub call) po zatwierdzeniu wyboru
oraz dwa bajty parametrow.
P N K0 K1 A0 A1 P0 P1
P: poziom zaglebienia w strukturze menu,
N: numer kolejny na danym poziomie
K1:K0 -adres komunikatu
A1:A0 -adres procedury obslugi wiersza (wykonywanej po nacisnieciu TAK)
P1:P0 -parametry (np. dla procedury)
Dzieki temu przeszukiwanie struktury menu jest proste.
Dodatkowo najstarszy bit liczby N (menu_numer) informuje czy dany wiersz ma podmenu (aby rozroznic
wejscie do podmenu lub wykonanie akcji)
Jesli bit podmenu jest ustawiony, to przy wchodzeniu do tego podmenu sprawdzany jest adres A1:A0
- jesli adres <> 0 to wykonywana jest akcja dla calego podmenu (z wyjatkiem wierszy z ustawionym bitem podmenu)
Pozwala to juz przy wejsciu do podmenu podgladac np. wartosci zmiennych.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -