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

📄 at24c01.lis

📁 通过MEGA128的串口对I2C芯片24c01的读写程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -