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

📄 ds1302.lis

📁 时钟芯片将给显示时间
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 01A4                   .dbline 159
 01A4           ;  Delayus(10);                          //调整片选脉冲
 01A4 0AE0              ldi R16,10
 01A6 10E0              ldi R17,0
 01A8 64DF              xcall _Delayus
 01AA                   .dbline 160
 01AA           ;  DS1302_writeB(addr);  //写入操作命令(地址)
 01AA 042F              mov R16,R20
 01AC 94DF              xcall _DS1302_writeB
 01AE                   .dbline 161
 01AE           ;  Delayus(10);
 01AE 0AE0              ldi R16,10
 01B0 10E0              ldi R17,0
 01B2 5FDF              xcall _Delayus
 01B4                   .dbline 162
 01B4           ;  data=DS1302_readB();  //读出数据
 01B4 A6DF              xcall _DS1302_readB
 01B6 402F              mov R20,R16
 01B8                   .dbline 163
 01B8           ;  Delayus(10);
 01B8 0AE0              ldi R16,10
 01BA 10E0              ldi R17,0
 01BC 5ADF              xcall _Delayus
 01BE                   .dbline 164
 01BE           ;  PORTC&=~BIT(RTC_CLK);         //拉低时钟端
 01BE AF98              cbi 0x15,7
 01C0                   .dbline 165
 01C0           ;  PORTC&=~BIT(RTC_CS);          //拉低片选端
 01C0 A998              cbi 0x15,1
 01C2                   .dbline 166
 01C2           ;  return data;                  //返回读出的数据
 01C2 042F              mov R16,R20
 01C4                   .dbline -2
 01C4           L41:
 01C4 0E940000          xcall pop_gset1
 01C8                   .dbline 0 ; func end
 01C8 0895              ret
 01CA                   .dbsym r data 20 c
 01CA                   .dbsym r addr 20 c
 01CA                   .dbend
 01CA                   .dbfunc e DS1302_setT _DS1302_setT fV
 01CA           ;           addr -> R20
 01CA           ;              i -> R22
 01CA           ;        ptTimeD -> R10,R11
                        .even
 01CA           _DS1302_setT::
 01CA 0E940000          xcall push_gset3
 01CE 5801              movw R10,R16
 01D0                   .dbline -1
 01D0                   .dbline 175
 01D0           ; }
 01D0           ; /*******************************************
 01D0           ; 函数名称: DS1302_setT
 01D0           ; 功    能: 设置DS1302的时间
 01D0           ; 参    数: ptTimeD--设置时间数组指针
 01D0           ; 返回值  : 无
 01D0           ; /********************************************/
 01D0           ; void DS1302_setT(uchar ptTimeD[])
 01D0           ; {
 01D0                   .dbline 177
 01D0           ;     uchar i;
 01D0           ;     uchar addr = 0x80;                                  //写入地址从秒寄存器开始
 01D0 40E8              ldi R20,128
 01D2                   .dbline 178
 01D2           ;     DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
 01D2 2227              clr R18
 01D4 0EE8              ldi R16,142
 01D6 BDDF              xcall _DS1302_writeD
 01D8                   .dbline 179
 01D8           ;       Delayms(5);
 01D8 05E0              ldi R16,5
 01DA 10E0              ldi R17,0
 01DC 62DF              xcall _Delayms
 01DE                   .dbline 180
 01DE           ;     for(i=0;i<2;i++)
 01DE 6627              clr R22
 01E0 0CC0              xjmp L46
 01E2           L43:
 01E2                   .dbline 181
 01E2                   .dbline 182
 01E2 E62F              mov R30,R22
 01E4 FF27              clr R31
 01E6 EA0D              add R30,R10
 01E8 FB1D              adc R31,R11
 01EA 2081              ldd R18,z+0
 01EC 042F              mov R16,R20
 01EE B1DF              xcall _DS1302_writeD
 01F0                   .dbline 183
 01F0 4E5F              subi R20,254    ; addi 2
 01F2                   .dbline 184
 01F2 01E0              ldi R16,1
 01F4 10E0              ldi R17,0
 01F6 55DF              xcall _Delayms
 01F8                   .dbline 185
 01F8           L44:
 01F8                   .dbline 180
 01F8 6395              inc R22
 01FA           L46:
 01FA                   .dbline 180
 01FA 6230              cpi R22,2
 01FC 90F3              brlo L43
 01FE                   .dbline 186
 01FE           ;     {
 01FE           ;         DS1302_writeD(addr|WR,ptTimeD[i]);   // 秒 分 时 日 月 星期 年         
 01FE           ;         addr+=2;
 01FE           ;               Delayms(1);
 01FE           ;     }
 01FE           ;     DS1302_writeD(C_WP|WR,PROTECT);           //控制命令,WP位为1,不允许写操作
 01FE 20E8              ldi R18,128
 0200 0EE8              ldi R16,142
 0202 A7DF              xcall _DS1302_writeD
 0204                   .dbline -2
 0204           L42:
 0204 0E940000          xcall pop_gset3
 0208                   .dbline 0 ; func end
 0208 0895              ret
 020A                   .dbsym r addr 20 c
 020A                   .dbsym r i 22 c
 020A                   .dbsym r ptTimeD 10 pc
 020A                   .dbend
 020A                   .dbfunc e DS1302_getT _DS1302_getT fV
 020A           ;              i -> R20
 020A           ;           time -> R22,R23
                        .even
 020A           _DS1302_getT::
 020A 0E940000          xcall push_gset2
 020E B801              movw R22,R16
 0210                   .dbline -1
 0210                   .dbline 195
 0210           ; }
 0210           ; /*******************************************
 0210           ; 函数名称: DS1302_getT
 0210           ; 功    能: 读取DS1302的当前时间
 0210           ; 参    数: time[]--读取的时间数组
 0210           ; 返回值  : 无
 0210           ; /********************************************/
 0210           ; void DS1302_getT(uchar time[])
 0210           ; {
 0210                   .dbline 197
 0210           ;     uchar i;
 0210           ;     PORTC&=~BIT(RTC_CS);       //拉低片选端
 0210 A998              cbi 0x15,1
 0212                   .dbline 198
 0212           ;      Delayus(10);
 0212 0AE0              ldi R16,10
 0214 10E0              ldi R17,0
 0216 2DDF              xcall _Delayus
 0218                   .dbline 199
 0218           ;      PORTC|=BIT(RTC_CS);       //拉高片选端
 0218 A99A              sbi 0x15,1
 021A                   .dbline 200
 021A           ;      Delayus(10);                      //调整片选脉冲
 021A 0AE0              ldi R16,10
 021C 10E0              ldi R17,0
 021E 29DF              xcall _Delayus
 0220                   .dbline 201
 0220           ;        DS1302_writeB(0xbf);       // 0xbf:时钟多字节读取命令 
 0220 0FEB              ldi R16,191
 0222 59DF              xcall _DS1302_writeB
 0224                   .dbline 202
 0224           ;      for (i=0;i<2;i++)       //时间数据的存放格式是:
 0224 4427              clr R20
 0226 07C0              xjmp L51
 0228           L48:
 0228                   .dbline 203
 0228                   .dbline 204
 0228 6CDF              xcall _DS1302_readB
 022A E42F              mov R30,R20
 022C FF27              clr R31
 022E E60F              add R30,R22
 0230 F71F              adc R31,R23
 0232 0083              std z+0,R16
 0234                   .dbline 205
 0234           L49:
 0234                   .dbline 202
 0234 4395              inc R20
 0236           L51:
 0236                   .dbline 202
 0236 4230              cpi R20,2
 0238 B8F3              brlo L48
 023A                   .dbline 207
 023A           ;        {                        //秒,分,时,日,月,星期,年,控制
 023A           ;          time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】 
 023A           ;        }
 023A           ;                               
 023A           ;      PORTC&=~BIT(RTC_CS);      //拉低片选端
 023A A998              cbi 0x15,1
 023C                   .dbline 208
 023C           ;      PORTC&=~BIT(RTC_CLK);                                      //拉低时钟端(时钟端在不操作时为低)
 023C AF98              cbi 0x15,7
 023E                   .dbline -2
 023E           L47:
 023E 0E940000          xcall pop_gset2
 0242                   .dbline 0 ; func end
 0242 0895              ret
 0244                   .dbsym r i 20 c
 0244                   .dbsym r time 22 pc
 0244                   .dbend
 0244                   .dbfunc e DS1302_check _DS1302_check fc
 0244           ;          exist -> R20
                        .even
 0244           _DS1302_check::
 0244 0E940000          xcall push_gset1
 0248                   .dbline -1
 0248                   .dbline 217
 0248           ; }
 0248           ; /*******************************************
 0248           ; 函数名称: DS1302_check
 0248           ; 功    能: 检测DS1302是否正常工作
 0248           ; 参    数: 无
 0248           ; 返回值  : exist--为TRUE为检测到DS1302,为FALSE为没检测到
 0248           ; /********************************************/
 0248           ; uchar DS1302_check(void)
 0248           ; {
 0248                   .dbline 219
 0248           ;       uchar exist;
 0248           ;     DS1302_writeD(C_WP|WR,UPROTECT);            //写入写允许命令
 0248 2227              clr R18
 024A 0EE8              ldi R16,142
 024C 82DF              xcall _DS1302_writeD
 024E                   .dbline 220
 024E           ;     DS1302_writeD(C_RAMBASE|WR,0xA5);           //RAM0写入0xA5
 024E 25EA              ldi R18,165
 0250 00EC              ldi R16,192
 0252 7FDF              xcall _DS1302_writeD
 0254                   .dbline 221
 0254           ;     exist=DS1302_readD(C_RAMBASE|RD);           //读取RAM0
 0254 01EC              ldi R16,193
 0256 9DDF              xcall _DS1302_readD
 0258 402F              mov R20,R16
 025A                   .dbline 222
 025A           ;     if(exist==0xA5)   
 025A 053A              cpi R16,165
 025C 11F4              brne L53
 025E                   .dbline 223
 025E           ;       {
 025E                   .dbline 224
 025E           ;        exist=TRUE;                                                      //如果读取值与写入值相等,返回TRUE
 025E 41E0              ldi R20,1
 0260                   .dbline 225
 0260           ;       }
 0260 01C0              xjmp L54
 0262           L53:
 0262                   .dbline 227
 0262           ;     else      
 0262           ;       {
 0262                   .dbline 228
 0262           ;        exist=FALSE;                                                     //如果读取值与写入值不相等,返回FALSE
 0262 4427              clr R20
 0264                   .dbline 229
 0264           ;       }       
 0264           L54:
 0264                   .dbline 230
 0264           ;       return exist;
 0264 042F              mov R16,R20
 0266                   .dbline -2
 0266           L52:
 0266 0E940000          xcall pop_gset1
 026A                   .dbline 0 ; func end
 026A 0895              ret
 026C                   .dbsym r exist 20 c
 026C                   .dbend
 026C                   .dbfunc e DS1302_init _DS1302_init fV
                        .even
 026C           _DS1302_init::
 026C                   .dbline -1
 026C                   .dbline 239
 026C           ; }
 026C           ; /*******************************************
 026C           ; 函数名称: DS1302_init
 026C           ; 功    能: 初始化DS1302
 026C           ; 参    数: 无
 026C           ; 返回值  : 无
 026C           ; /********************************************/
 026C           ; void DS1302_init(void)
 026C           ; {
 026C                   .dbline 240
 026C           ;  DS1302_writeD(C_WP|WR,UPROTECT);               //写入写允许命令
 026C 2227              clr R18
 026E 0EE8              ldi R16,142
 0270 70DF              xcall _DS1302_writeD
 0272                   .dbline 241
 0272           ;  DS1302_writeD(C_SEC|WR,CLK_START);           //启动振荡器,DS1302开始工作
 0272 2227              clr R18
 0274 00E8              ldi R16,128
 0276 6DDF              xcall _DS1302_writeD
 0278                   .dbline 242
 0278           ;  DS1302_writeD(C_WP|WR,PROTECT);              //控制命令,WP位为1,不允许写操作   
 0278 20E8              ldi R18,128
 027A 0EE8              ldi R16,142
 027C 6ADF              xcall _DS1302_writeD
 027E                   .dbline -2
 027E           L55:
 027E                   .dbline 0 ; func end
 027E 0895              ret
 0280                   .dbend
 0280                   .dbfunc e BCD_ASCII _BCD_ASCII fV

⌨️ 快捷键说明

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