📄 twi_slaver.lst
字号:
__start:
__text_start:
002E E5CF LDI R28,0x5F
002F E0D4 LDI R29,4
0030 BFCD OUT 0x3D,R28
0031 BFDE OUT 0x3E,R29
0032 51C0 SUBI R28,0x10
0033 40D0 SBCI R29,0
0034 EA0A LDI R16,0xAA
0035 8308 STD Y+0,R16
0036 2400 CLR R0
0037 E6E0 LDI R30,0x60
0038 E0F0 LDI R31,0
0039 E010 LDI R17,0
003A 36E0 CPI R30,0x60
003B 07F1 CPC R31,R17
003C F011 BEQ 0x003F
003D 9201 ST R0,Z+
003E CFFB RJMP 0x003A
003F 8300 STD Z+0,R16
0040 E5EC LDI R30,0x5C
0041 E0F0 LDI R31,0
0042 E6A0 LDI R26,0x60
0043 E0B0 LDI R27,0
0044 E010 LDI R17,0
0045 35EC CPI R30,0x5C
0046 07F1 CPC R31,R17
0047 F021 BEQ 0x004C
0048 95C8 LPM
0049 9631 ADIW R30,1
004A 920D ST R0,X+
004B CFF9 RJMP 0x0045
004C 940E0116 CALL _main
_exit:
004E CFFF RJMP _exit
FILE: E:\atmega16子函数\TWI_slaver0\delay.c
(0001) #include <iom16v.h>
(0002)
(0003)
(0004) void Delay_nus(unsigned int i)
(0005) {
(0006) for(;i>1;i--){;}
_Delay_nus:
i --> R16
004F C002 RJMP 0x0052
0050 5001 SUBI R16,1
0051 4010 SBCI R17,0
0052 E081 LDI R24,1
0053 E090 LDI R25,0
0054 1780 CP R24,R16
0055 0791 CPC R25,R17
0056 F3C8 BCS 0x0050
(0007) }
0057 9508 RET
_Delay_1ms:
i --> R20
0058 940E01DA CALL push_gset1
(0008) void Delay_1ms(void)
(0009) {unsigned i;
(0010) for(i=1000;i>1;i--)
005A EE48 LDI R20,0xE8
005B E053 LDI R21,3
005C C005 RJMP 0x0062
(0011) {Delay_nus(1);
005D E001 LDI R16,1
005E E010 LDI R17,0
005F DFEF RCALL _Delay_nus
0060 5041 SUBI R20,1
0061 4050 SBCI R21,0
0062 E081 LDI R24,1
0063 E090 LDI R25,0
0064 1784 CP R24,R20
0065 0795 CPC R25,R21
0066 F3B0 BCS 0x005D
(0012) }
(0013) }
0067 940E01DD CALL pop_gset1
0069 9508 RET
_Delay_nms:
i --> R20
006A 940E01DA CALL push_gset1
006C 01A8 MOVW R20,R16
(0014) void Delay_nms(unsigned int i)
(0015) {
(0016) for(;i>1;i--)
006D C003 RJMP 0x0071
(0017) {Delay_1ms();}
006E DFE9 RCALL _Delay_1ms
006F 5041 SUBI R20,1
0070 4050 SBCI R21,0
0071 E081 LDI R24,1
0072 E090 LDI R25,0
0073 1784 CP R24,R20
0074 0795 CPC R25,R21
0075 F3C0 BCS 0x006E
(0018) }
0076 940E01DD CALL pop_gset1
0078 9508 RET
FILE: E:\atmega16子函数\TWI_slaver0\main.c
(0001) /*
(0002) TWI 从机的查询和中断接收
(0003) ICCAVR6.31A
(0004) */
(0005) #include"iom16v.h"
(0006) #include"UART.h"
(0007) #include"delay.h"
(0008) #define uchar unsigned char
(0009) #define STATUS (TWSR&0xf8)
(0010) #define SLA_W 0x32
(0011) #define SLA_R 0x33
(0012) #define TWI_ADDRESS 0x32
(0013) #define START 0x08
(0014) #define RE_START 0x10
(0015) #define MT_SLA_WRITE_ACK 0x18
(0016) #define MT_SLA_READ_ACK 0x40
(0017) #define MT_DATA_ACK 0x28
(0018) #define MT_READ_ACK 0x58
(0019) #define TW_SR_DATA_ACK 0x80
(0020)
(0021) void Start(void)
(0022) {
(0023) TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
0079 EA84 LDI R24,0xA4
007A BF86 OUT 0x36,R24
(0024) while(!(TWCR&(1<<TWINT)));
007B B626 IN R2,0x36
007C FE27 SBRS R2,7
007D CFFD RJMP 0x007B
(0025) }
007E 9508 RET
(0026) void Stop(void)
(0027) {
(0028) TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
007F E984 LDI R24,0x94
0080 BF86 OUT 0x36,R24
(0029) }
0081 9508 RET
(0030) void Load(uchar i)
(0031) {
(0032) TWDR=i;
_Load:
i --> R16
0082 B903 OUT 0x03,R16
(0033) TWCR=(1<<TWINT)|(1<<TWEN);
0083 E884 LDI R24,0x84
0084 BF86 OUT 0x36,R24
(0034) while(!(TWCR&(1<<TWINT)));
0085 B626 IN R2,0x36
0086 FE27 SBRS R2,7
0087 CFFD RJMP 0x0085
(0035)
(0036) }
0088 9508 RET
(0037)
(0038) void Get(unsigned char *d)
(0039) {
(0040) TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
d --> R16
0089 E884 LDI R24,0x84
008A BF86 OUT 0x36,R24
(0041) while(!(TWCR&(1<<TWINT)));
008B B626 IN R2,0x36
008C FE27 SBRS R2,7
008D CFFD RJMP 0x008B
(0042) *d= TWDR;
008E B023 IN R2,0x03
008F 01F8 MOVW R30,R16
0090 8220 STD Z+0,R2
(0043) }/**/
0091 9508 RET
_ERROR:
state --> R20
0092 940E01DA CALL push_gset1
0094 2F40 MOV R20,R16
(0044) void ERROR(uchar state)
(0045) {Stop();
0095 DFE9 RCALL _Stop
(0046) }
0096 940E01DD CALL pop_gset1
0098 9508 RET
_WriteByte:
data --> R20
0099 940E01DA CALL push_gset1
009B 2F40 MOV R20,R16
(0047)
(0048) /*写一个字节data,成功则返回1,否则
(0049) 返回0*/
(0050) uchar WriteByte(uchar data)
(0051) {
(0052) //启动I2C
(0053) Start();
009C DFDC RCALL _Start
(0054) if(STATUS!=START) {ERROR(STATUS);return 0;}
009D B181 IN R24,0x01
009E 7F88 ANDI R24,0xF8
009F 3088 CPI R24,0x8
00A0 F029 BEQ 0x00A6
00A1 B101 IN R16,0x01
00A2 7F08 ANDI R16,0xF8
00A3 DFEE RCALL _ERROR
00A4 2700 CLR R16
00A5 C018 RJMP 0x00BE
(0055)
(0056) //发送从机地址(写),等待回应, 错误检测
(0057) Load(SLA_W);
00A6 E302 LDI R16,0x32
00A7 DFDA RCALL _Load
(0058) if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
00A8 B181 IN R24,0x01
00A9 7F88 ANDI R24,0xF8
00AA 3188 CPI R24,0x18
00AB F029 BEQ 0x00B1
00AC B101 IN R16,0x01
00AD 7F08 ANDI R16,0xF8
00AE DFE3 RCALL _ERROR
00AF 2700 CLR R16
00B0 C00D RJMP 0x00BE
(0059) /*
(0060) //发送EEPROM地址,等待回应,错误检测
(0061) Load(addr);
(0062) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0063) */
(0064) //发送数据,等待回应,错误检测
(0065) Load(data);
00B1 2F04 MOV R16,R20
00B2 DFCF RCALL _Load
(0066) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
00B3 B181 IN R24,0x01
00B4 7F88 ANDI R24,0xF8
00B5 3288 CPI R24,0x28
00B6 F029 BEQ 0x00BC
00B7 B101 IN R16,0x01
00B8 7F08 ANDI R16,0xF8
00B9 DFD8 RCALL _ERROR
00BA 2700 CLR R16
00BB C002 RJMP 0x00BE
(0067)
(0068) Stop();
00BC DFC2 RCALL _Stop
(0069) return 1;//发送成功,返回1;
00BD E001 LDI R16,1
00BE 940E01DD CALL pop_gset1
00C0 9508 RET
_ReadByte:
p_data --> R20
addr --> R22
00C1 940E01F1 CALL push_gset2
00C3 01A9 MOVW R20,R18
00C4 2F60 MOV R22,R16
(0070)
(0071)
(0072)
(0073) }
(0074)
(0075) unsigned char ReadByte(unsigned char addr,
(0076) unsigned char *p_data)
(0077) {
(0078) //启动I2C
(0079) Start();
00C5 DFB3 RCALL _Start
(0080) if(STATUS!=START) {ERROR(STATUS);return 0;}
00C6 B181 IN R24,0x01
00C7 7F88 ANDI R24,0xF8
00C8 3088 CPI R24,0x8
00C9 F029 BEQ 0x00CF
00CA B101 IN R16,0x01
00CB 7F08 ANDI R16,0xF8
00CC DFC5 RCALL _ERROR
00CD 2700 CLR R16
00CE C038 RJMP 0x0107
(0081)
(0082) //发送从机地址(写),等待回应, 错误检测
(0083) Load(SLA_W);
00CF E302 LDI R16,0x32
00D0 DFB1 RCALL _Load
(0084) if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
00D1 B181 IN R24,0x01
00D2 7F88 ANDI R24,0xF8
00D3 3188 CPI R24,0x18
00D4 F029 BEQ 0x00DA
00D5 B101 IN R16,0x01
00D6 7F08 ANDI R16,0xF8
00D7 DFBA RCALL _ERROR
00D8 2700 CLR R16
00D9 C02D RJMP 0x0107
(0085)
(0086) //发送EEPROM地址,等待回应,错误检测
(0087) Load(addr);
00DA 2F06 MOV R16,R22
00DB DFA6 RCALL _Load
(0088) if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
00DC B181 IN R24,0x01
00DD 7F88 ANDI R24,0xF8
00DE 3288 CPI R24,0x28
00DF F029 BEQ 0x00E5
00E0 B101 IN R16,0x01
00E1 7F08 ANDI R16,0xF8
00E2 DFAF RCALL _ERROR
00E3 2700 CLR R16
00E4 C022 RJMP 0x0107
(0089)
(0090) //再次启动I2C
(0091) Start();
00E5 DF93 RCALL _Start
(0092) if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
00E6 B181 IN R24,0x01
00E7 7F88 ANDI R24,0xF8
00E8 3180 CPI R24,0x10
00E9 F029 BEQ 0x00EF
00EA B101 IN R16,0x01
00EB 7F08 ANDI R16,0xF8
00EC DFA5 RCALL _ERROR
00ED 2700 CLR R16
00EE C018 RJMP 0x0107
(0093)
(0094) //发送从机地址(读),等待回应, 错误检测
(0095) Load(SLA_R);
00EF E303 LDI R16,0x33
00F0 DF91 RCALL _Load
(0096) if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
00F1 B181 IN R24,0x01
00F2 7F88 ANDI R24,0xF8
00F3 3480 CPI R24,0x40
00F4 F029 BEQ 0x00FA
00F5 B101 IN R16,0x01
00F6 7F08 ANDI R16,0xF8
00F7 DF9A RCALL _ERROR
00F8 2700 CLR R16
00F9 C00D RJMP 0x0107
(0097)
(0098) //读取I2C数据
(0099) Get(p_data);
00FA 018A MOVW R16,R20
00FB DF8D RCALL _Get
(0100) if(STATUS!=MT_READ_ACK) {ERROR(STATUS);return 0;}
00FC B181 IN R24,0x01
00FD 7F88 ANDI R24,0xF8
00FE 3588 CPI R24,0x58
00FF F029 BEQ 0x0105
0100 B101 IN R16,0x01
0101 7F08 ANDI R16,0xF8
0102 DF8F RCALL _ERROR
0103 2700 CLR R16
0104 C002 RJMP 0x0107
(0101)
(0102) //发送Stop,结束读I2C操作。
(0103) Stop();
0105 DF79 RCALL _Stop
(0104) return 1;
0106 E001 LDI R16,1
0107 940E01D7 CALL pop_gset2
0109 9508 RET
(0105)
(0106)
(0107)
(0108) }/**/
(0109) void Init_Io(void)
(0110) {
(0111) DDRC&=~((1<<PC0)&(1<<PC0)&(1<<PC2));
_Init_Io:
010A B384 IN R24,0x14
010B 7F8F ANDI R24,0xFF
010C BB84 OUT 0x14,R24
(0112) PORTC|= (1<<PC0)|(1<<PC0)|(1<<PC2);
010D B385 IN R24,0x15
010E 6085 ORI R24,5
010F BB85 OUT 0x15,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -