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