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

📄 ds1302.lis

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 01FC 042F              mov R16,R20
 01FE B5DF              xcall _DS1302_writeB
 0200                   .dbline 139
 0200 C798              cbi 0x18,7
 0202                   .dbline 140
 0202 0AE0              ldi R16,10
 0204 10E0              ldi R17,0
 0206 7FDF              xcall _Delayus
 0208                   .dbline 141
 0208 AF98              cbi 0x15,7
 020A                   .dbline -2
 020A                   .dbline 142
 020A           L60:
 020A 0E940000          xcall pop_gset2
 020E                   .dbline 0 ; func end
 020E 0895              ret
 0210                   .dbsym r data 20 c
 0210                   .dbsym r addr 22 c
 0210                   .dbend
 0210                   .dbfunc e DS1302_readD _DS1302_readD fc
 0210           ;           data -> R20
 0210           ;           addr -> R20
                        .even
 0210           _DS1302_readD::
 0210 0E940000          xcall push_gset1
 0214 402F              mov R20,R16
 0216                   .dbline -1
 0216                   .dbline 150
 0216                   .dbline 152
 0216 AF98              cbi 0x15,7
 0218                   .dbline 153
 0218 C798              cbi 0x18,7
 021A                   .dbline 154
 021A 0AE0              ldi R16,10
 021C 10E0              ldi R17,0
 021E 73DF              xcall _Delayus
 0220                   .dbline 155
 0220 AF9A              sbi 0x15,7
 0222                   .dbline 156
 0222 0AE0              ldi R16,10
 0224 10E0              ldi R17,0
 0226 6FDF              xcall _Delayus
 0228                   .dbline 157
 0228 042F              mov R16,R20
 022A 9FDF              xcall _DS1302_writeB
 022C                   .dbline 158
 022C 0AE0              ldi R16,10
 022E 10E0              ldi R17,0
 0230 6ADF              xcall _Delayus
 0232                   .dbline 159
 0232 B1DF              xcall _DS1302_readB
 0234 402F              mov R20,R16
 0236                   .dbline 160
 0236 0AE0              ldi R16,10
 0238 10E0              ldi R17,0
 023A 65DF              xcall _Delayus
 023C                   .dbline 161
 023C C798              cbi 0x18,7
 023E                   .dbline 162
 023E AF98              cbi 0x15,7
 0240                   .dbline 163
 0240 042F              mov R16,R20
 0242                   .dbline -2
 0242           L61:
 0242 0E940000          xcall pop_gset1
 0246                   .dbline 0 ; func end
 0246 0895              ret
 0248                   .dbsym r data 20 c
 0248                   .dbsym r addr 20 c
 0248                   .dbend
 0248                   .dbfunc e DS1302_setT _DS1302_setT fV
 0248           ;           addr -> R20
 0248           ;              i -> R22
 0248           ;        ptTimeD -> R10,R11
                        .even
 0248           _DS1302_setT::
 0248 0E940000          xcall push_gset3
 024C 5801              movw R10,R16
 024E                   .dbline -1
 024E                   .dbline 172
 024E                   .dbline 174
 024E           ;     uchar i;
 024E           ;     uchar addr = 0x80;                                  //写入地址从秒寄存器开始
 024E 40E8              ldi R20,128
 0250                   .dbline 175
 0250           ;     DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
 0250 2227              clr R18
 0252 0EE8              ldi R16,142
 0254 BDDF              xcall _DS1302_writeD
 0256                   .dbline 176
 0256           ;       Delayms(5);
 0256 05E0              ldi R16,5
 0258 10E0              ldi R17,0
 025A 6DDF              xcall _Delayms
 025C                   .dbline 177
 025C           ;     for(i=0;i<7;i++)
 025C 6627              clr R22
 025E 0CC0              xjmp L66
 0260           L63:
 0260                   .dbline 178
 0260                   .dbline 179
 0260 E62F              mov R30,R22
 0262 FF27              clr R31
 0264 EA0D              add R30,R10
 0266 FB1D              adc R31,R11
 0268 2081              ldd R18,z+0
 026A 042F              mov R16,R20
 026C B1DF              xcall _DS1302_writeD
 026E                   .dbline 180
 026E 4E5F              subi R20,254    ; addi 2
 0270                   .dbline 181
 0270 01E0              ldi R16,1
 0272 10E0              ldi R17,0
 0274 60DF              xcall _Delayms
 0276                   .dbline 182
 0276           L64:
 0276                   .dbline 177
 0276 6395              inc R22
 0278           L66:
 0278                   .dbline 177
 0278 6730              cpi R22,7
 027A 90F3              brlo L63
 027C                   .dbline 183
 027C           ;     {
 027C           ;         DS1302_writeD(addr|WR,ptTimeD[i]);   // 秒 分 时 日 月 星期 年         
 027C           ;         addr+=2;
 027C           ;               Delayms(1);
 027C           ;     }
 027C           ;     DS1302_writeD(C_WP|WR,PROTECT);           //控制命令,WP位为1,不允许写操作
 027C 20E8              ldi R18,128
 027E 0EE8              ldi R16,142
 0280 A7DF              xcall _DS1302_writeD
 0282                   .dbline -2
 0282                   .dbline 184
 0282           ; }
 0282           L62:
 0282 0E940000          xcall pop_gset3
 0286                   .dbline 0 ; func end
 0286 0895              ret
 0288                   .dbsym r addr 20 c
 0288                   .dbsym r i 22 c
 0288                   .dbsym r ptTimeD 10 pc
 0288                   .dbend
 0288                   .dbfunc e DS1302_getT _DS1302_getT fV
 0288           ;              i -> R20
 0288           ;           time -> R22,R23
                        .even
 0288           _DS1302_getT::
 0288 0E940000          xcall push_gset2
 028C B801              movw R22,R16
 028E                   .dbline -1
 028E                   .dbline 192
 028E           ; /*******************************************
 028E           ; 函数名称: DS1302_getT
 028E           ; 功    能: 读取DS1302的当前时间
 028E           ; 参    数: time[]--读取的时间数组
 028E           ; 返回值  : 无
 028E           ; /********************************************/
 028E           ; void DS1302_getT(uchar time[])
 028E           ; {
 028E                   .dbline 203
 028E           ;     uchar i;
 028E           ; ////////下面的是单次读写//////////////////////////    
 028E           ;    /* uchar addr = 0x80;                                                //读取地址从秒寄存器开始 
 028E           ;     for(i=0;i<7;i++)
 028E           ;     {
 028E           ;         time[i]=DS1302_readD(addr|RD);    // 秒 分 时 日 月 星期 年        
 028E           ;         addr+=2;
 028E           ;     }*/
 028E           ; ////////////////////////////////////////////////////  
 028E           ;       /////////下面是多字节读取/////////////// 
 028E           ;        PORTC&=~BIT(RTC_CS);    //拉低片选端
 028E AF98              cbi 0x15,7
 0290                   .dbline 204
 0290           ;      Delayus(10);
 0290 0AE0              ldi R16,10
 0292 10E0              ldi R17,0
 0294 38DF              xcall _Delayus
 0296                   .dbline 205
 0296           ;      PORTC|=BIT(RTC_CS);       //拉高片选端
 0296 AF9A              sbi 0x15,7
 0298                   .dbline 206
 0298           ;      Delayus(10);                      //调整片选脉冲
 0298 0AE0              ldi R16,10
 029A 10E0              ldi R17,0
 029C 34DF              xcall _Delayus
 029E                   .dbline 207
 029E           ;        DS1302_writeB(0xbf);       // 0xbf:时钟多字节读取命令 
 029E 0FEB              ldi R16,191
 02A0 64DF              xcall _DS1302_writeB
 02A2                   .dbline 208
 02A2           ;      for (i=0;i<8;i++)       //时间数据的存放格式是:
 02A2 4427              clr R20
 02A4 07C0              xjmp L71
 02A6           L68:
 02A6                   .dbline 209
 02A6                   .dbline 210
 02A6 77DF              xcall _DS1302_readB
 02A8 E42F              mov R30,R20
 02AA FF27              clr R31
 02AC E60F              add R30,R22
 02AE F71F              adc R31,R23
 02B0 0083              std z+0,R16
 02B2                   .dbline 211
 02B2           L69:
 02B2                   .dbline 208
 02B2 4395              inc R20
 02B4           L71:
 02B4                   .dbline 208
 02B4 4830              cpi R20,8
 02B6 B8F3              brlo L68
 02B8                   .dbline 213
 02B8           ;        {                        //秒,分,时,日,月,星期,年,控制
 02B8           ;          time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】 
 02B8           ;        }
 02B8           ;                               
 02B8           ;      PORTC&=~BIT(RTC_CS);      //拉低片选端
 02B8 AF98              cbi 0x15,7
 02BA                   .dbline 215
 02BA           ;  ///////////////////////////////////////////////
 02BA           ;      PORTB&=~BIT(RTC_CLK);                                      //拉低时钟端(时钟端在不操作时为低)
 02BA C798              cbi 0x18,7
 02BC                   .dbline -2
 02BC                   .dbline 216
 02BC           ; }
 02BC           L67:
 02BC 0E940000          xcall pop_gset2
 02C0                   .dbline 0 ; func end
 02C0 0895              ret
 02C2                   .dbsym r i 20 c
 02C2                   .dbsym r time 22 pc
 02C2                   .dbend
 02C2                   .dbfunc e DS1302_check _DS1302_check fc
 02C2           ;          exist -> R20
                        .even
 02C2           _DS1302_check::
 02C2 0E940000          xcall push_gset1
 02C6                   .dbline -1
 02C6                   .dbline 224
 02C6           ; /*******************************************
 02C6           ; 函数名称: DS1302_check
 02C6           ; 功    能: 检测DS1302是否正常工作
 02C6           ; 参    数: 无
 02C6           ; 返回值  : exist--为TRUE为检测到DS1302,为FALSE为没检测到
 02C6           ; /********************************************/
 02C6           ; uchar DS1302_check(void)
 02C6           ; {
 02C6                   .dbline 226
 02C6           ;       uchar exist;
 02C6           ;     DS1302_writeD(C_WP|WR,UPROTECT);            //写入写允许命令
 02C6 2227              clr R18
 02C8 0EE8              ldi R16,142
 02CA 82DF              xcall _DS1302_writeD
 02CC                   .dbline 227
 02CC           ;     DS1302_writeD(C_RAMBASE|WR,0xA5);           //RAM0写入0xA5
 02CC 25EA              ldi R18,165
 02CE 00EC              ldi R16,192
 02D0 7FDF              xcall _DS1302_writeD
 02D2                   .dbline 228
 02D2           ;     exist=DS1302_readD(C_RAMBASE|RD);           //读取RAM0
 02D2 01EC              ldi R16,193
 02D4 9DDF              xcall _DS1302_readD
 02D6 402F              mov R20,R16
 02D8                   .dbline 229
 02D8           ;     if(exist==0xA5)   
 02D8 053A              cpi R16,165
 02DA 11F4              brne L73
 02DC                   .dbline 230
 02DC           ;       {
 02DC                   .dbline 231
 02DC           ;        exist=TRUE;                                                      //如果读取值与写入值相等,返回TRUE
 02DC 41E0              ldi R20,1
 02DE                   .dbline 232
 02DE           ;       }
 02DE 01C0              xjmp L74
 02E0           L73:
 02E0                   .dbline 234
 02E0           ;     else      
 02E0           ;       {
 02E0                   .dbline 235
 02E0           ;        exist=FALSE;                                                     //如果读取值与写入值不相等,返回FALSE
 02E0 4427              clr R20
 02E2                   .dbline 236
 02E2           ;       }       
 02E2           L74:
 02E2                   .dbline 237
 02E2           ;       return exist;
 02E2 042F              mov R16,R20
 02E4                   .dbline -2
 02E4           L72:
 02E4 0E940000          xcall pop_gset1
 02E8                   .dbline 0 ; func end
 02E8 0895              ret
 02EA                   .dbsym r exist 20 c
 02EA                   .dbend
 02EA                   .dbfunc e DS1302_init _DS1302_init fV
                        .even
 02EA           _DS1302_init::
 02EA                   .dbline -1
 02EA                   .dbline 246
 02EA           ; }
 02EA           ; /*******************************************
 02EA           ; 函数名称: DS1302_init
 02EA           ; 功    能: 初始化DS1302
 02EA           ; 参    数: 无
 02EA           ; 返回值  : 无
 02EA           ; /********************************************/
 02EA           ; void DS1302_init(void)
 02EA           ; {
 02EA                   .dbline 247
 02EA           ;  DS1302_writeD(C_WP|WR,UPROTECT);               //写入写允许命令
 02EA 2227              clr R18
 02EC 0EE8              ldi R16,142
 02EE 70DF              xcall _DS1302_writeD
 02F0                   .dbline 248
 02F0           ;  DS1302_writeD(C_SEC|WR,CLK_START);           //启动振荡器,DS1302开始工作
 02F0 2227              clr R18
 02F2 00E8              ldi R16,128
 02F4 6DDF              xcall _DS1302_writeD
 02F6                   .dbline 249
 02F6           ;  DS1302_writeD(C_WP|WR,PROTECT);              //控制命令,WP位为1,不允许写操作   
 02F6 20E8              ldi R18,128
 02F8 0EE8              ldi R16,142
 02FA                   .dbline -2
 02FA                   .dbline 250
 02FA           ; }
 02FA           L75:
 02FA                   .dbline 0 ; func end
 02FA 6ACF              xjmp _DS1302_writeD
 02FC                   .dbend
 02FC                   .dbfunc e BCD_ASCII _BCD_ASCII fV
 02FC           ;          ptasc -> R20,R21
 02FC           ;            BCD -> R22
                        .even
 02FC           _BCD_ASCII::
 02FC 0E940000          xcall push_gset2
 0300 A901              movw R20,R18
 0302 602F              mov R22,R16
 0304                   .dbline -1
 0304                   .dbline 259
 0304           ; /*******************************************
 0304           ; 函数名称: BCD_ASCII
 0304           ; 功    能: 将压缩BCD码转换成ascii码
 0304           ; 参    数: BCD--将要转换的压缩BCD码
 0304           ;                 ptasc--转换后的ASCII码数组指针
 0304           ; 返回值  : 无
 0304           ; /********************************************/
 0304           ; void BCD_ASCII(uchar BCD,uchar ptasc[])
 0304           ; {     
 0304                   .dbline 260
 0304           ;       ptasc[0]=BCD/16|0x30;   //0X58  35  38 //转换十位
 0304 10E1              ldi R17,16
 0306 062F              mov R16,R22
 0308 0E940000          xcall div8u
 030C 802F              mov R24,R16
 030E 8063              ori R24,48
 0310 FA01              movw R30,R20
 0312 8083              std z+0,R24
 0314                   .dbline 261
 0314           ;       ptasc[1]=BCD&0x0F|0x30;  //转换个位
 0314 862F              mov R24,R22
 0316 8F70              andi R24,15
 0318 8063              ori R24,48

⌨️ 快捷键说明

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