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

📄 lcd 4开4关定时开关.asm

📁 详细的中文说明 标准的程序格式 保证调试通过877a读写lcd
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	goto	SetAlH7
	goto	SetAlM7
	movf	Hour1,w
	movwf	ALRH6
	movf	Mins1,w
	movwf	ALRM6
	clrf	INTSIG
	clrf	RTCCSIG1
	incf	RTCCSIG
	goto	main
;---
SetAlH7	
	movlw	0c9h		;///c7h数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,6		;/
	movf	INTSIG,W
	movwf	Hour1
	movlw	d'24'
	subwf	Hour1,W
	btfss	STATUS,C
	goto	S7
	clrf	INTSIG
	clrf	Hour1
	goto	S7	
SetAlM7
	movlw	0cch		;///cah数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,6		;/
	movf	INTSIG,W
	movwf	Mins1
	movlw	d'60'
	subwf	Mins1,W
	btfss	STATUS,C
	goto	S7
	clrf	INTSIG
	clrf	Mins1
	goto	S7	
;====================================
Rtccs8
	bcf	STATUS,RP0
	movlw	0c0h
	call	SendCmd
	movlw	'T'
	call	putcLCD
	movlw	'3'
	call 	putcLCD
	movlw	':'
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	'o'
	call	putcLCD
	movlw	'n'
	call	putcLCD
	movlw	' '
	call	putcLCD		;show "t0:  on4    "
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
S8	movlw	80h
	call	SendCmd
	call	DisplayTime
	call	DispTime
	call	LongDelay
	bsf	PCLATH,1
	bcf	PCLATH,0	;///pclath
	movf	RTCCSIG1,W
	addwf	PCL,1
	goto	SetAlH8
	goto	SetAlM8
	movf	Hour1,w
	movwf	ALRH7
	movf	Mins1,w
	movwf	ALRM7
	clrf	INTSIG
	clrf	RTCCSIG1
	incf	RTCCSIG
	goto	main
;---
SetAlH8	
	movlw	0c9h		;///c7h数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,7	;/
	movf	INTSIG,W
	movwf	Hour1
	movlw	d'24'
	subwf	Hour1,W
	btfss	STATUS,C
	goto	S8
	clrf	INTSIG
	clrf	Hour1
	goto	S8
SetAlM8
	movlw	0cch		;///cah数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,7
	movf	INTSIG,W
	movwf	Mins1
	movlw	d'60'
	subwf	Mins1,W
	btfss	STATUS,C
	goto	S8
	clrf	INTSIG
	clrf	Mins1
	goto	S8	
;====================================
Rtccs9
	bcf	STATUS,RP0
	movlw	0c0h
	call	SendCmd
	movlw	'T'
	call	putcLCD
	movlw	'3'
	call 	putcLCD
	movlw	':'
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	'o'
	call	putcLCD
	movlw	'f'
	call	putcLCD
	movlw	'f'
	call	putcLCD		;show "t0:  off4    "
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
S9	movlw	80h
	call	SendCmd
	call	DisplayTime
	call	DispTime
	call	LongDelay
	bsf	PCLATH,1
	bcf	PCLATH,0	;///pclath
	movf	RTCCSIG1,W
	addwf	PCL,1
	goto	SetAlH9
	goto	SetAlM9
	movf	Hour1,w
	movwf	ALRH8
	movf	Mins1,w
	movwf	ALRM8
	clrf	INTSIG
	clrf	RTCCSIG1
	incf	RTCCSIG
	goto	main
;---
SetAlH9	
	movlw	0c9h		;///c7h数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,0
	movf	INTSIG,W
	movwf	Hour1
	movlw	d'24'
	subwf	Hour1,W
	btfss	STATUS,C
	goto	S9
	clrf	INTSIG
	clrf	Hour1
	goto	S9	
SetAlM9
	movlw	0cch		;///cah数增,显示往后移
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,0
	movf	INTSIG,W
	movwf	Mins1
	movlw	d'60'
	subwf	Mins1,W
	btfss	STATUS,C
	goto	S9
	clrf	INTSIG
	clrf	Mins1
	goto	S9	

;============现场保护===============
ISR	
Push
	movwf	_WREG		
	swapf	STATUS,W	
	movwf	_STATUS
	bcf	STATUS,RP0
	btfsc	PIR1,TMR1IF
	call	TimeAdj
	btfsc	INTCON,INTF
	call	IntDeal
	btfsc	INTCON,T0IF
	call	RtccDeal
Pop
	swapf	_STATUS,W	
	movwf	STATUS
	swapf	_WREG,F		
	swapf	_WREG,W		
	retfie
;============TMR1中断====================
TimeAdj
	bcf	STATUS,RP0
	bcf	PIR1,TMR1IF
	movlw	00h
	movwf	TMR1L
	movlw	80h
	movwf	TMR1H
	incf	Secs,1
	movlw	d'60'
	xorwf	Secs,W
	btfss	STATUS,Z
	goto	TE
	clrf	Secs
	incf	Mins,1
	movlw	d'60'
	xorwf	Mins,W
	btfss	STATUS,Z
	goto	TE
	clrf	Mins
	incf	Hour
	movlw	d'24'
	xorwf	Hour,W
	btfss	STATUS,Z
	goto	TE
	clrf	Hour
TE
	return
;========RB0中断==========================
IntDeal
	bcf	INTCON,INTF
	bsf	PORTB,0
	btfsc	PORTB,0		
	goto	$+5			
	call	Delay	
	bsf	PORTB,0		;  按键去抖动
	btfsc	PORTB,0
	goto	$+2			
	incf	INTSIG
	return
;============RTCC(RA4)按键中断=============================
RtccDeal
	bcf	STATUS,RP0
	movlw	0ffh			
	movwf	TMR0
	bcf	INTCON,T0IF
	bsf	PORTA,4
	btfsc	PORTA,4		
	goto	RtcWr			
	call	Delay
	bsf	PORTA,4		;  按键去抖动
	btfsc	PORTA,4
	goto	RtcWr			
	movf	RTCCSIG,W
	sublw	0bh		;/////闹铃数/////
	btfss	STATUS,C
	goto	WRONG
	movf	RTCCSIG1,W
	sublw	03h
	btfss	STATUS,C
	goto	WRONG
	movf	RTCCSIG,W
	addwf	RTCCSIG1,W
	btfsc	STATUS,Z
	goto	$+3
	incf	RTCCSIG1
	goto	RtcWr
	incf	RTCCSIG
	goto	RtcWr

WRONG	
	clrf	RTCCSIG
	clrf	RTCCSIG1
RtcWr	return

; ============DisplayTime - 将显示指针移至第一行,调用Bin2BCD
; 子程序将Secs 和 Mins寄存器内的数据转换为相应的
; ASCII 码, 然后送 LCD显示======================                     
DisplayTime
	bcf	STATUS,RP0
	call	Bin2BCD		; 调用二进制与bcd码转换子程序
	movf	HourH,W		; 显示小时高位
	call	putcLCD		; 
	movf	HourL,W		; 显示小时低位
	call	putcLCD		; 
	movlw	':'
	call	putcLCD		; 显示 ':' 
	movf	MinsH,W		; 显示分钟高位
	call	putcLCD		; 
	movf	MinsL,W		; 显示分钟低位
	call	putcLCD		; 
	movlw	':'		; 显示 ':' 
	call	putcLCD
	movf	SecsH,W		; 
	call	putcLCD		; 
	movf	SecsL,W		; 00:00:00
	call	putcLCD		; 
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD		;show "Set Time"
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
	movlw	' '
	call	putcLCD
	return
; ========将 Secs & Mins 寄存器内的二进制数转
; 换为相应的 ASCII 码并存为 SecsH:SecsL 及     
; MinsH:MinsL,HourH:HourL的形式==============================               
Bin2BCD
	bcf	STATUS,RP0
	clrf	HourH		; 初始化变量
	movf	Hour,W		; 转换“时”
	movwf	HourL
Hourth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	HourL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Next
	movwf	HourL
	incf	HourH,F
	goto	Hourth
Next
	clrf	MinsH		; 初始化变量
	movf	Mins,W		; 转换“分”
	movwf	MinsL
Mtenth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	MinsL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Next1
	movwf	MinsL
	incf	MinsH,F
	goto	Mtenth
Next1
	clrf	SecsH		; 初始化变量
	movf	Secs,W		; 转换“秒”
	movwf	SecsL
Stenth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	SecsL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Over
	movwf	SecsL
	incf	SecsH,F
	goto	Stenth
Over
	movlw	0x30		; 
	addwf	HourH,F		; 
	addwf	HourL,F		; Add 0x30 ('0') to all
	addwf	MinsH,F		; variables to convert
	addwf	MinsL,F		; a number 0 - 9 to an
	addwf	SecsH,F		; ASCII equivalent
	addwf	SecsL,F		; '0' to '9'
	return
;*====
DispTime
	bcf	STATUS,RP0
	movlw	0c9h		;/c7h数增2,显示往后移2
	call	SendCmd
	call	Bin2BCa		; 调用二进制与bcd码转换子程序
	movf	HourH1,W	; 显示小时高位
	call	putcLCD		; 
	movf	HourL1,W	; 显示小时低位
	call	putcLCD		; 
	movlw	':'		; 显示 ':' 
	call	putcLCD
	movf	MinsH1,W	; 
	call	putcLCD		; 
	movf	MinsL1,W	; 00:00
	call	putcLCD		; 
	return
;*----
Bin2BCa
	bcf	STATUS,RP0
	clrf	HourH1		; 初始化变量
	movf	Hour1,W		; 转换“时”
	movwf	HourL1
Hourth1				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	HourL1,W	; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Nexta
	movwf	HourL1
	incf	HourH1,F
	goto	Hourth1
Nexta
	clrf	MinsH1		; 初始化变量
	movf	Mins1,W		; 转换“分”
	movwf	MinsL1
Mtenth1				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	MinsL1,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Over1
	movwf	MinsL1
	incf	MinsH1,F
	goto	Mtenth1
Over1
	movlw	0x30		; 
	addwf	HourH1,F	; 
	addwf	HourL1,F	; Add 0x30 ('0') to all
	addwf	MinsH1,F	; variables to convert
	addwf	MinsL1,F	; a number 0 - 9 to an
	return			; ASCII equivalent

;=============初始化LCD模块===========================
InitLCD
	bcf	STATUS,RP0			; Bank 0
	bcf	STATUS,RP1
	clrf	LCD_DATA			; 清 LCD 数据 & 控制位
	bsf	STATUS,RP0			; Bank 1
	movlw	0xc1				; 设置RB1~RB5为输出
	movwf	LCD_DATA
	bcf	TRISA,5
	
	bcf	STATUS,RP0			;
	movlw   0x00			; 
	movwf   LCD_DATA
	bsf     LCD_CNTL2, E
	bcf     LCD_CNTL2, E

	movlw   0x08			; 
	movwf   LCD_DATA
	bsf     LCD_CNTL2, E
	bcf     LCD_CNTL2, E
	call	LongDelay
	call	LongDelay

	movlw	b'00101000'
	call	SendCmd
	movlw	DISP_ON				; 开显示
	call	SendCmd
	movlw	ENTRY_INC			; 设置指针移动方式
	call	SendCmd
	movlw	DD_RAM_ADDR			; 设置起始地址
	call	SendCmd

InitLCDEnd					
	bcf	STATUS,RP0			 
	movlw	CLR_DISP	 
	call	SendCmd
	return

;============ 将字符数据送入 LCD =============                                  
putcLCD
	bcf	STATUS,RP0
	movwf	Byte		; 存 WREG 到 Byte 寄存器
	swapf	Byte,W		; 写入高半字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bsf	LCD_CNTL1, RS	; 设置为送数据模式
	bsf	LCD_CNTL2, E	; 发送数据信号
	bcf	LCD_CNTL2, E

	movf	Byte,W		; 接着送低半字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bsf	LCD_CNTL1, RS	; 设置为送数据模式
	bsf	LCD_CNTL2, E	; 发送数据信号
	bcf	LCD_CNTL2, E
	call	Delay
	return

;========== 送命令到 LCD ================

SendCmd
	bcf	STATUS,RP0
	movwf	Byte		; 存 WREG 到 Byte 寄存器
	swapf	Byte,W		; 送入命令的高字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bcf	LCD_CNTL1,RS	; 设置为送命令模式
	bsf	LCD_CNTL2,E	; 发送数据信号
	bcf	LCD_CNTL2,E
	movf	Byte,W		; 接着送命令的低字节 
	
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bcf	LCD_CNTL1,RS	; 设置为送命令模式
	bsf	LCD_CNTL2,E	; 发送数据信号
	bcf	LCD_CNTL2,E
	call	Delay
	return
;===========闹铃==================
ALR1	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH1,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM1,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	STATUS,RP0
	clrf	TRISD
	bcf	STATUS,RP0	
	nop
	bsf	PORTD,6
	return
;=================================
ALR2	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH2,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM2,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	STATUS,RP0
	clrf	TRISD
	bcf	STATUS,RP0	
	nop
	bcf	PORTD,6
	return
;==================================
ALR3	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH3,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM3,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	PORTD,7
	return
;=================================
ALR4	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH4,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM4,W
	btfss	STATUS,Z
	goto	ALREND
	bcf	PORTD,7
	return
;=================================
ALR5	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH5,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM5,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	PORTD,5
	return
;=================================
ALR6	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH6,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM6,W
	btfss	STATUS,Z
	goto	ALREND
	bcf	PORTD,5
	return
;=================================
ALR7	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH7,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM7,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	STATUS,RP0
	clrf	TRISD
	bcf	STATUS,RP0	
	nop
	bsf	PORTD,4
	return
;=================================
ALR8	bcf	STATUS,RP0
	movf	Hour,W
	xorwf	ALRH8,W
	btfss	STATUS,Z
	goto	ALREND
	movf	Mins,W
	xorwf	ALRM8,W
	btfss	STATUS,Z
	goto	ALREND
	bsf	STATUS,RP0
	clrf	TRISD
	bcf	STATUS,RP0	 
	nop
	bcf	PORTD,4
	return
;-------------
ALREND	
	return

;==========去抖==============
Delay					
	bcf	STATUS,RP0
	clrf	Count			
Dloop
	decfsz	Count,f			
	goto	Dloop			
	return				
;-------------------------
LongDelay
	bcf	STATUS,RP0
	clrf	Count
	clrf	Count1
	movlw	0x03
	movwf	Count2
LDloop
	decfsz	Count,f
	goto	LDloop
	decfsz	Count1,f
	goto	LDloop
	decfsz	Count2,f
	goto	LDloop
	return
;*------
	END

⌨️ 快捷键说明

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