📄 ds1302.lis
字号:
0100 0E940000 xcall pop_gset2
0104 .dbline 0 ; func end
0104 0895 ret
0106 .dbsym r data 20 i
0106 .dbsym r command 22 i
0106 .dbend
0106 .dbfunc e LCD_set_xy _LCD_set_xy fV
0106 ; address -> R20
.even
0106 _LCD_set_xy::
0106 0E940000 xcall push_gset1
010A 402F mov R20,R16
010C .dbline -1
010C .dbline 67
010C ; 函数名称: DS1302_init
010C ; 功 能: 初始化DS1302的数据接口
010C ; 参 数: 无
010C ; 返回值 : 无
010C ; /********************************************/
010C ; void DS1302_portinit(void)
010C ; {
010C ; DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
010C ; }
010C ; /*******************************************
010C ; 函数名称: DS1302_writeB
010C ; 功 能: 向DS1302写入一个字节数据(没有RST操作)
010C ; 参 数: byte--要写入的数据
010C ; 返回值 : 无
010C ; /********************************************/
010C ; void DS1302_writeB(uchar byte)
010C .dbline 68
010C ; {
010C 242F mov R18,R20
010E 3327 clr R19
0110 0027 clr R16
0112 1127 clr R17
0114 D0DF xcall _LCD_write_char
0116 .dbline -2
0116 L26:
0116 0E940000 xcall pop_gset1
011A .dbline 0 ; func end
011A 0895 ret
011C .dbsym r address 20 c
011C .dbend
011C .dbfunc e LCD_write_string _LCD_write_string fV
011C ; s -> R20,R21
011C ; address -> R22
.even
011C _LCD_write_string::
011C 0E940000 xcall push_gset2
0120 A901 movw R20,R18
0122 602F mov R22,R16
0124 .dbline -1
0124 .dbline 91
0124 ; uchar i;
0124 ; for(i=0;i<8;i++) //8位数据计数
0124 ; {
0124 ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
0124 ; if(byte&0x01) //当前位是否是1
0124 ; {
0124 ; PORTB|=BIT(RTC_DATA); //当前位是1,拉高数据端
0124 ; }
0124 ; else
0124 ; {
0124 ; PORTB&=~BIT(RTC_DATA); //当前位是0,拉低数据端
0124 ; }
0124 ; Delayus(10); //调整时钟和脉冲宽度
0124 ; PORTB|=BIT(RTC_CLK); //时钟上升沿(DS1302采样数据)
0124 ; byte>>=1; //数据右移1位,为送出新数据位做准备
0124 ; }
0124 ; }
0124 ; /*******************************************
0124 ; 函数名称: DS1302_readB
0124 ; 功 能: 从DS1302读出一个字节数据(没有RST操作)
0124 ; 参 数: 无
0124 ; 返回值 : byte--读出的数据
0124 ; /********************************************/
0124 .dbline 92
0124 ; uchar DS1302_readB(void)
0124 062F mov R16,R22
0126 EFDF xcall _LCD_set_xy
0128 08C0 xjmp L29
012A L28:
012A .dbline 94
012A .dbline 95
012A FA01 movw R30,R20
012C 2081 ldd R18,z+0
012E 3327 clr R19
0130 01E0 ldi R16,1
0132 10E0 ldi R17,0
0134 C0DF xcall _LCD_write_char
0136 .dbline 96
0136 4F5F subi R20,255 ; offset = 1
0138 5F4F sbci R21,255
013A .dbline 97
013A L29:
013A .dbline 93
013A ; {
013A FA01 movw R30,R20
013C 2080 ldd R2,z+0
013E 2220 tst R2
0140 A1F7 brne L28
0142 .dbline -2
0142 L27:
0142 0E940000 xcall pop_gset2
0146 .dbline 0 ; func end
0146 0895 ret
0148 .dbsym r s 20 pc
0148 .dbsym r address 22 c
0148 .dbend
0148 .dbfunc e LCD_write_onechar _LCD_write_onechar fV
0148 ; data -> R20
0148 ; address -> R22
.even
0148 _LCD_write_onechar::
0148 0E940000 xcall push_gset2
014C 422F mov R20,R18
014E 602F mov R22,R16
0150 .dbline -1
0150 .dbline 113
0150 ; uchar i,byte=0;
0150 ; DDRB&=~BIT(RTC_DATA); //将数据端口设置为输入
0150 ; PORTB&=~BIT(RTC_DATA); //无上拉电阻
0150 ; for(i=0;i<8;i++) //8位数据计数
0150 ; {
0150 ; byte>>=1; //保存读入的数据位
0150 ; PORTB|=BIT(RTC_CLK); //时钟上升沿
0150 ; Delayus(10); //延时,调整时钟脉冲宽度
0150 ; PORTB&=~BIT(RTC_CLK); //时钟下降沿,DS1302输出数据位
0150 ; Delayus(10); //等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
0150 ; if(PINB&BIT(RTC_DATA)) //当前位是否是高电平
0150 ; {
0150 ; byte|=BIT(PB7); //是高电平就将返回数据的当前位置1
0150 ; }
0150 ; else
0150 ; {
0150 ; byte&=~BIT(PB7); //是低电平就将返回数据的当前位置0
0150 ; }
0150 ; }
0150 ; DDRB|=BIT(RTC_DATA); //最后将数据端口设置为输出
0150 .dbline 114
0150 ; return byte; //返回读出的数据
0150 062F mov R16,R22
0152 D9DF xcall _LCD_set_xy
0154 .dbline 115
0154 ; }
0154 242F mov R18,R20
0156 3327 clr R19
0158 01E0 ldi R16,1
015A 10E0 ldi R17,0
015C ACDF xcall _LCD_write_char
015E .dbline -2
015E L31:
015E 0E940000 xcall pop_gset2
0162 .dbline 0 ; func end
0162 0895 ret
0164 .dbsym r data 20 c
0164 .dbsym r address 22 c
0164 .dbend
0164 .dbfunc e LCD_init _LCD_init fV
.even
0164 _LCD_init::
0164 .dbline -1
0164 .dbline 120
0164 ; /*******************************************
0164 ; 函数名称: DS1302_writeD
0164 ; 功 能: 向DS1302的某个地址写入一个字节数据
0164 ; 参 数: addr--地址值(寄存器或RAM)
0164 ; data--要写入的地址
0164 .dbline 121
0164 ; 返回值 : 无
0164 28E3 ldi R18,56
0166 30E0 ldi R19,0
0168 0027 clr R16
016A 1127 clr R17
016C A4DF xcall _LCD_write_char
016E .dbline 122
016E ; /********************************************/
016E 01E0 ldi R16,1
0170 10E0 ldi R17,0
0172 70DF xcall _delay
0174 .dbline 123
0174 ; void DS1302_writeD(uchar addr,uchar data)
0174 22E0 ldi R18,2
0176 30E0 ldi R19,0
0178 0027 clr R16
017A 1127 clr R17
017C 9CDF xcall _LCD_write_char
017E .dbline 124
017E ; {
017E 01E0 ldi R16,1
0180 10E0 ldi R17,0
0182 68DF xcall _delay
0184 .dbline 125
0184 ; PORTB&=~BIT(RTC_CS); //拉低片选端
0184 28E2 ldi R18,40
0186 30E0 ldi R19,0
0188 0027 clr R16
018A 1127 clr R17
018C 94DF xcall _LCD_write_char
018E .dbline 126
018E ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
018E 01E0 ldi R16,1
0190 10E0 ldi R17,0
0192 60DF xcall _delay
0194 .dbline 127
0194 ; Delayus(10);
0194 28E0 ldi R18,8
0196 30E0 ldi R19,0
0198 0027 clr R16
019A 1127 clr R17
019C 8CDF xcall _LCD_write_char
019E .dbline 128
019E ; PORTB|=BIT(RTC_CS); //拉高片选端
019E 01E0 ldi R16,1
01A0 10E0 ldi R17,0
01A2 58DF xcall _delay
01A4 .dbline 129
01A4 ; Delayus(10); //调整片选脉冲
01A4 21E0 ldi R18,1
01A6 30E0 ldi R19,0
01A8 0027 clr R16
01AA 1127 clr R17
01AC 84DF xcall _LCD_write_char
01AE .dbline 130
01AE ; DS1302_writeB(addr); //写入操作命令(地址)
01AE 01E0 ldi R16,1
01B0 10E0 ldi R17,0
01B2 50DF xcall _delay
01B4 .dbline 131
01B4 ; Delayus(10);
01B4 26E0 ldi R18,6
01B6 30E0 ldi R19,0
01B8 0027 clr R16
01BA 1127 clr R17
01BC 7CDF xcall _LCD_write_char
01BE .dbline 132
01BE ; PORTB&=~BIT(RTC_CLK); //拉低时钟端
01BE 01E0 ldi R16,1
01C0 10E0 ldi R17,0
01C2 48DF xcall _delay
01C4 .dbline 133
01C4 ; Delayus(10);
01C4 2CE0 ldi R18,12
01C6 30E0 ldi R19,0
01C8 0027 clr R16
01CA 1127 clr R17
01CC 74DF xcall _LCD_write_char
01CE .dbline 134
01CE ; DS1302_writeB(data); //写入数据
01CE 05E0 ldi R16,5
01D0 10E0 ldi R17,0
01D2 40DF xcall _delay
01D4 .dbline -2
01D4 L32:
01D4 .dbline 0 ; func end
01D4 0895 ret
01D6 .dbend
01D6 .dbfile D:\单片机\ds1302\ds1302_end\ds1302.c
01D6 .dbfunc e Delayus _Delayus fV
01D6 ; US -> R16,R17
.even
01D6 _Delayus::
01D6 .dbline -1
01D6 .dbline 39
01D6 .dbline 40
01D6 0000 nop
01D8 .dbline -2
01D8 L33:
01D8 .dbline 0 ; func end
01D8 0895 ret
01DA .dbsym r US 16 i
01DA .dbend
01DA .dbfunc e Delayms _Delayms fV
01DA ; i -> R20,R21
01DA ; j -> R22,R23
01DA ; MS -> R16,R17
.even
01DA _Delayms::
01DA 0E940000 xcall push_gset2
01DE .dbline -1
01DE .dbline 43
01DE .dbline 45
01DE 4427 clr R20
01E0 5527 clr R21
01E2 0BC0 xjmp L38
01E4 L35:
01E4 .dbline 46
01E4 6627 clr R22
01E6 7727 clr R23
01E8 02C0 xjmp L42
01EA L39:
01EA .dbline 46
01EA L40:
01EA .dbline 46
01EA 6F5F subi R22,255 ; offset = 1
01EC 7F4F sbci R23,255
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -