📄 24c01.lst
字号:
__text_start:
__start:
0065 EFCF LDI R28,0xFF
0066 E1D0 LDI R29,0x10
0067 BFCD OUT 0x3D,R28
0068 BFDE OUT 0x3E,R29
0069 51C0 SUBI R28,0x10
006A 40D0 SBCI R29,0
006B EA0A LDI R16,0xAA
006C 8308 STD Y+0,R16
006D 2400 CLR R0
006E E3ED LDI R30,0x3D
006F E0F1 LDI R31,1
0070 E012 LDI R17,2
0071 30EE CPI R30,0xE
0072 07F1 CPC R31,R17
0073 F011 BEQ 0x0076
0074 9201 ST R0,Z+
0075 CFFB RJMP 0x0071
0076 8300 STD Z+0,R16
0077 E8EC LDI R30,0x8C
0078 E0F0 LDI R31,0
0079 E0A0 LDI R26,0
007A E0B1 LDI R27,1
007B E010 LDI R17,0
007C 3CE9 CPI R30,0xC9
007D 07F1 CPC R31,R17
007E F021 BEQ 0x0083
007F 95C8 LPM
0080 9631 ADIW R30,1
0081 920D ST R0,X+
0082 CFF9 RJMP 0x007C
0083 940E0086 CALL _main
_exit:
0085 CFFF RJMP _exit
_main:
i --> R10
W_Buff --> R22
R_Buff --> R20
0086 9722 SBIW R28,2
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_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) void main(void)
(0013) {
(0014) unsigned char *W_Buff="www.avrvi.com",*R_Buff="0",i=0;
0087 E26F LDI R22,0x2F
0088 E071 LDI R23,1
0089 E24D LDI R20,0x2D
008A E051 LDI R21,1
008B 24AA CLR R10
(0015)
(0016) CLI();
008C 94F8 BCLR 7
(0017) Com_init();
008D 940E0205 CALL _Com_init
(0018) twi_init();
008F 940E00D2 CALL _twi_init
(0019) SEI();
0091 9478 BSET 7
(0020) Com_putstring ("24C01 Write: www.avrvi.com\n\n",28,&RTbuf_UART0);
0092 E38E LDI R24,0x3E
0093 E091 LDI R25,1
0094 8399 STD Y+1,R25
0095 8388 STD Y+0,R24
0096 E12C LDI R18,0x1C
0097 E100 LDI R16,0x10
0098 E011 LDI R17,1
0099 940E0257 CALL _Com_putstring
(0021) wt24c(W_Buff,0x00,13);
009B E08D LDI R24,0xD
009C E090 LDI R25,0
009D 8399 STD Y+1,R25
009E 8388 STD Y+0,R24
009F 2722 CLR R18
00A0 2733 CLR R19
00A1 018B MOVW R16,R22
00A2 940E0132 CALL _wt24c
(0022) delay_nms(500);
00A4 EF04 LDI R16,0xF4
00A5 E011 LDI R17,1
00A6 940E01F6 CALL _delay_nms
(0023) Com_putstring ("24C01 Read: ",12,&RTbuf_UART0);
00A8 E38E LDI R24,0x3E
00A9 E091 LDI R25,1
00AA 8399 STD Y+1,R25
00AB 8388 STD Y+0,R24
00AC E02C LDI R18,0xC
00AD E003 LDI R16,3
00AE E011 LDI R17,1
00AF 940E0257 CALL _Com_putstring
(0024) rd24c(R_Buff,0x00,13);
00B1 E08D LDI R24,0xD
00B2 E090 LDI R25,0
00B3 8399 STD Y+1,R25
00B4 8388 STD Y+0,R24
00B5 2722 CLR R18
00B6 2733 CLR R19
00B7 018A MOVW R16,R20
00B8 940E01AA CALL _rd24c
(0025) Com_putstring (R_Buff,13,&RTbuf_UART0);
00BA E38E LDI R24,0x3E
00BB E091 LDI R25,1
00BC 8399 STD Y+1,R25
00BD 8388 STD Y+0,R24
00BE E02D LDI R18,0xD
00BF 018A MOVW R16,R20
00C0 940E0257 CALL _Com_putstring
(0026) Com_putstring ("\n\n",2,&RTbuf_UART0);
00C2 E38E LDI R24,0x3E
00C3 E091 LDI R25,1
00C4 8399 STD Y+1,R25
00C5 8388 STD Y+0,R24
00C6 E022 LDI R18,2
00C7 E000 LDI R16,0
00C8 E011 LDI R17,1
00C9 940E0257 CALL _Com_putstring
(0027) delay_nms(500);
00CB EF04 LDI R16,0xF4
00CC E011 LDI R17,1
00CD 940E01F6 CALL _delay_nms
(0028) while(1)
00CF CFFF RJMP 0x00CF
00D0 9622 ADIW R28,2
00D1 9508 RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_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:
00D2 2422 CLR R2
00D3 92200074 STS 0x74,R2
(0023) TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
00D5 E684 LDI R24,0x64
00D6 93800070 STS 0x70,R24
(0024) TWSR= 0x00; //set prescale
00D8 92200071 STS 0x71,R2
(0025) TWAR= 0x00; //set slave address
00DA 92200072 STS 0x72,R2
(0026) TWCR= (1<<TWEN); //enable twi
00DC E084 LDI R24,4
00DD 93800074 STS 0x74,R24
00DF 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:
00E0 EA84 LDI R24,0xA4
00E1 93800074 STS 0x74,R24
(0041) while (!(TWCR & (1<<TWINT)));
00E3 90200074 LDS R2,0x74
00E5 FE27 SBRS R2,7
00E6 CFFC RJMP 0x00E3
00E7 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
00E8 93000073 STS 0x73,R16
(0056) TWCR = (1<<TWINT) | (1<<TWEN);
00EA E884 LDI R24,0x84
00EB 93800074 STS 0x74,R24
(0057) while (!(TWCR & (1<<TWINT)));
00ED 90200074 LDS R2,0x74
00EF FE27 SBRS R2,7
00F0 CFFC RJMP 0x00ED
(0058) _NOP();
00F1 0000 NOP
(0059) return(TWSR&0b11111000);
00F2 91000071 LDS R16,0x71
00F4 7F08 ANDI R16,0xF8
00F5 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:
00F6 EC84 LDI R24,0xC4
00F7 93800074 STS 0x74,R24
(0074) while (!(TWCR & (1<<TWINT)));
00F9 90200074 LDS R2,0x74
00FB FE27 SBRS R2,7
00FC CFFC RJMP 0x00F9
(0075) return(TWDR);
00FD 91000073 LDS R16,0x73
00FF 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:
0100 E984 LDI R24,0x94
0101 93800074 STS 0x74,R24
0103 9508 RET
_wt24c_fc:
t --> R12
n --> R22
ad --> R10
p --> R20
0104 940E04AA CALL push_gset4
0106 0159 MOVW R10,R18
0107 01A8 MOVW R20,R16
0108 8568 LDD R22,Y+8
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\USART_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;
0109 24CC CLR R12
(0024)
(0025) #if e2prom<32
(0026) t=ad>>8;
010A 0165 MOVW R12,R10
010B 2CCD MOV R12,R13
010C 24DD CLR R13
(0027) t<<=1;
010D 0CCC LSL R12
(0028) #endif
(0029)
(0030) i2cstart(); //发送起始信号
010E 940E00E0 CALL _i2cstart
(0031)
(0032) if(i2cwt(W_ADD_COM+t)==SLAW)//发送SLA_W, 写字节命令及器件地址
0110 2D0C MOV R16,R12
0111 5600 SUBI R16,0x60
0112 940E00E8 CALL _i2cwt
0114 3108 CPI R16,0x18
0115 F479 BNE 0x0125
(0033) {
(0034) #if e2prom>16
(0035) i2cwt(ad>>8); //ad_dst的高位到器件
(0036) #endif
(0037) i2cwt(ad); //ad_dst的低位到器件
0116 2D0A MOV R16,R10
0117 940E00E8 CALL _i2cwt
(0038)
(0039) for(;n>0;n--) //发送要写入的数据
0119 C007 RJMP 0x0121
(0040) {
(0041) i2cwt(*p);
011A 01FA MOVW R30,R20
011B 8100 LDD R16,Z+0
011C 940E00E8 CALL _i2cwt
(0042) p++;
011E 5F4F SUBI R20,0xFF
011F 4F5F SBCI R21,0xFF
0120 956A DEC R22
0121 2422 CLR R2
0122 1626 CP R2,R22
0123 F3B0 BCS 0x011A
(0043) }
(0044) }
0124 C003 RJMP 0x0128
(0045) else syserr=ERR_SLAW; //写字节命令及器件地址错
0125 E081 LDI R24,1
0126 9380013D STS syserr,R24
(0046)
(0047) i2cstop();
0128 940E0100 CALL _i2cstop
(0048) delay_nms(6); //延时6ms
012A E006 LDI R16,6
012B E010 LDI R17,0
012C 940E01F6 CALL _delay_nms
(0049)
(0050) return(p);
012E 018A MOVW R16,R20
012F 940E04A2 CALL pop_gset4
0131 9508 RET
_wt24c:
n --> R10
num --> R12
ad_dst --> R14
p_rsc --> Y+11
0132 940E03DE CALL push_arg4
0134 940E04A8 CALL push_gset5
0136 0179 MOVW R14,R18
0137 9721 SBIW R28,1
0138 84CF LDD R12,Y+15
0139 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -