📄 klaw.asm
字号:
;==============================================================================
; Procedury obslugi klawiszy
; Projekt: Miernik energii i mocy na ADE7759
;==============================================================================
.macro KLAWISZ_WCISNIETY
sbr flagi, 1<<fKLAW_WCIS ; ustaw bit wcisniecia klawisza
.endm
.macro KLAWISZ_PUSZCZONY
cbr flagi, 1<<fKLAW_WCIS ; zeruj bit wcisniecia klawisza
.endm
.cseg
;------------------------------------------------------------------------------
KLAW_NORMAL:
; detekcja, czy jest to pierwsze wejscie do procedury obslugi klawisza
; zakladam, ze klawisze sa wciskane pojedynczo, z jakas przerwa miedzy jednym a drugim nacisnieciem
sbrc flagi, fKLAW_WCIS ; przeskocz, jesli flaga wyzerowana
ret
; rozpoznanie wcisnietego klawisza
KLAWISZ_WCISNIETY ; ustaw bit wcisniecia klawisza
sbrc temp, KLAW_TAK ; przeskocz, jesli to nie klawisz TAK
rjmp KL_TAK ; klawisz TAK wcisniety - skocz do procedury
sbrc temp, KLAW_NIE
ret
sbrc temp, KLAW_G
rjmp KL_G
sbrc temp, KLAW_D
rjmp KL_D
sbrc temp, KLAW_L
rjmp KL_L
rjmp KL_P
;------------------------------------------------------------------------------
KL_TAK: ; wcisniety klawisz TAK - wejscie do menu
sbr flagi, 1<<fMENU ; ustaw bit obslugi MENU
cbr flagi, (1<<fOVER_I) | (1<<fOVER_U) ; zeruj flage dlugiego trzymania klawisza (druga funkcja)
cli
rcall ZBIERANIE_PROBEK_WYLACZ
sei
ldi temp, LCD_D1_C0_B0 ; ...brak migotania
call LCD_COMMAND
rcall MENU ; wywolanie obslugi MENU
; powrot z MENU zawsze zaczyna cykl zbierania probek od nowa
cli
ldi zl, low(2*txt_czek)
ldi zh, high(2*txt_czek)
call LCD_STR_FLASH
; inicjalizacja stosu
ldi r31, high(RAMEND)
out SPH, r31
ldi r31, low(RAMEND)
out SPL, r31
; ustaw bit zerowania preskalera
in temp, SFIOR
sbr temp, 1<<PSR10
out SFIOR, temp
clr temp
out TCNT0, temp ; zeruj licznik timera
cbr flagi, (1<<fMENU) | (1<<fINT2) | (1<<fOVER_I)
; skok na poczatek PETLI glownej
jmp PETLA_START_0
;------------------------------------------------------------------------------
KL_G: ; wcisniety klawisz strzalki w gore
lds temp, Status ; zaladuj zmienna Status przechowujaca bit wyboru co jest wyswietlane
lsl temp ; przesun bit wyboru w lewo
andi temp, ST_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLG_1 ; jesli bit nie zniknal, to przeskocz
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLG_1: sts Status, temp ; zapisz zmienna do RAM
sbrs temp, ST_E2 ; przeskocz, jesli E2 wybrana
ret
sbrs flagi, fTARYFY ; przeskocz, jesli licznik dwutaryfowy
rjmp KL_G ; 1-taryfowy, przesun o jeszcze jedna pozycje
ret
;--------------------------------------
KL_D: ; wcisniety klawisz strzalki w dol
lds temp, Status
lsr temp ; przesun bit wyboru w prawo
brne KLD_1
ldi temp, ST_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
KLD_1: sts Status, temp
sbrs temp, ST_E2 ; przeskocz, jesli E2 wybrana
ret
sbrs flagi, fTARYFY ; przeskocz, jesli licznik dwutaryfowy
rjmp KL_D ; 1-taryfowy, przesun o jeszcze jedna pozycje
ret
;------------------------------------------------------------------------------
KL_L: ; wcisniety klawisz strzalki w lewo
; nalezy rozpoznac ktore wielkosci przesuwac: U, I, M lub E?
lds temp, Status
sbrc temp, ST_M ; przeskocz, jesli bit nocy nie jest wybrany
rjmp KLL_M
sbrc temp, ST_U ; przeskocz, jesli bit napiecia nie jest wybrany
rjmp KLL_U
sbrc temp, ST_I ; przeskocz, jesli bit pradu nie jest wybrany
rjmp KLL_I
sbrc temp, ST_E1 ; przeskocz, jesli bit energii nie jest wybrany
rjmp KLL_E1
sbrc temp, ST_E2 ; przeskocz, jesli bit energii nie jest wybrany
rjmp KLL_E2
ret
;--------------------------------------
KL_P: ; wcisniety klawisz strzalki w prawo
lds temp, Status
sbrc temp, ST_M ; przeskocz, jesli bit mocy nie jest wybrany
rjmp KLP_M
sbrc temp, ST_U ; przeskocz, jesli bit napiecia nie jest wybrany
rjmp KLP_U
sbrc temp, ST_I ; przeskocz, jesli bit pradu nie jest wybrany
rjmp KLP_I
sbrc temp, ST_E1 ; przeskocz, jesli bit energii nie jest wybrany
rjmp KLP_E1
sbrc temp, ST_E2 ; przeskocz, jesli bit energii nie jest wybrany
rjmp KLP_E2
ret
;------------------------------------------------------------------------------
KLL_M: ; przesuw parametru M w lewo
lds temp, Status_M ; zaladuj zmienna parametrow mocy
lsr temp
brne KLLM_1
ldi temp, STM_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
KLLM_1: sts Status_M, temp
ret
;--------------------------------------
KLL_U: ; przesuw parametru U w lewo
lds temp, Status_U ; zaladuj zmienna parametrow napiecia
lsr temp
brne KLLU_1
ldi temp, STU_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
KLLU_1: sts Status_U, temp
ret
;--------------------------------------
KLL_I: ; przesuw parametru I w lewo
lds temp, Status_I ; zaladuj zmienna parametrow pradu
lsr temp
brne KLLI_1
ldi temp, STI_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
KLLI_1: sts Status_I, temp
ret
;--------------------------------------
KLL_E1: ; przesuw parametru E w lewo
lds temp, Status_E1 ; zaladuj zmienna parametrow energii
lsr temp
brne KLLE1_1
ldi temp, STE1_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
sbrc flagi, fKAL
ldi temp, STE1_MSB_K ; dla KALIBRACJI inna maska
KLLE1_1: sts Status_E1, temp
sbrs temp, STE1_POZ ; przeskocz, jesli energia pozorna wybrana
ret
lds temp, Flagi2
sbrs temp, f2EN_S ; przeskocz, jesli en. pozorna jest akumulowana
rjmp KLL_E1 ; en. poz nie akumulowana ==> przesun o jeszcze jedna pozycje
ret
;--------------------------------------
KLL_E2: ; przesuw parametru E w lewo
lds temp, Status_E2 ; zaladuj zmienna parametrow energii
lsr temp
brne KLLE2_1
ldi temp, STE2_MSB ; bit wyboru wyszedl do C -> zaladuj nowy najstarszy bit wyboru
KLLE2_1: sts Status_E2, temp
sbrs temp, STE2_POZ ; przeskocz, jesli energia pozorna wybrana
ret
lds temp, Flagi2
sbrs temp, f2EN_S ; przeskocz, jesli en. pozorna jest akumulowana
rjmp KLL_E2 ; en. poz nie akumulowana ==> przesun o jeszcze jedna pozycje
ret
;------------------------------------------------------------------------------
KLP_M: ; przesuw parametru M w prawo
lds temp, Status_M ; zaladuj zmienna parametrow mocy
lsl temp
andi temp, STM_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLPM_1 ; bit wyboru wyszedl poza zakres?
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLPM_1: sts Status_M, temp
ret
;--------------------------------------
KLP_U: ; przesuw parametru U w prawo
lds temp, Status_U ; zaladuj zmienna parametrow napiecia
lsl temp
andi temp, STU_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLPU_1 ; bit wyboru wyszedl poza zakres?
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLPU_1: sts Status_U, temp
ret
;--------------------------------------
KLP_I: ; przesuw parametru I w prawo
lds temp, Status_I ; zaladuj zmienna parametrow pradu
lsl temp
andi temp, STI_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLPI_1 ; bit wyboru wyszedl poza zakres?
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLPI_1: sts Status_I, temp
ret
;--------------------------------------
KLP_E1: ; przesuw parametru E w prawo
lds temp, Status_E1 ; zaladuj zmienna parametrow energii
lsl temp
andi temp, STE1_MASKA_K ; maska dla kalibracji jest "szersza"
sbrs flagi, fKAL
andi temp, STE1_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLPE1_1
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLPE1_1: sts Status_E1, temp
sbrs temp, STE1_POZ ; przeskocz, jesli energia pozorna wybrana
ret
lds temp, Flagi2
sbrs temp, f2EN_S ; przeskocz, jesli en. pozorna jest akumulowana
rjmp KLP_E1 ; en. poz nie akumulowana ==> przesun o jeszcze jedna pozycje
ret
;--------------------------------------
KLP_E2: ; przesuw parametru E w prawo
lds temp, Status_E2 ; zaladuj zmienna parametrow energii
lsl temp
andi temp, STE2_MASKA ; maskuj, aby sprawdzic czy bit nie wyszedl poza zakres
brne KLPE2_1
ldi temp, 1 ; zaladuj nowa wartosc bitu wyboru
KLPE2_1: sts Status_E2, temp
sbrs temp, STE2_POZ ; przeskocz, jesli energia pozorna wybrana
ret
lds temp, Flagi2
sbrs temp, f2EN_S ; przeskocz, jesli en. pozorna jest akumulowana
rjmp KLP_E2 ; en. poz nie akumulowana ==> przesun o jeszcze jedna pozycje
ret
.exit
;------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -