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

📄 klaw.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 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 + -