📄 ds1302.lst
字号:
MPASM 02.50 Released DS1302.ASM 6-2-2003 1:36:37 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001 LIST P=16F877
00002 INCLUDE <P16F877.INC>
00001 LIST
00002 ; P16F877.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
00373 LIST
00003
00000060 00004 SEC_RX EQU 60H ;收到的秒,分,时,星期,日,月,年数据依次传入60H~66H
00000061 00005 MIN_RX EQU 61H
00000062 00006 HOU_RX EQU 62H
00000063 00007 DATE_RX EQU 63H
00000064 00008 MON_RX EQU 64H
00000065 00009 DAY_RX EQU 65H
00000066 00010 YEAR_RX EQU 66H
00011
00000070 00012 SEC EQU 70H ;发送的秒,分,时,星期,日,月,年数据依次传入70H~76H
00000071 00013 MIN EQU 71H
00000072 00014 HOU EQU 72H
00000073 00015 DATE EQU 73H
00000074 00016 MON EQU 74H
00000075 00017 DAY EQU 75H
00000076 00018 YEAR EQU 76H
00019
00020
00000077 00021 WRENABLE EQU 77H ;写使能寄存器
00000078 00022 TIME_TX EQU 78H ;DS1302当前发送寄存器
00000079 00023 TIME_RX EQU 79H ;DS1302当前接收寄存器
00024
00000060 00025 TIME_RX_TOTAL EQU 60H ;保存接受的7个数据(一次过接受的起始地址)
00000070 00026 TIME_TX_TOTAL EQU 70H
00027
00000020 00028 COUNT1 EQU 20H
00000021 00029 COUNT2 EQU 21H
00030 ;******************************
00031 BANK1 MACRO
00032 BSF STATUS,RP0
00033 ENDM
00034 BANK0 MACRO
00035 BCF STATUS,RP0
00036 ENDM
00037
00038
0000 00039 ORG 00H
0000 0000 00040 NOP
0001 00041 MAIN
0001 200C 00042 CALL USE1302
0002 208D 00043 CALL DELAY245MS
0003 00044 LOOP
0003 0187 00045 CLRF PORTC
0004 0860 00046 MOVF SEC_RX,W
0005 0087 00047 MOVWF PORTC
0006 208D 00048 CALL DELAY245MS
0007 208D 00049 CALL DELAY245MS
0008 208D 00050 CALL DELAY245MS
MPASM 02.50 Released DS1302.ASM 6-2-2003 1:36:37 PAGE 2
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0009 208D 00051 CALL DELAY245MS
000A 2044 00052 CALL GET_TIME
000B 2803 00053 GOTO LOOP
00054
00055
00056
00057 ;使用ds1302 *
00058 ;*******************
000C 00059 USE1302
000C 2011 00060 CALL INI_PORT
000D 201A 00061 CALL INI_DS1302
000E 2034 00062 CALL SET_TIME
000F 2044 00063 CALL GET_TIME
0010 0008 00064 RETURN
00065
00066 ;************************************初始化与1302相连的3个端口**********************************
00067 ;***********************************************************************************************
0011 00068 INI_PORT
00069 BANK1
0011 1683 M BSF STATUS,RP0
0012 3000 00070 MOVLW 00H ;C端口设为输出
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0013 0087 00071 MOVWF TRISC
00072
0014 3007 00073 MOVLW 07H ;A端口与E端口-样,设为普通I/O口需要把07h赋予adcon1
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0015 009F 00074 MOVWF ADCON1
0016 3000 00075 MOVLW 00H ;A端口设为输出
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0017 0085 00076 MOVWF TRISA
00077 BANK0
0018 1283 M BCF STATUS,RP0
0019 0008 00078 RETURN
00079
00080 ;************************************对1302进行初始化子程序*************************************
00081 ;***********************************************************************************************
001A 00082 INI_DS1302
001A 1307 00083 BCF PORTC,6 ;SCLK(RC6)先置为低电平
001B 1005 00084 BCF PORTA,0 ;RST(RA0)先禁止
001C 308E 00085 MOVLW B'10001110' ;写使能寄存器(10001110)
001D 00F8 00086 MOVWF TIME_TX
001E 1405 00087 BSF PORTA,0 ;RST(RA0)置高位,才可以对1302进行操作
001F 2054 00088 CALL TIME_WRITE
0020 3000 00089 MOVLW 00H ;将00h送写寄存器(10001110),准确说令bit7这个wp位置置0,允许写使能
0021 00F8 00090 MOVWF TIME_TX
0022 2054 00091 CALL TIME_WRITE
0023 1005 00092 BCF PORTA,0 ;RST(RA0)置0,停止对1302操作
00093
00094 ;以下设置默认时间,默认为:04年1月1日星期一0时0分0秒
00095
0024 3006 00096 MOVLW B'00000110' ;其中置秒寄存器首位为0,才能让1302的晶振确保起振
0025 00F0 00097 MOVWF SEC
0026 3000 00098 MOVLW .0
MPASM 02.50 Released DS1302.ASM 6-2-2003 1:36:37 PAGE 3
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0027 00F1 00099 MOVWF MIN
0028 3000 00100 MOVLW .0
0029 00F2 00101 MOVWF HOU
002A 3001 00102 MOVLW .1
002B 00F3 00103 MOVWF DATE
002C 3001 00104 MOVLW .1
002D 00F4 00105 MOVWF MON
002E 3001 00106 MOVLW .1
002F 00F5 00107 MOVWF DAY
0030 3004 00108 MOVLW B'00000100'
0031 00F6 00109 MOVWF YEAR
00110
0032 2034 00111 CALL SET_TIME
0033 0008 00112 RETURN
00113 ;***********************************1302一次性设定时间子程序***********************************
00114 ;**********************************************************************************************
0034 00115 SET_TIME
0034 30BE 00116 MOVLW B'10111110' ;突发模式写入(10111110是突发模式写入命令)
0035 00F8 00117 MOVWF TIME_TX
0036 1405 00118 BSF PORTA,0 ;RST(RA0)置高位,才可以对1302进行操作
0037 2054 00119 CALL TIME_WRITE ;以下为发送8个数据
0038 3070 00120 MOVLW TIME_TX_TOTAL ;发送数据的起始地址到fsr
0039 0084 00121 MOVWF FSR
003A 3008 00122 MOVLW .8
003B 00A1 00123 MOVWF COUNT2
003C 00124 SETLP
003C 0800 00125 MOVF INDF,W ;将fsr指示的地址的内容进行发送
003D 00F8 00126 MOVWF TIME_TX
003E 2054 00127 CALL TIME_WRITE
003F 0A84 00128 INCF FSR,F ;fsr递增
0040 0BA1 00129 DECFSZ COUNT2,1 ;循环八次发送8个字节数据
0041 283C 00130 GOTO SETLP
0042 1005 00131 BCF PORTA,0 ;RST(RA0)置0,停止对1302操作
0043 0008 00132 RETURN
00133 ;***********************************1302一次性读取时间子程序***********************************
00134 ;**********************************************************************************************
0044 00135 GET_TIME
0044 30BF 00136 MOVLW B'10111111' ;突发模式读取(10111111是突发模式读取命令)
0045 00F8 00137 MOVWF TIME_TX
0046 1405 00138 BSF PORTA,0 ;RST(RA0)置高位,才可以对1302进行操作
0047 2054 00139 CALL TIME_WRITE ;以下为读取8个数据
0048 3060 00140 MOVLW TIME_RX_TOTAL ;发送数据的起始地址到fsr
0049 0084 00141 MOVWF FSR
004A 3007 00142 MOVLW .7
004B 00A1 00143 MOVWF COUNT2
004C 00144 GETLP
004C 2060 00145 CALL TIME_READ
004D 0879 00146 MOVF TIME_RX,W
004E 0080 00147 MOVWF INDF ;将收到的数据作为fsr指示的地址的内容
004F 0A84 00148 INCF FSR,F ;fsr递增
0050 0BA1 00149 DECFSZ COUNT2,1 ;循环七次收到7个字节数据
0051 284C 00150 GOTO GETLP
0052 1005 00151 BCF PORTA,0 ;RST(RA0)置0,停止对1302操作
MPASM 02.50 Released DS1302.ASM 6-2-2003 1:36:37 PAGE 4
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
0053 0008 00152 RETURN
00153 ;***************************************1302写一字节分程序*************************************
00154 ;**********************************************************************************************
0054 00155 TIME_WRITE ;往1302写一字节原则:sclk(RC6)给予上升沿开始进行写操作,i/o(RC7)发送数据
0054 3008 00156 MOVLW .8
0055 00A0 00157 MOVWF COUNT1
0056 00158 WRLP
0056 1387 00159 BCF PORTC,7 ;i/o(RC7)默认值是低电平
0057 1307 00160 BCF PORTC,6 ;先让sclk(RC6)为低电平
0058 1878 00161 BTFSC TIME_TX,0 ;测试当前发送的那位数是1还是0
0059 1787 00162 BSF PORTC,7 ;要发送1才置i/o(RC7)高电平,0就不用专门设置,使用默认值0即可
005A 0CF8 00163 RRF TIME_TX,F ;发送的数据右移
005B 1707 00164 BSF PORTC,6 ;让sclk(RC6)为高电平,给予上升沿发送数据
005C 0BA0 00165 DECFSZ COUNT1,F ;循环八次写一字节
005D 2856 00166 GOTO WRLP
005E 1307 00167 BCF PORTC,6 ;恢复sclk(RC6)为低电平
005F 0008 00168 RETURN
00169 ;*************************************1302读取一个字节分程序************************************
00170 ;***********************************************************************************************
0060 00171 TIME_READ ;往1302读一字节原则:sclk(RC6)给予下降沿开始进行读操作,i/o(RC7)收取数据
00172 BANK1
0060 1683 M BSF STATUS,RP0
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
0061 1787 00173 BSF TRISC,7 ;i/o(RC7)变为输入
00174 BANK0
0062 1283 M BCF STATUS,RP0
0063 3008 00175 MOVLW .8
0064 00A0 00176 MOVWF COUNT1
0065 00177 RELP
0065 1307 00178 BCF PORTC,6 ;让sclk(RC6)为低电平,产生下降沿开始读取
0066 1003 00179 BCF STATUS,C ;清进位,让收到的那位数据默认为0
0067 1B87 00180 BTFSC PORTC,7 ;判断收到的是否为1
0068 1403 00181 BSF STATUS,C ;是1就令进位为1,是0就用默认值0即可
0069 0CF9 00182 RRF TIME_RX,F ;进位通过在time_rx右移
006A 1707 00183 BSF PORTC,6 ;sclk(RC6)恢复高电平
006B 0BA0 00184 DECFSZ COUNT1,F ;循环八次读取一字节
006C 2865 00185 GOTO RELP
00186 BANK1
006D 1683 M BSF STATUS,RP0
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
006E 1387 00187 BCF TRISC,7 ;i/o(RC7)重新设为输出
00188 BANK0
006F 1283 M BCF STATUS,RP0
0070 1307 00189 BCF PORTC,6 ;sclk(RC6)回复低电平
0071 0008 00190 RETURN
00191
00192 ;************************************************************************************************
00193
00194
00195 ;*****************1302(其实其他器件的数据要显示都需要)数据显示前准备子程序*********************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -