📄 24c01.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 38E1 CPI R30,0x81
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E0067 CALL _main
_exit:
0066 CFFF RJMP _exit
_main:
w --> R12
r --> R22
y --> R10
x --> Y+2
b --> R14
a --> R20
i --> R4
0067 9724 SBIW R28,4
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_24C01\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009)
(0010) #include "config.h"
(0011)
(0012) unsigned char write_buff[64],read_buff[64];
(0013)
(0014) void main(void)
(0015) {
(0016) unsigned int i,a,b,x,y;
(0017) unsigned char *r,*w;
(0018) delay_nms(100);
0068 E604 LDI R16,0x64
0069 E010 LDI R17,0
006A 940E01E3 CALL _delay_nms
(0019) twi_init(); //初始化cpu
006C 940E00BF CALL _twi_init
(0020)
(0021) for(i=0;i<64;i++) read_buff[i]=write_buff[i]=0;//清主机读和写缓存区
006E 2444 CLR R4
006F 2455 CLR R5
0070 C010 RJMP 0x0081
0071 E480 LDI R24,0x40
0072 E091 LDI R25,1
0073 01F2 MOVW R30,R4
0074 0FE8 ADD R30,R24
0075 1FF9 ADC R31,R25
0076 2422 CLR R2
0077 8220 STD Z+0,R2
0078 E080 LDI R24,0
0079 E091 LDI R25,1
007A 01F2 MOVW R30,R4
007B 0FE8 ADD R30,R24
007C 1FF9 ADC R31,R25
007D 8220 STD Z+0,R2
007E 01C2 MOVW R24,R4
007F 9601 ADIW R24,1
0080 012C MOVW R4,R24
0081 01C2 MOVW R24,R4
0082 3480 CPI R24,0x40
0083 E0E0 LDI R30,0
0084 079E CPC R25,R30
0085 F358 BCS 0x0071
(0022) for(i=0;i<64;i++) write_buff[i]=i;//写缓存区赋初值
0086 2444 CLR R4
0087 2455 CLR R5
0088 C00A RJMP 0x0093
0089 E480 LDI R24,0x40
008A E091 LDI R25,1
008B 01F2 MOVW R30,R4
008C 0FE8 ADD R30,R24
008D 1FF9 ADC R31,R25
008E 2C24 MOV R2,R4
008F 8220 STD Z+0,R2
0090 01C2 MOVW R24,R4
0091 9601 ADIW R24,1
0092 012C MOVW R4,R24
0093 01C2 MOVW R24,R4
0094 3480 CPI R24,0x40
0095 E0E0 LDI R30,0
0096 079E CPC R25,R30
0097 F388 BCS 0x0089
(0023)
(0024) r=read_buff; //读参数
0098 E060 LDI R22,0
0099 E071 LDI R23,1
(0025) b=0x00;
009A 24EE CLR R14
009B 24FF CLR R15
(0026) a=64;
009C E440 LDI R20,0x40
009D E050 LDI R21,0
(0027)
(0028) w=write_buff; //写参数
009E E480 LDI R24,0x40
009F E091 LDI R25,1
00A0 016C MOVW R12,R24
(0029) x=0x00;
00A1 2400 CLR R0
00A2 2411 CLR R1
00A3 821B STD Y+3,R1
00A4 820A STD Y+2,R0
(0030) y=64;
00A5 E480 LDI R24,0x40
00A6 E090 LDI R25,0
00A7 015C MOVW R10,R24
(0031)
(0032) wt24c(w,x,y); //写
00A8 82B9 STD Y+1,R11
00A9 82A8 STD Y+0,R10
00AA 0190 MOVW R18,R0
00AB 0186 MOVW R16,R12
00AC 924F PUSH R4
00AD 925F PUSH R5
00AE 940E011F CALL _wt24c
00B0 905F POP R5
00B1 904F POP R4
(0033) rd24c(r,b,a); //读
00B2 8359 STD Y+1,R21
00B3 8348 STD Y+0,R20
00B4 0197 MOVW R18,R14
00B5 018B MOVW R16,R22
00B6 924F PUSH R4
00B7 925F PUSH R5
00B8 940E0197 CALL _rd24c
00BA 905F POP R5
00BB 904F POP R4
(0034)
(0035) while(1);
00BC CFFF RJMP 0x00BC
00BD 9624 ADIW R28,4
00BE 9508 RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_24C01\source\lib\TWI.c
(0001) /************************************************
(0002) 文件:TWI.c
(0003) 用途:TWI操作函数
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) /*************************************************************************
(0011) ** 函数名称: twi_init(void)
(0012) ** 功能描述: i2c通信初始化
(0013) ** 输 入:
(0014) ** 输出 :
(0015) ** 全局变量: 无
(0016) ** 调用模块:
(0017) ** 说明:
(0018) ** 注意:
(0019) **************************************************************************/
(0020) void twi_init(void)
(0021) {
(0022) TWCR= 0x00; //disable twi
_twi_init:
00BF 2422 CLR R2
00C0 92200074 STS 0x74,R2
(0023) TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
00C2 E684 LDI R24,0x64
00C3 93800070 STS 0x70,R24
(0024) TWSR= 0x00; //set prescale
00C5 92200071 STS 0x71,R2
(0025) TWAR= 0x00; //set slave address
00C7 92200072 STS 0x72,R2
(0026) TWCR= (1<<TWEN); //enable twi
00C9 E084 LDI R24,4
00CA 93800074 STS 0x74,R24
00CC 9508 RET
(0027) }
(0028) /*************************************************************************
(0029) ** 函数名称: i2cstart(void)
(0030) ** 功能描述: i2c通信开始
(0031) ** 输 入:
(0032) ** 输出 :
(0033) ** 全局变量: 无
(0034) ** 调用模块:
(0035) ** 说明:
(0036) ** 注意:
(0037) **************************************************************************/
(0038) void i2cstart(void)
(0039) {
(0040) TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
_i2cstart:
00CD EA84 LDI R24,0xA4
00CE 93800074 STS 0x74,R24
(0041) while (!(TWCR & (1<<TWINT)));
00D0 90200074 LDS R2,0x74
00D2 FE27 SBRS R2,7
00D3 CFFC RJMP 0x00D0
00D4 9508 RET
(0042) }
(0043) /*************************************************************************
(0044) ** 函数名称: unsigned char i2cwt(unsigned char data)
(0045) ** 功能描述: i2c写数据,返回TWI状态
(0046) ** 输 入:
(0047) ** 输 出: TWI状态
(0048) ** 全局变量: 无
(0049) ** 调用模块:
(0050) ** 说明:
(0051) ** 注意:
(0052) **************************************************************************/
(0053) unsigned char i2cwt(unsigned char data)
(0054) {
(0055) TWDR = data;
_i2cwt:
data --> R16
00D5 93000073 STS 0x73,R16
(0056) TWCR = (1<<TWINT) | (1<<TWEN);
00D7 E884 LDI R24,0x84
00D8 93800074 STS 0x74,R24
(0057) while (!(TWCR & (1<<TWINT)));
00DA 90200074 LDS R2,0x74
00DC FE27 SBRS R2,7
00DD CFFC RJMP 0x00DA
(0058) _NOP();
00DE 0000 NOP
(0059) return(TWSR&0b11111000);
00DF 91000071 LDS R16,0x71
00E1 7F08 ANDI R16,0xF8
00E2 9508 RET
(0060) }
(0061) /*************************************************************************
(0062) ** 函数名称: unsigned char i2crd(void)
(0063) ** 功能描述: i2c读数据
(0064) ** 输 入:
(0065) ** 输出 : 读取的数据
(0066) ** 全局变量: 无
(0067) ** 调用模块:
(0068) ** 说明:
(0069) ** 注意:
(0070) **************************************************************************/
(0071) unsigned char i2crd(void)
(0072) {
(0073) TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
_i2crd:
00E3 EC84 LDI R24,0xC4
00E4 93800074 STS 0x74,R24
(0074) while (!(TWCR & (1<<TWINT)));
00E6 90200074 LDS R2,0x74
00E8 FE27 SBRS R2,7
00E9 CFFC RJMP 0x00E6
(0075) return(TWDR);
00EA 91000073 LDS R16,0x73
00EC 9508 RET
(0076) }
(0077) /*************************************************************************
(0078) ** 函数名称: i2cstop(void)
(0079) ** 功能描述: i2c停止
(0080) ** 输 入:
(0081) ** 输出 :
(0082) ** 全局变量: 无
(0083) ** 调用模块:
(0084) ** 说明:
(0085) ** 注意:
(0086) **************************************************************************/
(0087) void i2cstop(void)
(0088) {
(0089) TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
_i2cstop:
00ED E984 LDI R24,0x94
00EE 93800074 STS 0x74,R24
00F0 9508 RET
_wt24c_fc:
t --> R12
n --> R22
ad --> R10
p --> R20
00F1 940E0232 CALL push_gset4
00F3 0159 MOVW R10,R18
00F4 01A8 MOVW R20,R16
00F5 8568 LDD R22,Y+8
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\TWI_24C01\source\lib\AT24C01.c
(0001) /************************************************
(0002) 文件:AT24C01.c
(0003) 用途:AT24C01操作函数
(0004) 注意:
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) unsigned char syserr;
(0011) /*************************************************************************
(0012) ** 函数名称: unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
(0013) ** 功能描述: 向24Cxx写入数据wt24c_h()所要调用的函数
(0014) ** 输 入:
(0015) ** 输出 : 返回写入n个字节后的主机内存指针
(0016) ** 全局变量: 无
(0017) ** 调用模块:
(0018) ** 说明:
(0019) ** 注意:
(0020) **************************************************************************/
(0021) unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
(0022) {
(0023) unsigned char t=0;
00F6 24CC CLR R12
(0024)
(0025) #if e2prom<32
(0026) t=ad>>8;
00F7 0165 MOVW R12,R10
00F8 2CCD MOV R12,R13
00F9 24DD CLR R13
(0027) t<<=1;
00FA 0CCC LSL R12
(0028) #endif
(0029)
(0030) i2cstart(); //发送起始信号
00FB 940E00CD CALL _i2cstart
(0031)
(0032) if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
00FD 2D0C MOV R16,R12
00FE 5600 SUBI R16,0x60
00FF 940E00D5 CALL _i2cwt
0101 3108 CPI R16,0x18
0102 F479 BNE 0x0112
(0033) {
(0034) #if e2prom>16
(0035) i2cwt(ad>>8); //ad_dst的高位到器件
(0036) #endif
(0037) i2cwt(ad); //ad_dst的低位到器件
0103 2D0A MOV R16,R10
0104 940E00D5 CALL _i2cwt
(0038)
(0039) for(;n>0;n--) //发送要写入的数据
0106 C007 RJMP 0x010E
(0040) {
(0041) i2cwt(*p);
0107 01FA MOVW R30,R20
0108 8100 LDD R16,Z+0
0109 940E00D5 CALL _i2cwt
(0042) p++;
010B 5F4F SUBI R20,0xFF
010C 4F5F SBCI R21,0xFF
010D 956A DEC R22
010E 2422 CLR R2
010F 1626 CP R2,R22
0110 F3B0 BCS 0x0107
(0043) }
(0044) }
0111 C003 RJMP 0x0115
(0045) else syserr=ERR_SLAW; //写字节命令及器件地址错
0112 E081 LDI R24,1
0113 93800180 STS syserr,R24
(0046)
(0047) i2cstop();
0115 940E00ED CALL _i2cstop
(0048) delay_nms(6); //延时6ms
0117 E006 LDI R16,6
0118 E010 LDI R17,0
0119 940E01E3 CALL _delay_nms
(0049)
(0050) return(p);
011B 018A MOVW R16,R20
011C 940E022A CALL pop_gset4
011E 9508 RET
_wt24c:
n --> R10
num --> R12
ad_dst --> R14
p_rsc --> Y+11
011F 940E01F2 CALL push_arg4
0121 940E0230 CALL push_gset5
0123 0179 MOVW R14,R18
0124 9721 SBIW R28,1
0125 84CF LDD R12,Y+15
0126 88D8 LDD R13,Y+16
(0051) }
(0052) /*************************************************************************
(0053) ** 函数名称:
(0054) ** 功能描述: 向24Cxx写入数据
(0055) ** 输 入: *p_rsc要输出数据的主机内存地址指针; ad_dst要写入数据的i2c的地址(双字节); num数据个数
(0056) ** 输出 :
(0057) ** 全局变量: 无
(0058) ** 调用模块:
(0059) ** 说明:ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必须>0;
(0060) ** 注意:
(0061) **************************************************************************/
(0062) void wt24c(unsigned char *p_rsc, unsigned int ad_dst, unsigned int num)
(0063) {
(0064) unsigned int n;
(0065)
(0066) n=ad_dst/PAGE_SIZE; //确定地址与块地址的差
0127 0157 MOVW R10,R14
0128 94B6 LSR R11
0129 94A7 ROR R10
012A 94B6 LSR R11
012B 94A7 ROR R10
012C 94B6 LSR R11
012D 94A7 ROR R10
(0067) if(n) n=(unsigned long)PAGE_SIZE*(n+1)-ad_dst;
012E 20AA TST R10
012F F411 BNE 0x0132
0130 20BB TST R11
0131 F0E1 BEQ 0x014E
0132 01C5 MOVW R24,R10
0133 9601 ADIW R24,1
0134 011C MOVW R2,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -