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

📄 timekey.asm

📁 it consist of PCF8583 assembly driver
💻 ASM
字号:
;----------------------------------------------------------------------------
;                    I N T E R R U P T     P R O G R A M M                   
;----------------------------------------------------------------------------


;------------------------------ Entrance ------------------------------------

TimeKey:	sei			;global INT enable	

		push	r16		;push R16
		ldi	r16,177
		out	TCNT0,r16	;T/C0 start from 177
	
		in	r16,sreg	;push sreg
		push	r16		;push sreg

		push	XL		;
		push	XH		;
		push	YL		;
		push	YH		;
		push	R17		;
		push	R18		;
		push	R19		;
		push	R20		;
		push	R21		;
		push	R22		;
		push	R23		;Push Rx in STACK

;------------------------------ EEPROM Write --------------------------------


;------------------------------ MIRROR SERVICE ------------------------------

		lds	r16,PCF8583_FLAG	;Load 8583_FLAG from RAM

		tst	r16			;8583_FLAG = 0 ?
		brne	TK15			;If NOT goto TK8

	;---------------	READ Cycle	----------------------------
		rcall	I2CSTART		;BEGIN OF TRANSFER
		ldi	r16,0xA0		;RD Addr PLL => I2C
		rcall	I2COUT			;Exequte 
		ldi	r16,0x00		;GET REGISTER 0x00
		rcall	I2COUT			;Exequte
		rcall	I2CSTOP			;END OF TRANSFER

		rcall	I2CSTART		;BEGIN OF TRANSFER
		ldi	r16,0xA1		;RD Addr PLL => I2C
		rcall	I2COUT			;Exequte 

		ldi	ACK,15			;ACK --> Counter=15
		ldi	XL,PCF8583_A00		;XL --> First ADRESS in RAM
M1:		rcall	I2CIN			;Read Byte=>R16 
		st	X+,R16			;Store REGISTER to RAM
		dec	ACK			;DEC ACK (Counter)
		brne M1

		rcall	I2CSTOP			;END OF TRANSFER
		rjmp	TK16
	
	;---------------	WRITE Cycle	----------------------------
TK15:

		ldi	r16,0b00000100
		sts	PCF8583_A00,r16
		clr	r16
		sts	PCF8583_A09,r16
		sts	PCF8583_A0A,r16
		sts	PCF8583_A0D,r16
		sts	PCF8583_A0E,r16
		sts	PCF8583_A0F,r16

		;----- PCF8583 STOP TIME ENABLE -----
		lds	r17,PCF8583_A00	;Get STATUS REGISTER from RAM
		sbr	r17,0b10000000		;Set STOP flag
		sts	PCF8583_A00,r17	;GET STATUS REGISTER
		;------------------------------------

		rcall	I2CSTART		;BEGIN OF TRANSFER
		ldi	r16,0xA0		;RD Addr PLL => I2C
		rcall	I2COUT			;Exequte 
		ldi	r16,0x00		;GET STATUS REGISTER
		rcall	I2COUT			;Exequte

		ldi	r17,15			;R17 --> Counter=15
		ldi	XL,PCF8583_A00		;XL --> First ADRESS in RAM

W1:		ld	r16,X+			;GET Digit from RAM
		rcall	I2COUT			;WRITE Byte=>R16 
		dec	R17			;DEC ACK (Counter)
		brne W1

		rcall	I2CSTOP			;END OF TRANSFER


		;----- PCF8583 STOP TIME DISABLE -----
		lds	r17,PCF8583_A00	;Get STATUS REGISTER from RAM
		cbr	r17,0b10000000		;Set STOP flag
		sts	PCF8583_A00,r17	;GET STATUS REGISTER
		
		rcall	I2CSTART		;BEGIN OF TRANSFER
		ldi	r16,0xA0		;RD Addr PLL => I2C
		rcall	I2COUT			;Exequte 
		ldi	r16,0x00		;GET STATUS REGISTER
		rcall	I2COUT			;Exequte
		mov	r16,r17			;GET STATUS REGISTER
		rcall	I2COUT			;Exequte
		rcall	I2CSTOP			;END OF TRANSFER
		;------------------------------------

		clr	r16
		sts	PCF8583_FLAG,r16	;Clear PCF8583 WRITE Flag	


TK16:	
;-------------------------- Procedure RCALL ---------------------------------
		
		ldi	XL,DIGIT_7SEG1		;First adress of digit in 7SEG code
		ldi	YL,DIGIT_DEC1		;First adress of digit in DEC  code
		rcall	DEC_2_7SEG			

		ldi	XL,DIGIT_7SEG2		;First adress of digit in 7SEG code
		ldi	YL,DIGIT_DEC2		;First adress of digit in DEC  code
		rcall	DEC_2_7SEG	

		tst	POINT			;Test POINT state (ON/OFF)
		brne	TK11

		lds	r16,DIGIT_7SEG1+2	;
		sbr	r16,0b00000100		;
		sts	DIGIT_7SEG1+2,r16	;Hardware 1/4s point simulation for CLOCK

		tst	ALRM			;Test ALARM state (ON/OFF)
		brne	TK10
		
		lds	r16,DIGIT_7SEG2	;
		cbr	r16,0b00000100		;
		sts	DIGIT_7SEG2,r16	;Hardware 1/4s point simulation for ALARM
		rjmp	TK11

TK10:		lds	r16,DIGIT_7SEG2	;
		sbr	r16,0b00000100		;
		sts	DIGIT_7SEG2,r16	;Hardware 1/4s point simulation for ALARM

TK11:	

;----------------- HardWare DIGIT DISPLAY & BUTTONS Capture -----------------

				
		lds	r18,IND_COUNT		;Get IND_COUNT from RAM
		lds	XL,IND_ADR		;Get IND_ADR from RAM
		lds	r19,KEY_SHIFT		;Load KEY_SHIFT from RAM
		

	;---------------	BUTTONS Capture	----------------------
	
		in	r16,PIND		;Read BUTTONS state
		swap	r16
		andi	r16,0b00000001		;Get BUTTON Pressed/Not pressed
		
		tst	r16			;
		brne	TK12			;
		sec				;
		rjmp	TK13			;
TK12:		clc				;
TK13:		ror	r19			;KEY state creating
		sts	KEY_SHIFT,r19		;Store IND_COUNT to RAM

		cpi	r18,4			;Compare IND_COUNT & 4 (number of digits displayed)
		brne	TK14			;If NOT goto TK14
		mov	r20,r19			;
		swap	r20			;
		and	r20,r19			;
		andi	r20,0x0F		;
		mov	KEY,r20			;KEY creating (antidebezg & mask including)
TK14:

	;----------------------------------------------------------------

	
	;---------	DIGIT ROLLING & DIG1/DIG2 SELECTION	---------------

		in	r16,PORTB		;GET PORTB State
		mov	r17,r16			;Duplicate R16 ==> R17
		andi	r17,0b00001111		;MASKING r17
		andi	r16,0b11110000		;MASKING r16

		cpi	r18,4			;Compare IND_COUNT & 4 (number of digits displayed)
		brne	TK4			;If NOT goto TK4

		lds	r18,IND_FLAG		;Load IND_FLAG from RAM
		tst	r18			;
		brne	TK8			;
		ldi	r18,DIGIT_7SEG1	;
		rjmp	TK9			;
TK8:		ldi	r18,DIGIT_7SEG2	;DIGIT_7SEG1/DIGIT_7SEG2 Display selection
		
TK9:		mov	XL,r18			;Store BEGIN of DIGITS in XL

		clr	r18			;Clear IND_COUNT
		clc				;CLEAR CARRY Flag
		rjmp	TK5
TK4:		sec				;SET CARRY Flag
TK5:		rol	r17			;ROL r17
		andi	r17,0b00001111		;MASKING r17
		or	r16,r17			;r16 + r17 ==> r16
		out	PORTB,r16		;r16 OUT to PORTB
				

	;----------------------------------------------------------------

		inc	r18			;INC IND_COUNT
		ld	R16,X+			;Load data to R16 from adress X 
		sts	IND_COUNT,r18		;STORE IND_COUNT to RAM
		sts	IND_ADR,XL		;STORE	IND_ADR to RAM
	
	;------------------	DIGIT OUT THRUE 74LS164	---------------

		ldi	r17,8
TK1:		rol	r16			;ROL DIGIT_7SEG thrue CARRY
		brcc	TK2			;If C=0 goto TK2
		sbi	PORTD,IND_DATA		;DATA "1" for 74LS164
		rjmp	TK3
TK2:		cbi	PORTD,IND_DATA		;DATA "0" for 74LS164
TK3:		sbi 	PORTD,IND_CLOCK	;
		cbi 	PORTD,IND_CLOCK	;CLOCK for 74LS164
		dec	r17
		brne	TK1

	;------------------	IND_FLAG GENERATION	----------------------

		lds	r17,IND_FLAG		;Load IND_FLAG from RAM
		inc	CNT1			;INC CNT1
		cpi	CNT1,40			;Compare CNT1 & 40 DEC
		brne	TK6
		clr	r17			;Set IND_FLAG ==> 0x00
TK6:		cpi	CNT1,80			;Compare CNT1 & 80 DEC
		brne	TK7
		ser	r17			;Set IND_FLAG ==> 0xFF
		clr	CNT1			;Clear CNT1

TK7:		sts	IND_FLAG,r17		;Store 	IND_FLAG to RAM	

	;----------------------------------------------------------------



;---------------- DELAY 025s ---------------------------------------------

		tst	DEL25
		breq	EXIT
		dec	DEL25
		rjmp	EXIT
		
;-------------------------------------------------------------------------


;------------------------------ EXIT ---------------------------------------
	
EXIT:		pop	r23		;
		pop	r22		;
		pop	r21		;
		pop	r20		;
		pop	R19		;
		pop	R18		;
		pop	R17		;
		pop	YH		;
		pop	YL		;
		pop	XH		;
		pop	XL		;
		pop	r16		;Pop Rx from STACK

		out	sreg,r16	;Pop sreg
		pop	r16		;pop R16

		RETI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -