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

📄 24cxx.lis

📁 EEPROM读写程序: 先向EEPROM写入一幅图片数据
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -