?? ds1307.lis
字號:
.module ds1307.c
.area text(rom, con, rel)
0000 .dbfile F:\cdy筆記本資料\E\工程\五星\設計文檔\程序設計\ds1307\ds1307.c
0000 .dbfunc e rtc_write _rtc_write fc
0000 ; i -> R20
0000 ; len -> R22
0000 ; buf -> R10,R11
0000 ; addr -> R20
.even
0000 _rtc_write::
0000 0E940000 xcall push_gset3
0004 5901 movw R10,R18
0006 402F mov R20,R16
0008 6E81 ldd R22,y+6
000A .dbline -1
000A .dbline 11
000A ; #include"twi.h"
000A ; #include"ds1307.h"
000A ; #include"delay.h"
000A ;
000A ; char g_aTimeBuf[7];//日歷/時鐘BCD格式緩沖區
000A ; char g_aTimeBin[7];//時鐘/日歷二進制格式緩沖區
000A ;
000A ; /*************DS1307操作**************開始**************/
000A ; //對DS1307內存連續的寫操作
000A ; unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)
000A ; {
000A .dbline 14
000A ; unsigned char i;
000A ;
000A ; twi_start();
000A 0E940000 xcall _twi_start
000E .dbline 15
000E ; delay_nms(10);
000E 0AE0 ldi R16,10
0010 10E0 ldi R17,0
0012 0E940000 xcall _delay_nms
0016 .dbline 16
0016 ; twi_writebyte(DS1307_ADDR|TW_WRITE);
0016 00ED ldi R16,208
0018 0E940000 xcall _twi_writebyte
001C .dbline 17
001C ; delay_nms(10);
001C 0AE0 ldi R16,10
001E 10E0 ldi R17,0
0020 0E940000 xcall _delay_nms
0024 .dbline 18
0024 ; twi_writebyte(addr);//write address
0024 042F mov R16,R20
0026 0E940000 xcall _twi_writebyte
002A .dbline 19
002A ; delay_nms(10);
002A 0AE0 ldi R16,10
002C 10E0 ldi R17,0
002E 0E940000 xcall _delay_nms
0032 .dbline 20
0032 ; for(i=0;i<len;i++)
0032 4427 clr R20
0034 0CC0 xjmp L5
0036 L2:
0036 .dbline 21
0036 .dbline 22
0036 E42F mov R30,R20
0038 FF27 clr R31
003A EA0D add R30,R10
003C FB1D adc R31,R11
003E 0081 ldd R16,z+0
0040 0E940000 xcall _twi_writebyte
0044 .dbline 23
0044 0AE0 ldi R16,10
0046 10E0 ldi R17,0
0048 0E940000 xcall _delay_nms
004C .dbline 24
004C L3:
004C .dbline 20
004C 4395 inc R20
004E L5:
004E .dbline 20
004E 4617 cp R20,R22
0050 90F3 brlo L2
0052 .dbline 25
0052 ; {
0052 ; twi_writebyte(buf[i]);
0052 ; delay_nms(10);
0052 ; }
0052 ; twi_stop();
0052 0E940000 xcall _twi_stop
0056 .dbline 26
0056 ; return 0;
0056 0027 clr R16
0058 .dbline -2
0058 L1:
0058 0E940000 xcall pop_gset3
005C .dbline 0 ; func end
005C 0895 ret
005E .dbsym r i 20 c
005E .dbsym r len 22 c
005E .dbsym r buf 10 pc
005E .dbsym r addr 20 c
005E .dbend
005E .dbfunc e rtc_read _rtc_read fc
005E ; i -> R20
005E ; len -> R22
005E ; buf -> R10,R11
005E ; addr -> R20
.even
005E _rtc_read::
005E 0E940000 xcall push_gset3
0062 5901 movw R10,R18
0064 402F mov R20,R16
0066 2197 sbiw R28,1
0068 6F81 ldd R22,y+7
006A .dbline -1
006A .dbline 31
006A ; }
006A ;
006A ; //對DS1307內存連續的讀操作
006A ; unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)
006A ; {
006A .dbline 34
006A ; unsigned char i;
006A ;
006A ; rtc_write(addr,0,0); //set address
006A 2224 clr R2
006C 2882 std y+0,R2
006E 2227 clr R18
0070 3327 clr R19
0072 042F mov R16,R20
0074 C5DF xcall _rtc_write
0076 .dbline 36
0076 ;
0076 ; delay_nms(10);
0076 0AE0 ldi R16,10
0078 10E0 ldi R17,0
007A 0E940000 xcall _delay_nms
007E .dbline 38
007E ;
007E ; twi_start();
007E 0E940000 xcall _twi_start
0082 .dbline 39
0082 ; delay_nms(10);
0082 0AE0 ldi R16,10
0084 10E0 ldi R17,0
0086 0E940000 xcall _delay_nms
008A .dbline 40
008A ; twi_writebyte(DS1307_ADDR|TW_READ);
008A 01ED ldi R16,209
008C 0E940000 xcall _twi_writebyte
0090 .dbline 41
0090 ; for(i=0;i<len-1;i++)
0090 4427 clr R20
0092 0CC0 xjmp L10
0094 L7:
0094 .dbline 42
0094 .dbline 43
0094 21E0 ldi R18,1
0096 042F mov R16,R20
0098 1127 clr R17
009A 0A0D add R16,R10
009C 1B1D adc R17,R11
009E 0E940000 xcall _twi_readbyte
00A2 .dbline 44
00A2 0AE0 ldi R16,10
00A4 10E0 ldi R17,0
00A6 0E940000 xcall _delay_nms
00AA .dbline 45
00AA L8:
00AA .dbline 41
00AA 4395 inc R20
00AC L10:
00AC .dbline 41
00AC 862F mov R24,R22
00AE 8150 subi R24,1
00B0 4817 cp R20,R24
00B2 80F3 brlo L7
00B4 .dbline 46
00B4 ; {
00B4 ; twi_readbyte(buf+i,TW_ACK);
00B4 ; delay_nms(10);
00B4 ; }
00B4 ; twi_readbyte(buf+i,TW_NACK);
00B4 2227 clr R18
00B6 042F mov R16,R20
00B8 1127 clr R17
00BA 0A0D add R16,R10
00BC 1B1D adc R17,R11
00BE 0E940000 xcall _twi_readbyte
00C2 .dbline 47
00C2 ; delay_nms(10);
00C2 0AE0 ldi R16,10
00C4 10E0 ldi R17,0
00C6 0E940000 xcall _delay_nms
00CA .dbline 48
00CA ; twi_stop();
00CA 0E940000 xcall _twi_stop
00CE .dbline 49
00CE ; return 0;
00CE 0027 clr R16
00D0 .dbline -2
00D0 L6:
00D0 2196 adiw R28,1
00D2 0E940000 xcall pop_gset3
00D6 .dbline 0 ; func end
00D6 0895 ret
00D8 .dbsym r i 20 c
00D8 .dbsym r len 22 c
00D8 .dbsym r buf 10 pc
00D8 .dbsym r addr 20 c
00D8 .dbend
00D8 .dbfunc e RtcUpdateData _RtcUpdateData fc
00D8 ; ret -> R20
00D8 ; direction -> R20
.even
00D8 _RtcUpdateData::
00D8 0E940000 xcall push_gset1
00DC 402F mov R20,R16
00DE 2197 sbiw R28,1
00E0 .dbline -1
00E0 .dbline 59
00E0 ; }
00E0 ; /*************DS1307操作**************結束**************/
00E0 ;
00E0 ; /*************接口部分****************開始**************/
00E0 ;
00E0 ;
00E0 ;
00E0 ; //更新或讀取DS1307日歷/時間數據
00E0 ; unsigned char RtcUpdateData(unsigned char direction)
00E0 ; {
00E0 .dbline 61
00E0 ; unsigned char ret;
00E0 ; if(direction) //讀
00E0 4423 tst R20
00E2 41F0 breq L12
00E4 .dbline 62
00E4 ; ret=rtc_read(0,g_aTimeBuf,7);
00E4 87E0 ldi R24,7
00E6 8883 std y+0,R24
00E8 20E0 ldi R18,<_g_aTimeBuf
00EA 30E0 ldi R19,>_g_aTimeBuf
00EC 0027 clr R16
00EE B7DF xcall _rtc_read
00F0 402F mov R20,R16
00F2 07C0 xjmp L13
00F4 L12:
00F4 .dbline 64
00F4 ; else //寫
00F4 ; ret=rtc_write(0,g_aTimeBuf,7);
00F4 87E0 ldi R24,7
00F6 8883 std y+0,R24
00F8 20E0 ldi R18,<_g_aTimeBuf
00FA 30E0 ldi R19,>_g_aTimeBuf
00FC 0027 clr R16
00FE 80DF xcall _rtc_write
0100 402F mov R20,R16
0102 L13:
0102 .dbline 66
0102 ;
0102 ; return ret;
0102 042F mov R16,R20
0104 .dbline -2
0104 L11:
0104 2196 adiw R28,1
0106 0E940000 xcall pop_gset1
010A .dbline 0 ; func end
010A 0895 ret
010C .dbsym r ret 20 c
010C .dbsym r direction 20 c
010C .dbend
010C .dbfunc e RtcReadRAM _RtcReadRAM fc
010C ; len -> y+5
010C ; buf -> R22,R23
010C ; addr -> R20
.even
010C _RtcReadRAM::
010C 0E940000 xcall push_gset2
0110 B901 movw R22,R18
0112 402F mov R20,R16
0114 2197 sbiw R28,1
0116 .dbline -1
0116 .dbline 70
0116 ; }
0116 ; //讀DS1307用戶RAM
0116 ; unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)
0116 ; {
0116 .dbline 71
0116 ; addr+=8;
0116 485F subi R20,248 ; addi 8
0118 .dbline 72
0118 ; return rtc_read(addr,buf,len);
0118 0D80 ldd R0,y+5
011A 0882 std y+0,R0
011C 9B01 movw R18,R22
011E 042F mov R16,R20
0120 9EDF xcall _rtc_read
0122 .dbline -2
0122 L14:
0122 2196 adiw R28,1
0124 0E940000 xcall pop_gset2
0128 .dbline 0 ; func end
0128 0895 ret
012A .dbsym l len 5 c
012A .dbsym r buf 22 pc
012A .dbsym r addr 20 c
012A .dbend
012A .dbfunc e RtcWriteRAM _RtcWriteRAM fc
012A ; len -> y+5
012A ; buf -> R22,R23
012A ; addr -> R20
.even
012A _RtcWriteRAM::
012A 0E940000 xcall push_gset2
012E B901 movw R22,R18
0130 402F mov R20,R16
0132 2197 sbiw R28,1
0134 .dbline -1
0134 .dbline 76
0134 ; }
0134 ; //寫DS1307用戶RAM
0134 ; unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)
0134 ; {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -