📄 实验26.asm
字号:
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 + -