📄 at24c01.lis
字号:
.module AT24C01.c
.area text(rom, con, rel)
0000 .dbfile D:\avrvi\AVRVi_m128_Starter_Kit\USART_24C01\source\lib\AT24C01.c
0000 .dbfunc e wt24c_fc _wt24c_fc fpc
0000 ; t -> R12
0000 ; n -> R22
0000 ; ad -> R10,R11
0000 ; p -> R20,R21
.even
0000 _wt24c_fc::
0000 0E940000 xcall push_gset4
0004 5901 movw R10,R18
0006 A801 movw R20,R16
0008 6885 ldd R22,y+8
000A .dbline -1
000A .dbline 22
000A ; /************************************************
000A ; 文件:AT24C01.c
000A ; 用途:AT24C01操作函数
000A ; 注意:
000A ; 创建:2008.1.26
000A ; 修改:2008.1.26
000A ; Copy Right (c) www.avrvi.com AVR与虚拟仪器
000A ; ************************************************/
000A ; #include "..\config.h"
000A ; unsigned char syserr;
000A ; /*************************************************************************
000A ; ** 函数名称: unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
000A ; ** 功能描述: 向24Cxx写入数据wt24c_h()所要调用的函数
000A ; ** 输 入:
000A ; ** 输出 : 返回写入n个字节后的主机内存指针
000A ; ** 全局变量: 无
000A ; ** 调用模块:
000A ; ** 说明:
000A ; ** 注意:
000A ; **************************************************************************/
000A ; unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
000A ; {
000A .dbline 23
000A ; unsigned char t=0;
000A CC24 clr R12
000C .dbline 26
000C ;
000C ; #if e2prom<32
000C ; t=ad>>8;
000C 6501 movw R12,R10
000E CD2C mov R12,R13
0010 DD24 clr R13
0012 .dbline 27
0012 ; t<<=1;
0012 CC0C lsl R12
0014 .dbline 30
0014 ; #endif
0014 ;
0014 ; i2cstart(); //发送起始信号
0014 0E940000 xcall _i2cstart
0018 .dbline 32
0018 ;
0018 ; if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
0018 0C2D mov R16,R12
001A 0056 subi R16,96 ; addi 160
001C 0E940000 xcall _i2cwt
0020 0831 cpi R16,24
0022 79F4 brne L3
0024 .dbline 33
0024 ; {
0024 .dbline 37
0024 ; #if e2prom>16
0024 ; i2cwt(ad>>8); //ad_dst的高位到器件
0024 ; #endif
0024 ; i2cwt(ad); //ad_dst的低位到器件
0024 0A2D mov R16,R10
0026 0E940000 xcall _i2cwt
002A .dbline 39
002A ;
002A ; for(;n>0;n--) //发送要写入的数据
002A 07C0 xjmp L8
002C L5:
002C .dbline 40
002C .dbline 41
002C FA01 movw R30,R20
002E 0081 ldd R16,z+0
0030 0E940000 xcall _i2cwt
0034 .dbline 42
0034 4F5F subi R20,255 ; offset = 1
0036 5F4F sbci R21,255
0038 .dbline 43
0038 L6:
0038 .dbline 39
0038 6A95 dec R22
003A L8:
003A .dbline 39
003A 2224 clr R2
003C 2616 cp R2,R22
003E B0F3 brlo L5
0040 .dbline 44
0040 ; {
0040 ; i2cwt(*p);
0040 ; p++;
0040 ; }
0040 ; }
0040 03C0 xjmp L4
0042 L3:
0042 .dbline 45
0042 ; else syserr=ERR_SLAW; //写字节命令及器件地址错
0042 81E0 ldi R24,1
0044 80930000 sts _syserr,R24
0048 L4:
0048 .dbline 47
0048 ;
0048 ; i2cstop();
0048 0E940000 xcall _i2cstop
004C .dbline 48
004C ; delay_nms(6); //延时6ms
004C 06E0 ldi R16,6
004E 10E0 ldi R17,0
0050 0E940000 xcall _delay_nms
0054 .dbline 50
0054 ;
0054 ; return(p);
0054 8A01 movw R16,R20
0056 .dbline -2
0056 L2:
0056 0E940000 xcall pop_gset4
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r t 12 c
005C .dbsym r n 22 c
005C .dbsym r ad 10 i
005C .dbsym r p 20 pc
005C .dbend
005C .dbfunc e wt24c _wt24c fV
005C ; n -> R10,R11
005C ; num -> R12,R13
005C ; ad_dst -> R14,R15
005C ; p_rsc -> y+11
.even
005C _wt24c::
005C 0E940000 xcall push_arg4
0060 0E940000 xcall push_gset5
0064 7901 movw R14,R18
0066 2197 sbiw R28,1
0068 CF84 ldd R12,y+15
006A D888 ldd R13,y+16
006C .dbline -1
006C .dbline 63
006C ; }
006C ; /*************************************************************************
006C ; ** 函数名称:
006C ; ** 功能描述: 向24Cxx写入数据
006C ; ** 输 入: *p_rsc要输出数据的主机内存地址指针; ad_dst要写入数据的i2c的地址(双字节); num数据个数
006C ; ** 输出 :
006C ; ** 全局变量: 无
006C ; ** 调用模块:
006C ; ** 说明:ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
006C ; ** 注意:
006C ; **************************************************************************/
006C ; void wt24c(unsigned char *p_rsc, unsigned int ad_dst, unsigned int num)
006C ; {
006C .dbline 66
006C ; unsigned int n;
006C ;
006C ; n=ad_dst/PAGE_SIZE; //确定地址与块地址的差
006C 5701 movw R10,R14
006E B694 lsr R11
0070 A794 ror R10
0072 B694 lsr R11
0074 A794 ror R10
0076 B694 lsr R11
0078 A794 ror R10
007A .dbline 67
007A ; if(n) n=(unsigned long)PAGE_SIZE*(n+1)-ad_dst;
007A AA20 tst R10
007C 11F4 brne X0
007E BB20 tst R11
0080 E1F0 breq L10
0082 X0:
0082 .dbline 67
0082 C501 movw R24,R10
0084 0196 adiw R24,1
0086 1C01 movw R2,R24
0088 4424 clr R4
008A 5524 clr R5
008C 48E0 ldi R20,8
008E 50E0 ldi R21,0
0090 60E0 ldi R22,0
0092 70E0 ldi R23,0
0094 5A92 st -y,R5
0096 4A92 st -y,R4
0098 3A92 st -y,R3
009A 2A92 st -y,R2
009C 8A01 movw R16,R20
009E 9B01 movw R18,R22
00A0 0E940000 xcall empy32u
00A4 1801 movw R2,R16
00A6 2901 movw R4,R18
00A8 3701 movw R6,R14
00AA 8824 clr R8
00AC 9924 clr R9
00AE 2618 sub R2,R6
00B0 3708 sbc R3,R7
00B2 4808 sbc R4,R8
00B4 5908 sbc R5,R9
00B6 5101 movw R10,R2
00B8 05C0 xjmp L11
00BA L10:
00BA .dbline 68
00BA ; else n=PAGE_SIZE-ad_dst;
00BA 88E0 ldi R24,8
00BC 90E0 ldi R25,0
00BE 5C01 movw R10,R24
00C0 AE18 sub R10,R14
00C2 BF08 sbc R11,R15
00C4 L11:
00C4 .dbline 70
00C4 ;
00C4 ; if(n>=num) //如果ad_dst所在的数据块的末尾地址 >= ad_dst + num, 就直接写入num个数据
00C4 AC14 cp R10,R12
00C6 BD04 cpc R11,R13
00C8 58F0 brlo L12
00CA .dbline 71
00CA ; {
00CA .dbline 72
00CA ; wt24c_fc(p_rsc, ad_dst, num);
00CA C882 std y+0,R12
00CC 9701 movw R18,R14
00CE 0B85 ldd R16,y+11
00D0 1C85 ldd R17,y+12
00D2 96DF xcall _wt24c_fc
00D4 .dbline 73
00D4 ; if(syserr!=0) return;
00D4 20900000 lds R2,_syserr
00D8 2220 tst R2
00DA 09F4 brne X3
00DC 32C0 xjmp L13
00DE X3:
00DE .dbline 73
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -