📄 at24c.lis
字号:
00C0 ; AT24C_delay(AT24CWAIT);
00C0 01E0 ldi R16,1
00C2 9EDF xcall _AT24C_delay
00C4 .dbline 107
00C4 ; SDA_HI();
00C4 C09A sbi 0x18,0
00C6 .dbline 108
00C6 ; SDA_OUTPUT();
00C6 B89A sbi 0x17,0
00C8 .dbline 109
00C8 ; SCL_HI();
00C8 C19A sbi 0x18,1
00CA .dbline 110
00CA ; AT24C_delay(AT24CWAIT);
00CA 01E0 ldi R16,1
00CC 99DF xcall _AT24C_delay
00CE .dbline 111
00CE ; SCL_LO();
00CE C198 cbi 0x18,1
00D0 .dbline 112
00D0 ; return(retc);
00D0 042F mov R16,R20
00D2 .dbline -2
00D2 L19:
00D2 .dbline 0 ; func end
00D2 6991 ld R22,y+
00D4 4991 ld R20,y+
00D6 0895 ret
00D8 .dbsym r retc 20 c
00D8 .dbsym r i 22 c
00D8 .dbend
00D8 .dbfunc e AT24_Read _AT24_Read fc
00D8 ; i -> R10
00D8 ; ret -> R22
00D8 ; num -> y+10
00D8 ; addr -> R20,R21
00D8 ; buffer -> R12,R13
.even
00D8 _AT24_Read::
00D8 0E940000 xcall push_xgsetF0FC
00DC A901 movw R20,R18
00DE 6801 movw R12,R16
00E0 .dbline -1
00E0 .dbline 117
00E0 ; }
00E0 ;
00E0 ; /*EEPROM数据读出*/
00E0 ; unsigned char AT24_Read(unsigned char * buffer,unsigned int addr,unsigned char num)
00E0 ; {
00E0 .dbline 119
00E0 ; unsigned char i,ret;
00E0 ; for(i=0;i<num;i++)
00E0 AA24 clr R10
00E2 2FC0 xjmp L30
00E4 L27:
00E4 .dbline 120
00E4 ; {
00E4 .dbline 121
00E4 ; I2C_SendStart();
00E4 9FDF xcall _I2C_SendStart
00E6 .dbline 122
00E6 ; ret = I2C_SendByte(AT24_DEVICEADDR);
00E6 00EA ldi R16,160
00E8 ACDF xcall _I2C_SendByte
00EA 602F mov R22,R16
00EC .dbline 123
00EC ; if(ret != 1)
00EC 0130 cpi R16,1
00EE 11F0 breq L31
00F0 X6:
00F0 .dbline 124
00F0 ; return 0;
00F0 0027 clr R16
00F2 2CC0 xjmp L26
00F4 L31:
00F4 .dbline 125
00F4 ; ret = I2C_SendByte(addr>>8);
00F4 8A01 movw R16,R20
00F6 012F mov R16,R17
00F8 1127 clr R17
00FA A3DF xcall _I2C_SendByte
00FC 602F mov R22,R16
00FE .dbline 126
00FE ; if(ret != 1)
00FE 0130 cpi R16,1
0100 11F0 breq L33
0102 X7:
0102 .dbline 127
0102 ; return 0;
0102 0027 clr R16
0104 23C0 xjmp L26
0106 L33:
0106 .dbline 128
0106 ; ret = I2C_SendByte(addr);
0106 042F mov R16,R20
0108 9CDF xcall _I2C_SendByte
010A E02E mov R14,R16
010C 6E2D mov R22,R14
010E .dbline 129
010E ; if(ret != 1)
010E 0130 cpi R16,1
0110 11F0 breq L35
0112 X8:
0112 .dbline 130
0112 ; return 0;
0112 0027 clr R16
0114 1BC0 xjmp L26
0116 L35:
0116 .dbline 131
0116 ; I2C_SendStart();
0116 86DF xcall _I2C_SendStart
0118 .dbline 132
0118 ; ret = I2C_SendByte(AT24_DEVICEADDR|0x01);
0118 01EA ldi R16,161
011A 93DF xcall _I2C_SendByte
011C E02E mov R14,R16
011E 6E2D mov R22,R14
0120 .dbline 133
0120 ; if(ret != 1)
0120 0130 cpi R16,1
0122 11F0 breq L37
0124 X9:
0124 .dbline 134
0124 ; return 0;
0124 0027 clr R16
0126 12C0 xjmp L26
0128 L37:
0128 .dbline 135
0128 ; buffer[i] = I2C_ReceiveByte();
0128 B5DF xcall _I2C_ReceiveByte
012A E02E mov R14,R16
012C EA2D mov R30,R10
012E FF27 clr R31
0130 EC0D add R30,R12
0132 FD1D adc R31,R13
0134 E082 std z+0,R14
0136 .dbline 136
0136 ; I2C_SendStop();
0136 7FDF xcall _I2C_SendStop
0138 .dbline 137
0138 ; addr ++;
0138 4F5F subi R20,255 ; offset = 1
013A 5F4F sbci R21,255
013C .dbline 138
013C ; AT24C_delay(10);
013C 0AE0 ldi R16,10
013E 60DF xcall _AT24C_delay
0140 .dbline 139
0140 ; }
0140 L28:
0140 .dbline 119
0140 A394 inc R10
0142 L30:
0142 .dbline 119
0142 0A84 ldd R0,y+10
0144 A014 cp R10,R0
0146 08F4 brsh X11
0148 CDCF xjmp L27
014A X11:
014A X10:
014A .dbline 140
014A ; return 1;
014A 01E0 ldi R16,1
014C .dbline -2
014C L26:
014C .dbline 0 ; func end
014C 0C940000 xjmp pop_xgsetF0FC
0150 .dbsym r i 10 c
0150 .dbsym r ret 22 c
0150 .dbsym l num 10 c
0150 .dbsym r addr 20 i
0150 .dbsym r buffer 12 pc
0150 .dbend
0150 .dbfunc e AT24_Write _AT24_Write fc
0150 ; ct -> R10
0150 ; ret -> R14
0150 ; i -> R22
0150 ; num -> R12
0150 ; addr -> y+12
0150 ; buffer -> y+10
.even
0150 _AT24_Write::
0150 0E940000 xcall push_arg4
0154 0E940000 xcall push_xgsetF0FC
0158 CE84 ldd R12,y+14
015A .dbline -1
015A .dbline 145
015A ; }
015A ;
015A ; /*写数据到EEPROM*/
015A ; unsigned char AT24_Write(unsigned char * buffer,unsigned int addr,unsigned char num)
015A ; {
015A .dbline 147
015A ; unsigned char i,ct,ret;
015A ; ct = 0;
015A AA24 clr R10
015C L40:
015C .dbline 149
015C ; nextpage:
015C ; I2C_SendStart();
015C 63DF xcall _I2C_SendStart
015E .dbline 150
015E ; ret = I2C_SendByte(AT24_DEVICEADDR);
015E 00EA ldi R16,160
0160 70DF xcall _I2C_SendByte
0162 E02E mov R14,R16
0164 .dbline 151
0164 ; if(ret != 1)
0164 0130 cpi R16,1
0166 11F0 breq L41
0168 X12:
0168 .dbline 152
0168 ; return 0;
0168 0027 clr R16
016A 3CC0 xjmp L39
016C L41:
016C .dbline 153
016C ; ret = I2C_SendByte(addr>>8);
016C 0C85 ldd R16,y+12
016E 1D85 ldd R17,y+13
0170 012F mov R16,R17
0172 1127 clr R17
0174 66DF xcall _I2C_SendByte
0176 E02E mov R14,R16
0178 .dbline 154
0178 ; if(ret != 1)
0178 0130 cpi R16,1
017A 11F0 breq L43
017C X13:
017C .dbline 155
017C ; return 0;
017C 0027 clr R16
017E 32C0 xjmp L39
0180 L43:
0180 .dbline 156
0180 ; ret = I2C_SendByte(addr);
0180 0C85 ldd R16,y+12
0182 5FDF xcall _I2C_SendByte
0184 402F mov R20,R16
0186 E42E mov R14,R20
0188 .dbline 157
0188 ; if(ret != 1)
0188 0130 cpi R16,1
018A 11F0 breq L45
018C X14:
018C .dbline 158
018C ; return 0;
018C 0027 clr R16
018E 2AC0 xjmp L39
0190 L45:
0190 .dbline 159
0190 ; for(i=0;i<num;i++)
0190 6627 clr R22
0192 22C0 xjmp L50
0194 L47:
0194 .dbline 160
0194 ; {
0194 .dbline 161
0194 ; ret = I2C_SendByte(buffer[ct++]);
0194 4A2D mov R20,R10
0196 5527 clr R21
0198 842F mov R24,R20
019A 8F5F subi R24,255 ; addi 1
019C A82E mov R10,R24
019E E42F mov R30,R20
01A0 FF27 clr R31
01A2 0A84 ldd R0,y+10
01A4 1B84 ldd R1,y+11
01A6 E00D add R30,R0
01A8 F11D adc R31,R1
01AA 0081 ldd R16,z+0
01AC 4ADF xcall _I2C_SendByte
01AE 402F mov R20,R16
01B0 E42E mov R14,R20
01B2 .dbline 162
01B2 ; if(ret != 1)
01B2 0130 cpi R16,1
01B4 11F0 breq L51
01B6 X15:
01B6 .dbline 163
01B6 ; return 0;
01B6 0027 clr R16
01B8 15C0 xjmp L39
01BA L51:
01BA .dbline 164
01BA ; addr ++;
01BA 8C85 ldd R24,y+12
01BC 9D85 ldd R25,y+13
01BE 0196 adiw R24,1
01C0 9D87 std y+13,R25
01C2 8C87 std y+12,R24
01C4 .dbline 165
01C4 ; if((((unsigned char)addr)&0x7F) == 0)
01C4 8F77 andi R24,127
01C6 39F4 brne L53
01C8 X16:
01C8 .dbline 166
01C8 ; {
01C8 .dbline 167
01C8 ; I2C_SendStop();
01C8 36DF xcall _I2C_SendStop
01CA .dbline 168
01CA ; AT24C_delay(20);
01CA 04E1 ldi R16,20
01CC 19DF xcall _AT24C_delay
01CE .dbline 169
01CE ; num -= i+1;
01CE 862F mov R24,R22
01D0 8F5F subi R24,255 ; addi 1
01D2 C81A sub R12,R24
01D4 .dbline 170
01D4 ; goto nextpage;
01D4 C3CF xjmp L40
01D6 L53:
01D6 .dbline 172
01D6 ; }
01D6 ; }
01D6 L48:
01D6 .dbline 159
01D6 6395 inc R22
01D8 L50:
01D8 .dbline 159
01D8 6C15 cp R22,R12
01DA E0F2 brlo L47
01DC X17:
01DC .dbline 173
01DC ; I2C_SendStop();
01DC 2CDF xcall _I2C_SendStop
01DE .dbline 174
01DE ; AT24C_delay(15);
01DE 0FE0 ldi R16,15
01E0 0FDF xcall _AT24C_delay
01E2 .dbline 175
01E2 ; return 1;
01E2 01E0 ldi R16,1
01E4 .dbline -2
01E4 L39:
01E4 .dbline 0 ; func end
01E4 0E940000 xcall pop_xgsetF0FC
01E8 2496 adiw R28,4
01EA 0895 ret
01EC .dbsym r ct 10 c
01EC .dbsym r ret 14 c
01EC .dbsym r i 22 c
01EC .dbsym r num 12 c
01EC .dbsym l addr 12 i
01EC .dbsym l buffer 10 pc
01EC .dbend
01EC ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -