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

📄 实验26.asm

📁 实验26-DS1302实时时钟芯片应用实验参考程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;------------------------------------------------------------------------------------------
;DS1302实时时钟芯片应用实验参考程序(实验26.asm)
;------------------------------------------------------------------------------------------
LIST	P=16F877
INCLUDE"P16F877.INC"
;------------------------------------------------------------------------------------------
ADDRESS	EQU	30H			;地址寄存器
BUFFER	EQU	31H			;通信缓冲寄存器
CNT	EQU	32H			;通信计数器
SECOND	EQU	33H			;秒寄存器
MINUTE	EQU	34H			;分寄存器
HOUR	EQU	35H			;时寄存器
DATE	EQU	36H			;日寄存器
MONTH	EQU	37H			;月寄存器
DAY	EQU	38H			;周日寄存器
YEAR	EQU	39H			;年寄存器
WORKMD	EQU	3AH			;工作模式寄存器
CNTCNT	EQU	72H
TMP_FSR	EQU	71H			;FSR保护缓冲器
SCLK	EQU	00H			;时钟信号接口
DIO	EQU	01H			;数据信号接口
RET	EQU	02H			;重启信号接口
	ORG	0000H
	NOP
	GOTO	MAIN			;跳转至主程序MAIN
;------------------------------------------------------------------------------------------
;编码查询
;------------------------------------------------------------------------------------------
BMA	ADDWF	PCL,F		   
	RETLW	3FH			;"0" 编码
	RETLW	06H			;"1" 编码
	RETLW	5BH			;"2" 编码
	RETLW	4FH			;"3" 编码
	RETLW	66H			;"4" 编码
	RETLW	6DH			;"5" 编码
	RETLW	7DH			;"6" 编码
	RETLW	07H			;"7" 编码
	RETLW	7FH			;"8" 编码
	RETLW	6FH			;"9" 编码
	RETLW	00H 	     		;"暗" 编码
	RETLW	40H			;"-" 编码
	RETLW	00H			;空编码
	RETLW	00H			;空编码
	RETLW	00H			;空编码
	RETLW	00H			;空编码
	RETLW	0BFH			;"0." 编码
	RETLW	086H			;"1." 编码
	RETLW	0DBH			;"2." 编码
	RETLW	0CFH			;"3." 编码
	RETLW	0E6H			;"4." 编码
	RETLW	0EDH			;"5." 编码
	RETLW	0FDH			;"6." 编码
	RETLW	087H			;"7." 编码
	RETLW	0FFH			;"8." 编码
	RETLW	0EFH			;"9." 编码
;------------------------------------------------------------------------------------------
;主程序
;------------------------------------------------------------------------------------------
MAIN	BSF	STATUS,RP0		;转到体1
	MOVLW	B'00010000'		
	MOVWF	TRISC			;设置RC口方向控制字
	CLRF	SSPSTAT		   	;清除SMP、CKE位(SPI专用指令)
	BCF	STATUS,RP0		;转回体0
	MOVLW	B'00110000'		;设置SSP控制方式:取FOSC/4、SPI主控、CKP=1
	MOVWF	SSPCON			;(SPI专用指令)
	MOVLW	00H
	MOVWF	SECOND			;设置秒初始值
	MOVLW	50H
	MOVWF	MINUTE			;设置分初始值
	MOVLW	15H
	MOVWF	HOUR			;设置时初始值
	MOVLW	15H	
	MOVWF	DATE			;设置日初始值
	MOVLW	10H
	MOVWF	MONTH			;设置月初始值
	MOVLW	06H
	MOVWF	DAY			;设置周日初始值
	MOVLW	05H
	MOVWF	YEAR			;设置年初始值
	CALL	WRITE			;调用WRITE子程序,设置并启动DS1302芯片
	CALL	CSH			;调用显示器初始化程序
	MOVLW	B'00000100'
	MOVWF	WORKMD			;设置工作模式为监控状态
;------------------------------------------------------------------------------------------
;键盘扫描子程序
;------------------------------------------------------------------------------------------
RD0	BTFSS	PORTD,0			;判断键0是否已按下
	GOTO	RD1			;若没按下,则跳转至RD1
	CALL	YS10MS			;延时10毫秒,消除抖动
	BTFSS	PORTD,0			;再次判断键0是否已按下
	GOTO	RD1			;若没按下,则跳转至RD1			
PD0	BTFSC	PORTD,0			;判断键0是否已放开
	GOTO	PD0			;若没有,则跳转至PD0
	CALL	YS10MS			;延时10毫秒,消除抖动
	BTFSC	PORTD,0			;再次判断键0是否已放开
	GOTO	PD0			;若没有,则跳转至PD0				
	MOVLW	B'00000001'
	MOVWF	WORKMD			;改变工作模式到显示时分秒模式
RD1	BTFSS	PORTD,1
	GOTO	RD2
	CALL	YS10MS
	BTFSS	PORTD,1
	GOTO	RD2
PD1	BTFSC	PORTD,1
	GOTO	PD1
	CALL	YS10MS
	BTFSC	PORTD,1
	GOTO	PD1
	MOVLW	B'00000010'
	MOVWF	WORKMD			;改变工作模式到显示年月日周日模式
RD2	BTFSS	PORTD,2
	GOTO	NEXT
	CALL	YS10MS
	BTFSS	PORTD,2
	GOTO	NEXT
PD2	BTFSC	PORTD,2
	GOTO	PD2
	CALL	YS10MS
	BTFSC	PORTD,2
	GOTO	PD2
	MOVLW	B'00000100'
	MOVWF	WORKMD			;改变工作模式到监控状态
NEXT	CALL	YS100MS
	BTFSS	WORKMD,0		;判断工作模式是否处于显示时分秒模式
	GOTO	NEXT1			;若不是,跳转至NEXT1
	CALL	XIANS1			;调用显示时分秒子程序
	GOTO	RD0			;跳转至RD0
NEXT1	BTFSS	WORKMD,1		;判断工作模式是否处于显示年月日周日模式
	GOTO	NEXT2			;若不是,跳转至NEXT2
	CALL	XIANS2			;调用显示年月日周日子程序
	GOTO	RD0			;跳转至RD0
NEXT2	BTFSS	WORKMD,2		;判断工作模式是否处于监控状态模式
	GOTO	RD0			;若不是,则跳转至RD0
	CALL	XIANS3			;调用显示监控状态子程序
	GOTO	RD0			;跳转至RD0
;------------------------------------------------------------------------------------------
;显示时分秒子程序 
;------------------------------------------------------------------------------------------
XIANS1	CALL	READ			;调用READ子程序,读取DS1302数据
	MOVF	SECOND,W			
	ANDLW	0FH
	MOVWF	60H			;将秒数据的低位放到显示缓冲寄存器60H
	SWAPF	SECOND,W
	ANDLW	0FH
	MOVWF	61H			;将秒数据的高位放到显示缓冲寄存器61H	
	MOVF	MINUTE,W
	ANDLW	0FH
	MOVWF	63H			;将分数据的低位放到显示缓冲寄存器63H
	SWAPF	MINUTE,W
	ANDLW	0FH
	MOVWF	64H			;将分数据的高位放到显示缓冲寄存器64H
	MOVF	HOUR,W
	ANDLW	0FH
	MOVWF	66H			;将时数据的低位放到显示缓冲寄存器66H
	SWAPF	HOUR,W
	ANDLW	0FH
	MOVWF	67H			;将时数据的高位放到显示缓冲寄存器67H
	MOVLW	0AH
	MOVWF	62H
	MOVWF	65H			;显示缓冲寄存器62H、65H显示为暗
	CALL	XSHI			;调用显示子程序XSHI
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;显示年月日周日子程序 
;------------------------------------------------------------------------------------------
XIANS2	CALL	READ			;调用READ子程序,读取DS1302数据
	MOVF	DAY,W
	ANDLW	0FH
	MOVWF	60H			;将周日数据的低位放到显示缓冲寄存器60H
	SWAPF	DAY,W
	ANDLW	0FH
	MOVWF	61H			;将周日数据的高位放到显示缓冲寄存器61H
	MOVF	DATE,W
	ANDLW	0FH
	MOVWF	62H			;将日数据的低位放到显示缓冲寄存器62H
	SWAPF	DATE,W
	ANDLW	0FH
	MOVWF	63H			;将日数据的高位放到显示缓冲寄存器63H
	MOVF	MONTH,W
	ANDLW	0FH
	MOVWF	64H			;将月数据的低位放到显示缓冲寄存器64H
	SWAPF	MONTH,W
	ANDLW	0FH
	MOVWF	65H			;将月数据的高位放到显示缓冲寄存器65H
	MOVF	YEAR,W
	ANDLW	0FH
	MOVWF	66H			;将年数据的低位放到显示缓冲寄存器66H
	SWAPF	YEAR,W
	ANDLW	0FH
	MOVWF	67H			;将年数据的高位放到显示缓冲寄存器67H
	MOVLW	10H
	ADDWF	60H
	ADDWF	62H
	ADDWF	64H
	ADDWF	66H			;为偶数位显示器加"."以分隔不同数据
	CALL	XSHI			;调用显示子程序XSHI
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;显示监控状态子程序 
;------------------------------------------------------------------------------------------
XIANS3	CALL	JKZT			;调用显示监控状态子程序JKZT
	CALL	XSHI			;调用显示子程序XSHI
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;显示器初始化子程序 
;------------------------------------------------------------------------------------------
CSH	CALL	JKZT			;调用监控状态子程序JKZT
	CALL	XSHI			;调用显示子程序XSHI

⌨️ 快捷键说明

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