📄 24cxx.lis
字号:
.module _24Cxx.C
.area text(rom, con, rel)
0000 .dbfile E:\学习专区\AVR专区\个人创作区\AVR单片机开发平台\EEPROM读写演示程序\24Cxx.C
0000 .dbfunc e delay_EEPROM _delay_EEPROM fV
0000 ; a -> R20,R21
0000 ; b -> R22,R23
0000 ; n -> R16
.even
0000 _delay_EEPROM::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 12
0004 ; /**************************************************
0004 ; EEPROM读写操作
0004 ; 晶振:内部 8M
0004 ; ***************************************************/
0004 ; #include<iom16v.h>
0004 ; #include<macros.h>
0004 ; #define uchar unsigned char
0004 ; #define uint unsigned int
0004 ; #define ulong unsigned long
0004 ; uchar syserr;
0004 ; void delay_EEPROM(uchar n) //延时
0004 ; {
0004 .dbline 14
0004 ; unsigned int a,b;
0004 ; for(a=0;a<n;a++)
0004 4427 clr R20
0006 5527 clr R21
0008 0BC0 xjmp L5
000A L2:
000A .dbline 15
000A ; for(b=0;b<100;b++)
000A 6627 clr R22
000C 7727 clr R23
000E 02C0 xjmp L9
0010 L6:
0010 .dbline 16
0010 L7:
0010 .dbline 15
0010 6F5F subi R22,255 ; offset = 1
0012 7F4F sbci R23,255
0014 L9:
0014 .dbline 15
0014 6436 cpi R22,100
0016 E0E0 ldi R30,0
0018 7E07 cpc R23,R30
001A D0F3 brlo L6
001C L3:
001C .dbline 14
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 L5:
0020 .dbline 14
0020 202E mov R2,R16
0022 3324 clr R3
0024 4215 cp R20,R2
0026 5305 cpc R21,R3
0028 80F3 brlo L2
002A .dbline -2
002A L1:
002A 0E940000 xcall pop_gset2
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r a 20 i
0030 .dbsym r b 22 i
0030 .dbsym r n 16 c
0030 .dbend
0030 .dbfunc e wt24c _wt24c fV
0030 ; n -> R10,R11
0030 ; num -> R12,R13
0030 ; ad_dst -> R14,R15
0030 ; p_rsc -> y+11
.even
0030 _wt24c::
0030 0E940000 xcall push_arg4
0034 0E940000 xcall push_gset5
0038 7901 movw R14,R18
003A 2197 sbiw R28,1
003C CF84 ldd R12,y+15
003E D888 ldd R13,y+16
0040 .dbline -1
0040 .dbline 82
0040 ; ;
0040 ; }
0040 ; //------在此设定芯片型号------
0040 ; #define e2prom 256 // <---在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
0040 ;
0040 ; #if e2prom==1
0040 ; #define PAGE_SIZE 8
0040 ; #define SIZE 0x007f
0040 ; #elif e2prom==2
0040 ; #define PAGE_SIZE 8
0040 ; #define SIZE 0x00ff
0040 ; #elif e2prom==4
0040 ; #define PAGE_SIZE 16
0040 ; #define SIZE 0x01ff
0040 ; #elif e2prom==8
0040 ; #define PAGE_SIZE 16
0040 ; #define SIZE 0x03ff
0040 ; #elif e2prom==16
0040 ; #define PAGE_SIZE 16
0040 ; #define SIZE 0x07ff
0040 ; #elif e2prom==32
0040 ; #define PAGE_SIZE 32
0040 ; #define SIZE 0x0fff
0040 ; #elif e2prom==64
0040 ; #define PAGE_SIZE 32
0040 ; #define SIZE 0x1fff
0040 ; #elif e2prom==128
0040 ; #define PAGE_SIZE 64
0040 ; #define SIZE 0x3fff
0040 ; #elif e2prom==256
0040 ; #define PAGE_SIZE 64
0040 ; #define SIZE 0x7fff
0040 ; #elif e2prom==512
0040 ; #define PAGE_SIZE 128
0040 ; #define SIZE 0xffff
0040 ; #endif
0040 ; //--------------------------
0040 ;
0040 ; //--------在此设定芯片地址-------
0040 ; #define W_ADD_COM 0xa0 //写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
0040 ; #define R_ADD_COM 0xa1 //读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
0040 ; //-------------------------------
0040 ;
0040 ;
0040 ;
0040 ; #define SLAW 0x18 //SLA_W 已正常发送代码,判断器件是否正常应答的常量.
0040 ;
0040 ; //-----在此改变预置错误号-----
0040 ; #define ERR_SLAW 10//写字节命令及器件地址错, 在此也就是读写器件错!!
0040 ; //---------------------------
0040 ;
0040 ;
0040 ;
0040 ; //-----------4个I2总线公用函数, 可供其它I2总线器件的程序调用--------------
0040 ; void i2cstart(void); //总线上起动开始条件
0040 ; uchar i2cwt(uchar a); //把一个字节数据输入器件, 返回TWI状态
0040 ; uchar i2crd(void); //i2c读要调用的函数
0040 ; void i2cstop(void); //总线上起动停止条件
0040 ; //------------------------------------------------------------------------
0040 ;
0040 ; uchar * wt24c_fc(uchar *p, uint ad, uchar n); //向24Cxx写入数据wt24c_h()所要调用的函数
0040 ;
0040 ; //向24Cxx写入数据
0040 ; //参数: *p_rsc要输出数据的主机内存地址指针; ad_dst要写入数据的i2c的地址(双字节); num数据个数
0040 ; //参数条件: ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
0040 ; void wt24c(uchar *p_rsc, uint ad_dst, uint num)
0040 ; { uint n;
0040 .dbline 84
0040 ;
0040 ; n=ad_dst/PAGE_SIZE; //确定地址与块地址的差
0040 26E0 ldi R18,6
0042 30E0 ldi R19,0
0044 8701 movw R16,R14
0046 0E940000 xcall lsr16
004A 5801 movw R10,R16
004C .dbline 85
004C ; if(n)
004C 0030 cpi R16,0
004E 0107 cpc R16,R17
0050 E1F0 breq L11
0052 X0:
0052 .dbline 86
0052 ; n=(ulong)PAGE_SIZE*(n+1)-ad_dst;
0052 C501 movw R24,R10
0054 0196 adiw R24,1
0056 1C01 movw R2,R24
0058 4424 clr R4
005A 5524 clr R5
005C 40E4 ldi R20,64
005E 50E0 ldi R21,0
0060 60E0 ldi R22,0
0062 70E0 ldi R23,0
0064 5A92 st -y,R5
0066 4A92 st -y,R4
0068 3A92 st -y,R3
006A 2A92 st -y,R2
006C 8A01 movw R16,R20
006E 9B01 movw R18,R22
0070 0E940000 xcall empy32u
0074 1801 movw R2,R16
0076 2901 movw R4,R18
0078 3701 movw R6,R14
007A 8824 clr R8
007C 9924 clr R9
007E 2618 sub R2,R6
0080 3708 sbc R3,R7
0082 4808 sbc R4,R8
0084 5908 sbc R5,R9
0086 5101 movw R10,R2
0088 05C0 xjmp L12
008A L11:
008A .dbline 88
008A ; else
008A ; n=PAGE_SIZE-ad_dst;
008A 80E4 ldi R24,64
008C 90E0 ldi R25,0
008E 5C01 movw R10,R24
0090 AE18 sub R10,R14
0092 BF08 sbc R11,R15
0094 L12:
0094 .dbline 90
0094 ;
0094 ; if(n>=num) //如果ad_dst所在的数据块的末尾地址 >= ad_dst + num, 就直接写入num个数据
0094 AC14 cp R10,R12
0096 BD04 cpc R11,R13
0098 58F0 brlo L13
009A .dbline 91
009A ; {
009A .dbline 92
009A ; wt24c_fc(p_rsc, ad_dst, num);
009A C882 std y+0,R12
009C 9701 movw R18,R14
009E 0B85 ldd R16,y+11
00A0 1C85 ldd R17,y+12
00A2 77D0 xcall _wt24c_fc
00A4 .dbline 93
00A4 ; if(syserr!=0)
00A4 20900000 lds R2,_syserr
00A8 2220 tst R2
00AA 09F4 brne X3
00AC 34C0 xjmp L14
00AE X3:
00AE .dbline 94
00AE ; return;
00AE 33C0 xjmp L10
00B0 X1:
00B0 .dbline 95
00B0 ; }
00B0 L13:
00B0 .dbline 97
00B0 ; else //如果ad_dst所在的数据块末尾地址 < ad_dst + num, 就先写入ad_dst所在的数据块末尾地址与 ad_dst 之差个数据
00B0 ; {
00B0 .dbline 98
00B0 ; p_rsc=wt24c_fc(p_rsc, ad_dst, n);
00B0 A882 std y+0,R10
00B2 9701 movw R18,R14
00B4 0B85 ldd R16,y+11
00B6 1C85 ldd R17,y+12
00B8 6CD0 xcall _wt24c_fc
00BA 1C87 std y+12,R17
00BC 0B87 std y+11,R16
00BE .dbline 99
00BE ; if(syserr!=0)
00BE 20900000 lds R2,_syserr
00C2 2220 tst R2
00C4 09F0 breq L17
00C6 .dbline 100
00C6 ; return;
00C6 27C0 xjmp L10
00C8 L17:
00C8 .dbline 102
00C8 ;
00C8 ; num-=n; //更新剩下数据个数
00C8 CA18 sub R12,R10
00CA DB08 sbc R13,R11
00CC .dbline 103
00CC ; ad_dst+=n; //更新剩下数据的起始地址
00CC EA0C add R14,R10
00CE FB1C adc R15,R11
00D0 15C0 xjmp L20
00D2 L19:
00D2 .dbline 107
00D2 ;
00D2 ; //把剩下数据写入器件
00D2 ; while(num>=PAGE_SIZE) //先按PAGE_SIZE为长度一页一页的写入
00D2 ; { p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
00D2 .dbline 107
00D2 80E4 ldi R24,64
00D4 8883 std y+0,R24
00D6 9701 movw R18,R14
00D8 0B85 ldd R16,y+11
00DA 1C85 ldd R17,y+12
00DC 5AD0 xcall _wt24c_fc
00DE 1C87 std y+12,R17
00E0 0B87 std y+11,R16
00E2 .dbline 108
00E2 ; if(syserr!=0) return;
00E2 20900000 lds R2,_syserr
00E6 2220 tst R2
00E8 09F0 breq L22
00EA .dbline 108
00EA 15C0 xjmp L10
00EC L22:
00EC .dbline 110
00EC C601 movw R24,R12
00EE 8054 subi R24,64
00F0 9040 sbci R25,0
00F2 6C01 movw R12,R24
00F4 .dbline 111
00F4 C701 movw R24,R14
00F6 805C subi R24,192 ; offset = 64
00F8 9F4F sbci R25,255
00FA 7C01 movw R14,R24
00FC .dbline 112
00FC L20:
00FC .dbline 106
00FC C601 movw R24,R12
00FE 8034 cpi R24,64
0100 E0E0 ldi R30,0
0102 9E07 cpc R25,R30
0104 30F7 brsh L19
0106 .dbline 114
0106 ;
0106 ; num-=PAGE_SIZE; //更新剩余数据个数
0106 ; ad_dst+=PAGE_SIZE; //更新剩下数据的起始地址
0106 ; }
0106 ;
0106 ; if(num) //把最后剩下的小于一个PAGE_SIZE长度的数据写入器件
0106 8030 cpi R24,0
0108 8907 cpc R24,R25
010A 29F0 breq L24
010C X2:
010C .dbline 115
010C ; wt24c_fc(p_rsc, ad_dst, num);
010C C882 std y+0,R12
010E 9701 movw R18,R14
0110 0B85 ldd R16,y+11
0112 1C85 ldd R17,y+12
0114 3ED0 xcall _wt24c_fc
0116 L24:
0116 .dbline 116
0116 L14:
0116 .dbline -2
0116 L10:
0116 2196 adiw R28,1
0118 0E940000 xcall pop_gset5
011C 2496 adiw R28,4
011E .dbline 0 ; func end
011E 0895 ret
0120 .dbsym r n 10 i
0120 .dbsym r num 12 i
0120 .dbsym r ad_dst 14 i
0120 .dbsym l p_rsc 11 pc
0120 .dbend
0120 .dbfunc e port_init _port_init fV
.even
0120 _port_init::
0120 .dbline -1
0120 .dbline 124
0120 ; }
0120 ; }
0120 ;
0120 ;
0120 ; //从24cxx读出数据
0120 ; //参数: *p_dst要读入数据的主机内存地址指针; ad_rsc要输出数据的i2c的地址(整形); num数据个数(整形)
0120 ; //参数条件: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
0120 ; void port_init(void)
0120 ; {
0120 .dbline 126
0120 ;
0120 ; PORTC = 0xFF;
0120 8FEF ldi R24,255
0122 85BB out 0x15,R24
0124 .dbline 127
0124 ; DDRC &= 0xfc;
0124 84B3 in R24,0x14
0126 8C7F andi R24,252
0128 84BB out 0x14,R24
012A .dbline -2
012A L26:
012A .dbline 0 ; func end
012A 0895 ret
012C .dbend
012C .dbfunc e twi_init _twi_init fV
.even
012C _twi_init::
012C .dbline -1
012C .dbline 132
012C ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -