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

📄 menu.asm

📁 实现对ADE7759电能芯片的读写和校准,AVR单片机源码与电路图,单相电能表读写程序和初始化程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	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 + -