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

📄 实验26.asm

📁 实验26-DS1302实时时钟芯片应用实验参考程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	MOVLW	67H			
	MOVWF	FSR			;立即数67H送FSR
	CLRF	CNTCNT			;CNTCNT清0
CF	MOVF	CNTCNT,W			
	MOVWF	INDF			;CNTCNT中内容送INDF所指向的寄存器
	CALL	XSHI			;调用显示子程序XSHI
	CALL	YS500MS			;延时500ms
	INCF	CNTCNT			;CNTCNT加1
	DECF	FSR			;FSR减1
	BTFSS	FSR,3			;判断是否已显示到了第0位
	GOTO	CF			;若没有,则跳转至CF
	CALL	JKZT			;调用监控状态子程序JKZT
	CALL	XSHI			;调用显示子程序XSHI
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;显示子程序 
;------------------------------------------------------------------------------------------
XSHI 	MOVF	FSR,W
	MOVWF	TMP_FSR			;保护FSR中的内容
	MOVLW	67H
	MOVWF	FSR
LOOP	MOVF	INDF,W
	CALL	BMA
	CALL	SPIOUT			;调用SPIOUT子程序
	DECF	FSR
	BTFSS	FSR,3			;判断是否发送完毕
	GOTO	LOOP			;若没有,则继续发送
	MOVF	TMP_FSR,W					
	MOVWF	FSR			;恢复FSR中的内容
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;SPI方式输出编码子程序
;------------------------------------------------------------------------------------------
SPIOUT	MOVWF	SSPBUF			;读取编码到SPI缓冲器
	BSF	STATUS,RP0		;转到体1
LP	BTFSS	SSPSTAT,BF   	        ;是否发送完毕
	GOTO	LP			;继续发送
	BCF	STATUS,RP0		;返回体0
	MOVF	SSPBUF,W		;读取一个无效字符
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;8位数码全暗,仅仅最高位给出“-”键控提示符
;------------------------------------------------------------------------------------------
JKZT	MOVLW	60H                 	;除最高位外,均设置为全暗
	MOVWF	FSR
TUN	MOVLW	0AH			;0AH代表“暗” 编码
	MOVWF	INDF			;间接寻址
	INCF	FSR			;地址加1
	BTFSS	FSR,3			;是否8个单元结束
	GOTO	TUN			;没有,进行
	MOVLW	0BH		   	;最高位67H单元送“-”编码
	MOVWF	67H
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;设置及启动DS1302芯片子程序
;------------------------------------------------------------------------------------------
WRITE	BCF    	PORTC,RET		;RET信号置0
	BCF    	PORTC,SCLK		;SCLK信号置0
	BSF     PORTC,RET		;RET信号置1
	MOVLW   8EH
	MOVWF   BUFFER
	CALL    WBYTE			;写入写保护开关地址
	MOVLW	00H				 
	MOVWF  	BUFFER 
	CALL   	WBYTE 			;关闭DS1302写保护
	BSF    	PORTC,SCLK		;SCLK信号置1
	BCF    	PORTC,RET		;RET信号置0
	MOVLW  	SECOND
	MOVWF  	FSR			;把秒地址送FSR
	MOVLW  	07H
	MOVWF	CNTCNT			;计数器赋初值
	MOVLW	80H         
	MOVWF	ADDRESS			;设置地址寄存器初值
W1302LP BCF     PORTC,RET		;RET信号置0
	BCF    	PORTC,SCLK		;SCLK信号置0
	BSF    	PORTC,RET		;RET信号置1
        MOVF    ADDRESS,W 
        MOVWF   BUFFER 			;送本次要写入的地址值到BUFFER
        CALL    WBYTE			;调用WBYTE子程序,传送地址到DS1302
        MOVF    INDF,W
        MOVWF   BUFFER			;送本次要写入的数据值到BUFFER
        CALL    WBYTE			;调用WBYTE子程序,传送数据到DS1302
        INCF    FSR			;取下一个数据地址
        INCF    ADDRESS
        INCF    ADDRESS			;取下一个DS1302寄存器地址
        BSF     PORTC,SCLK 		;SELK信号置1
        BCF     PORTC,RET		;RET信号置0
        DECFSZ  CNTCNT,F 		;判断所有数据是否传送完毕
        GOTO    W1302LP			;若没有,则跳转至W1302LP
        BCF     PORTC,RET		;RET信号置0
        BCF     PORTC,SCLK 		;SELK信号置0
       	BSF     PORTC,RET 		;RET信号置1
       	MOVLW   8EH
       	MOVWF   BUFFER 
       	CALL    WBYTE 			;写入写保护开关地址
       	MOVLW   80H
       	MOVWF   BUFFER 
       	CALL    WBYTE 			;打开DS1302写保护
       	BSF     PORTC,SCLK  		;SELK信号置1
	BCF     PORTC,RET		;RET信号置0
        RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;读取DS1302芯片数据子程序
;------------------------------------------------------------------------------------------
READ    MOVLW   SECOND
        MOVWF   FSR 			;送秒地址到FSR
        MOVLW   07H
        MOVWF   CNTCNT			;计数器赋初值
        MOVLW   81H
        MOVWF   ADDRESS			;设地址寄存器初值
R1302LP	BCF     PORTC,RET		;RET信号置0
	BCF  	PORTC,SCLK 
	BSF     PORTC,RET		;RET信号置1
        MOVF	ADDRESS,W 
        MOVWF	BUFFER			;送本次要读出的地址值到BUFFER
        CALL	WBYTE			;调用WBYTE子程序,传送地址到DS1302
        CALL	RBYTE			;调用RBYTE子程序,接收数据到BUFFER
        MOVF    BUFFER,W 
        MOVWF   INDF 			;送BUFFER中数据到相应寄存器
        INCF    FSR			;取下一个数据地址
        INCF    ADDRESS
        INCF    ADDRESS			;取下一个DS1302寄存器地址
        BSF     PORTC,SCLK		;SCLK信号置1
	BCF     PORTC,RET		;RET信号置0
        DECFSZ  CNTCNT,F		;判断是否已读取所有数据
        GOTO    R1302LP			;若没有,则跳转至R1302LP
        RETURN 				;子程序返回
;------------------------------------------------------------------------------------------
;向DS1302芯片传送一个字节数据子程序
;------------------------------------------------------------------------------------------
WBYTE   BSF     STATUS,RP0		;转到体1
        BCF     TRISC,DIO		;设置DIO口为输出
        BCF     STATUS,RP0   		;返回体0
	MOVLW   08H
        MOVWF   CNT			;设置计数器初值
WLOOP	BCF	PORTC,DIO		;置DIO信号为0
	RRF     BUFFER,F		;BUFFER寄存器右移1位
        BTFSC   STATUS,C 		;判断STATUS进位位C是否为0
        BSF	PORTC,DIO		;若不是,则置DIO为1
        BSF     PORTC,SCLK		;SCLK信号置1
	NOP				;保持信号,以便DS1302接收
      	BCF     PORTC,SCLK		;SCLK信号置0
        DECFSZ  CNT,F			;判断8位数据是否发送完毕
        GOTO    WLOOP			;若没有,则跳转至WLOOP
        RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;从DS1302芯片接收一个字节数据子程序
;------------------------------------------------------------------------------------------
RBYTE   BSF     STATUS,RP0		;转到体1
        BSF     TRISC,DIO		;设置DIO口为输入
        BCF     STATUS,RP0   		;返回体0
	MOVLW   08H
        MOVWF   CNT			;设置计数器初值
RLOOP	BCF	STATUS,C		;置STATUS进位位C为0
	BTFSC   PORTC,DIO		;判断DIO信号是否为1
     	BSF     STATUS,C 		;若不是,则置STATUS进位位C为1
	RRF     BUFFER,F		;BUFFER寄存器右移1位
        BSF     PORTC,SCLK		;SCLK信号置1
	NOP				;保持信号,以便DS1302接收
      	BCF     PORTC,SCLK		;SCLK信号置0
        DECFSZ 	CNT,F			;判断8位数据是否读取完毕
        GOTO    RLOOP			;若没有,则跳转至RLOOP
        RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;延时10ms子程序
;------------------------------------------------------------------------------------------
YS10MS	MOVLW	.19			;外循环常数
	MOVWF	26H			;外循环寄存器
Y10MSW	MOVLW	.174			;内循环常数
	MOVWF	27H			;内循环寄存器
Y10MSN	DECFSZ	27H,F			;内循环寄存器递减
	GOTO	Y10MSN			;继续内循环
	DECFSZ	26H,F			;外循环寄存器递减
	GOTO	Y10MSW			;继续外循环
	RETURN				;子程序返回
;------------------------------------------------------------------------------------------
;延时100ms子程序
;------------------------------------------------------------------------------------------
YS100MS	MOVLW	.160
	MOVWF	23H
Y100MSW	MOVLW	.207
	MOVWF	24H
Y100MSN	DECFSZ	24H,1
	GOTO	Y100MSN
	DECFSZ	23H,1
	GOTO	Y100MSW
	RETURN
;------------------------------------------------------------------------------------------
;延时500ms子程序
;------------------------------------------------------------------------------------------
YS500MS	MOVLW	.41
	MOVWF	20H
Y500MSW	MOVLW	.167
	MOVWF	21H
Y500MSZ	MOVLW	.23
	MOVWF	22H
Y500MSN	DECFSZ	22H,1
	GOTO	Y500MSN
	DECFSZ	21H,1
	GOTO	Y500MSZ
	DECFSZ	20H,1
	GOTO	Y500MSW
	RETURN
;------------------------------------------------------------------------------------------
	END
;------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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