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

📄 ds1302.lis

📁 时钟芯片将给显示时间
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 00D6 0E940000          xcall push_gset2
 00DA 602F              mov R22,R16
 00DC                   .dbline -1
 00DC                   .dbline 72
 00DC           ; }
 00DC           ; /*******************************************
 00DC           ; 函数名称: DS1302_writeB
 00DC           ; 功    能: 向DS1302写入一个字节数据(没有RST操作)
 00DC           ; 参    数: byte--要写入的数据
 00DC           ; 返回值  : 无
 00DC           ; /********************************************/
 00DC           ; void DS1302_writeB(uchar byte)
 00DC           ; {
 00DC                   .dbline 74
 00DC           ;  uchar i;
 00DC           ;  for(i=0;i<8;i++)                       //8位数据计数
 00DC 4427              clr R20
 00DE 0CC0              xjmp L30
 00E0           L27:
 00E0                   .dbline 75
 00E0           ;  {
 00E0                   .dbline 76
 00E0           ;   PORTC&=~BIT(RTC_CLK);                 //拉低时钟端
 00E0 AF98              cbi 0x15,7
 00E2                   .dbline 77
 00E2           ;   if(byte&0x01)                                 //当前位是否是1
 00E2 60FF              sbrs R22,0
 00E4 02C0              rjmp L31
 00E6                   .dbline 78
 00E6           ;   {
 00E6                   .dbline 79
 00E6           ;    PORTC|=BIT(RTC_DATA);        //当前位是1,拉高数据端
 00E6 AE9A              sbi 0x15,6
 00E8                   .dbline 80
 00E8           ;   }
 00E8 01C0              xjmp L32
 00EA           L31:
 00EA                   .dbline 82
 00EA           ;   else                                                  
 00EA           ;   {
 00EA                   .dbline 83
 00EA           ;    PORTC&=~BIT(RTC_DATA);       //当前位是0,拉低数据端
 00EA AE98              cbi 0x15,6
 00EC                   .dbline 84
 00EC           ;   }  
 00EC           L32:
 00EC                   .dbline 85
 00EC 0AE0              ldi R16,10
 00EE 10E0              ldi R17,0
 00F0 C0DF              xcall _Delayus
 00F2                   .dbline 86
 00F2 AF9A              sbi 0x15,7
 00F4                   .dbline 87
 00F4 6695              lsr R22
 00F6                   .dbline 88
 00F6           L28:
 00F6                   .dbline 74
 00F6 4395              inc R20
 00F8           L30:
 00F8                   .dbline 74
 00F8 4830              cpi R20,8
 00FA 90F3              brlo L27
 00FC                   .dbline -2
 00FC           L26:
 00FC 0E940000          xcall pop_gset2
 0100                   .dbline 0 ; func end
 0100 0895              ret
 0102                   .dbsym r i 20 c
 0102                   .dbsym r byte 22 c
 0102                   .dbend
 0102                   .dbfunc e DS1302_readB _DS1302_readB fc
 0102           ;              i -> R20
 0102           ;           byte -> R22
                        .even
 0102           _DS1302_readB::
 0102 0E940000          xcall push_gset2
 0106                   .dbline -1
 0106                   .dbline 97
 0106           ;   Delayus(10);                                  //调整时钟和脉冲宽度
 0106           ;   PORTC|=BIT(RTC_CLK);                  //时钟上升沿(DS1302采样数据)
 0106           ;   byte>>=1;                                     //数据右移1位,为送出新数据位做准备
 0106           ;  }
 0106           ; }
 0106           ; /*******************************************
 0106           ; 函数名称: DS1302_readB
 0106           ; 功    能: 从DS1302读出一个字节数据(没有RST操作)
 0106           ; 参    数: 无
 0106           ; 返回值  : byte--读出的数据
 0106           ; /********************************************/
 0106           ; uchar DS1302_readB(void)
 0106           ; {
 0106                   .dbline 98
 0106           ;  uchar i,byte=0;
 0106 6627              clr R22
 0108                   .dbline 99
 0108           ;  DDRC&=~BIT(RTC_DATA);                 //将数据端口设置为输入           
 0108 A698              cbi 0x14,6
 010A                   .dbline 100
 010A           ;  PORTC&=~BIT(RTC_DATA);                //无上拉电阻
 010A AE98              cbi 0x15,6
 010C                   .dbline 101
 010C           ;  for(i=0;i<8;i++)                      //8位数据计数
 010C 4427              clr R20
 010E 0FC0              xjmp L37
 0110           L34:
 0110                   .dbline 102
 0110           ;  {
 0110                   .dbline 103
 0110           ;   byte>>=1;                            //保存读入的数据位
 0110 6695              lsr R22
 0112                   .dbline 104
 0112           ;   PORTC|=BIT(RTC_CLK);                 //时钟上升沿
 0112 AF9A              sbi 0x15,7
 0114                   .dbline 105
 0114           ;   Delayus(10);                                 //延时,调整时钟脉冲宽度
 0114 0AE0              ldi R16,10
 0116 10E0              ldi R17,0
 0118 ACDF              xcall _Delayus
 011A                   .dbline 106
 011A           ;   PORTC&=~BIT(RTC_CLK);                //时钟下降沿,DS1302输出数据位
 011A AF98              cbi 0x15,7
 011C                   .dbline 107
 011C           ;   Delayus(10);                                 //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
 011C 0AE0              ldi R16,10
 011E 10E0              ldi R17,0
 0120 A8DF              xcall _Delayus
 0122                   .dbline 108
 0122           ;   if(PINC&BIT(RTC_DATA))       //当前位是否是高电平
 0122 9E9B              sbis 0x13,6
 0124 02C0              rjmp L38
 0126                   .dbline 109
 0126           ;   {
 0126                   .dbline 110
 0126           ;    byte|=BIT(PC7);                     //是高电平就将返回数据的当前位置1
 0126 6068              ori R22,128
 0128                   .dbline 111
 0128           ;   }
 0128 01C0              xjmp L39
 012A           L38:
 012A                   .dbline 113
 012A           ;   else
 012A           ;   {
 012A                   .dbline 114
 012A           ;    byte&=~BIT(PC7);                    //是低电平就将返回数据的当前位置0
 012A 6F77              andi R22,127
 012C                   .dbline 115
 012C           ;   }
 012C           L39:
 012C                   .dbline 116
 012C           L35:
 012C                   .dbline 101
 012C 4395              inc R20
 012E           L37:
 012E                   .dbline 101
 012E 4830              cpi R20,8
 0130 78F3              brlo L34
 0132                   .dbline 117
 0132           ;  }
 0132           ;  DDRC|=BIT(RTC_DATA);          //最后将数据端口设置为输出
 0132 A69A              sbi 0x14,6
 0134                   .dbline 119
 0134           ;  
 0134           ;  byte=byte/16*10+byte%16;  //BCD码转为二进制
 0134 10E1              ldi R17,16
 0136 062F              mov R16,R22
 0138 0E940000          xcall mod8u
 013C 862F              mov R24,R22
 013E 8295              swap R24
 0140 8F70              andi R24,#0x0F
 0142 9AE0              ldi R25,10
 0144 989F              mul R25,R24
 0146 602D              mov R22,R0
 0148 600F              add R22,R16
 014A                   .dbline 121
 014A           ;  
 014A           ;  return byte;                          //返回读出的数据
 014A 062F              mov R16,R22
 014C                   .dbline -2
 014C           L33:
 014C 0E940000          xcall pop_gset2
 0150                   .dbline 0 ; func end
 0150 0895              ret
 0152                   .dbsym r i 20 c
 0152                   .dbsym r byte 22 c
 0152                   .dbend
 0152                   .dbfunc e DS1302_writeD _DS1302_writeD fV
 0152           ;           data -> R20
 0152           ;           addr -> R22
                        .even
 0152           _DS1302_writeD::
 0152 0E940000          xcall push_gset2
 0156 422F              mov R20,R18
 0158 602F              mov R22,R16
 015A                   .dbline -1
 015A                   .dbline 131
 015A           ; }
 015A           ; /*******************************************
 015A           ; 函数名称: DS1302_writeD
 015A           ; 功    能: 向DS1302的某个地址写入一个字节数据
 015A           ; 参    数: addr--地址值(寄存器或RAM)
 015A           ;                 data--要写入的地址
 015A           ; 返回值  : 无
 015A           ; /********************************************/
 015A           ; void DS1302_writeD(uchar addr,uchar data)
 015A           ; {
 015A                   .dbline 132
 015A           ;  PORTC&=~BIT(RTC_CS);  //拉低片选端
 015A A998              cbi 0x15,1
 015C                   .dbline 133
 015C           ;  PORTC&=~BIT(RTC_CLK);         //拉低时钟端
 015C AF98              cbi 0x15,7
 015E                   .dbline 134
 015E           ;  Delayus(10);
 015E 0AE0              ldi R16,10
 0160 10E0              ldi R17,0
 0162 87DF              xcall _Delayus
 0164                   .dbline 135
 0164           ;  PORTC|=BIT(RTC_CS);   //拉高片选端
 0164 A99A              sbi 0x15,1
 0166                   .dbline 136
 0166           ;  Delayus(10);                          //调整片选脉冲
 0166 0AE0              ldi R16,10
 0168 10E0              ldi R17,0
 016A 83DF              xcall _Delayus
 016C                   .dbline 137
 016C           ;  DS1302_writeB(addr);  //写入操作命令(地址)
 016C 062F              mov R16,R22
 016E B3DF              xcall _DS1302_writeB
 0170                   .dbline 138
 0170           ;  Delayus(10);
 0170 0AE0              ldi R16,10
 0172 10E0              ldi R17,0
 0174 7EDF              xcall _Delayus
 0176                   .dbline 139
 0176           ;  PORTC&=~BIT(RTC_CLK);         //拉低时钟端
 0176 AF98              cbi 0x15,7
 0178                   .dbline 140
 0178           ;  Delayus(10);
 0178 0AE0              ldi R16,10
 017A 10E0              ldi R17,0
 017C 7ADF              xcall _Delayus
 017E                   .dbline 141
 017E           ;  DS1302_writeB(data);  //写入数据
 017E 042F              mov R16,R20
 0180 AADF              xcall _DS1302_writeB
 0182                   .dbline 142
 0182           ;  PORTC&=~BIT(RTC_CLK);         //拉低时钟端
 0182 AF98              cbi 0x15,7
 0184                   .dbline 143
 0184           ;  Delayus(10);                  //调整片选脉冲
 0184 0AE0              ldi R16,10
 0186 10E0              ldi R17,0
 0188 74DF              xcall _Delayus
 018A                   .dbline 144
 018A           ;  PORTC&=~BIT(RTC_CS);  //拉低片选端
 018A A998              cbi 0x15,1
 018C                   .dbline -2
 018C           L40:
 018C 0E940000          xcall pop_gset2
 0190                   .dbline 0 ; func end
 0190 0895              ret
 0192                   .dbsym r data 20 c
 0192                   .dbsym r addr 22 c
 0192                   .dbend
 0192                   .dbfunc e DS1302_readD _DS1302_readD fc
 0192           ;           data -> R20
 0192           ;           addr -> R20
                        .even
 0192           _DS1302_readD::
 0192 0E940000          xcall push_gset1
 0196 402F              mov R20,R16
 0198                   .dbline -1
 0198                   .dbline 153
 0198           ; }
 0198           ; /*******************************************
 0198           ; 函数名称: DS1302_readD
 0198           ; 功    能: 从DS1302的某个地址读出一个字节数据
 0198           ; 参    数: addr--地址值(寄存器或RAM)
 0198           ; 返回值  : data--读出的数据
 0198           ; /********************************************/
 0198           ; uchar DS1302_readD(uchar addr)
 0198           ; {
 0198                   .dbline 155
 0198           ;  uchar data;
 0198           ;  PORTC&=~BIT(RTC_CS);  //拉低片选端
 0198 A998              cbi 0x15,1
 019A                   .dbline 156
 019A           ;  PORTC&=~BIT(RTC_CLK);         //拉低时钟端
 019A AF98              cbi 0x15,7
 019C                   .dbline 157
 019C           ;  Delayus(10);
 019C 0AE0              ldi R16,10
 019E 10E0              ldi R17,0
 01A0 68DF              xcall _Delayus
 01A2                   .dbline 158
 01A2           ;  PORTC|=BIT(RTC_CS);   //拉高片选端
 01A2 A99A              sbi 0x15,1

⌨️ 快捷键说明

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