📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\atmega16子函数\TWI_slaver0\main.c
0000 .dbfunc e Start _Start fV
.even
0000 _Start::
0000 .dbline -1
0000 .dbline 22
0000 ; /*
0000 ; TWI 从机的查询和中断接收
0000 ; ICCAVR6.31A
0000 ; */
0000 ; #include"iom16v.h"
0000 ; #include"UART.h"
0000 ; #include"delay.h"
0000 ; #define uchar unsigned char
0000 ; #define STATUS (TWSR&0xf8)
0000 ; #define SLA_W 0x32
0000 ; #define SLA_R 0x33
0000 ; #define TWI_ADDRESS 0x32
0000 ; #define START 0x08
0000 ; #define RE_START 0x10
0000 ; #define MT_SLA_WRITE_ACK 0x18
0000 ; #define MT_SLA_READ_ACK 0x40
0000 ; #define MT_DATA_ACK 0x28
0000 ; #define MT_READ_ACK 0x58
0000 ; #define TW_SR_DATA_ACK 0x80
0000 ;
0000 ; void Start(void)
0000 ; {
0000 .dbline 23
0000 ; TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
0000 84EA ldi R24,164
0002 86BF out 0x36,R24
0004 L2:
0004 .dbline 24
0004 L3:
0004 .dbline 24
0004 ; while(!(TWCR&(1<<TWINT)));
0004 26B6 in R2,0x36
0006 27FE sbrs R2,7
0008 FDCF rjmp L2
000A .dbline -2
000A .dbline 25
000A ; }
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbend
000C .dbfunc e Stop _Stop fV
.even
000C _Stop::
000C .dbline -1
000C .dbline 27
000C ; void Stop(void)
000C ; {
000C .dbline 28
000C ; TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
000C 84E9 ldi R24,148
000E 86BF out 0x36,R24
0010 .dbline -2
0010 .dbline 29
0010 ; }
0010 L5:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbend
0012 .dbfunc e Load _Load fV
0012 ; i -> R16
.even
0012 _Load::
0012 .dbline -1
0012 .dbline 31
0012 ; void Load(uchar i)
0012 ; {
0012 .dbline 32
0012 ; TWDR=i;
0012 03B9 out 0x3,R16
0014 .dbline 33
0014 ; TWCR=(1<<TWINT)|(1<<TWEN);
0014 84E8 ldi R24,132
0016 86BF out 0x36,R24
0018 L7:
0018 .dbline 34
0018 L8:
0018 .dbline 34
0018 ; while(!(TWCR&(1<<TWINT)));
0018 26B6 in R2,0x36
001A 27FE sbrs R2,7
001C FDCF rjmp L7
001E .dbline -2
001E .dbline 36
001E ;
001E ; }
001E L6:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbsym r i 16 c
0020 .dbend
0020 .dbfunc e Get _Get fV
0020 ; d -> R16,R17
.even
0020 _Get::
0020 .dbline -1
0020 .dbline 39
0020 ;
0020 ; void Get(unsigned char *d)
0020 ; {
0020 .dbline 40
0020 ; TWCR=(1<<TWINT)|(1<<TWEN);
0020 84E8 ldi R24,132
0022 86BF out 0x36,R24
0024 L11:
0024 .dbline 41
0024 L12:
0024 .dbline 41
0024 ; while(!(TWCR&(1<<TWINT)));
0024 26B6 in R2,0x36
0026 27FE sbrs R2,7
0028 FDCF rjmp L11
002A .dbline 42
002A ; *d= TWDR;
002A 23B0 in R2,0x3
002C F801 movw R30,R16
002E 2082 std z+0,R2
0030 .dbline -2
0030 .dbline 43
0030 ; }/**/
0030 L10:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r d 16 pc
0032 .dbend
0032 .dbfunc e ERROR _ERROR fV
0032 ; state -> R20
.even
0032 _ERROR::
0032 0E940000 xcall push_gset1
0036 402F mov R20,R16
0038 .dbline -1
0038 .dbline 45
0038 ; void ERROR(uchar state)
0038 ; {Stop();
0038 .dbline 45
0038 E9DF xcall _Stop
003A .dbline -2
003A .dbline 46
003A ; }
003A L14:
003A 0E940000 xcall pop_gset1
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbsym r state 20 c
0040 .dbend
0040 .dbfunc e WriteByte _WriteByte fc
0040 ; data -> R20
.even
0040 _WriteByte::
0040 0E940000 xcall push_gset1
0044 402F mov R20,R16
0046 .dbline -1
0046 .dbline 51
0046 ;
0046 ; /*写一个字节data,成功则返回1,否则
0046 ; 返回0*/
0046 ; uchar WriteByte(uchar data)
0046 ; {
0046 .dbline 53
0046 ; //启动I2C
0046 ; Start();
0046 DCDF xcall _Start
0048 .dbline 54
0048 ; if(STATUS!=START) {ERROR(STATUS);return 0;}
0048 81B1 in R24,0x1
004A 887F andi R24,248
004C 8830 cpi R24,8
004E 29F0 breq L16
0050 .dbline 54
0050 .dbline 54
0050 01B1 in R16,0x1
0052 087F andi R16,248
0054 EEDF xcall _ERROR
0056 .dbline 54
0056 0027 clr R16
0058 18C0 xjmp L15
005A L16:
005A .dbline 57
005A ;
005A ; //发送从机地址(写),等待回应, 错误检测
005A ; Load(SLA_W);
005A 02E3 ldi R16,50
005C DADF xcall _Load
005E .dbline 58
005E ; if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
005E 81B1 in R24,0x1
0060 887F andi R24,248
0062 8831 cpi R24,24
0064 29F0 breq L18
0066 .dbline 58
0066 .dbline 58
0066 01B1 in R16,0x1
0068 087F andi R16,248
006A E3DF xcall _ERROR
006C .dbline 58
006C 0027 clr R16
006E 0DC0 xjmp L15
0070 L18:
0070 .dbline 65
0070 ; /*
0070 ; //发送EEPROM地址,等待回应,错误检测
0070 ; Load(addr);
0070 ; if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
0070 ; */
0070 ; //发送数据,等待回应,错误检测
0070 ; Load(data);
0070 042F mov R16,R20
0072 CFDF xcall _Load
0074 .dbline 66
0074 ; if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
0074 81B1 in R24,0x1
0076 887F andi R24,248
0078 8832 cpi R24,40
007A 29F0 breq L20
007C .dbline 66
007C .dbline 66
007C 01B1 in R16,0x1
007E 087F andi R16,248
0080 D8DF xcall _ERROR
0082 .dbline 66
0082 0027 clr R16
0084 02C0 xjmp L15
0086 L20:
0086 .dbline 68
0086 ;
0086 ; Stop();
0086 C2DF xcall _Stop
0088 .dbline 69
0088 ; return 1;//发送成功,返回1;
0088 01E0 ldi R16,1
008A .dbline -2
008A L15:
008A 0E940000 xcall pop_gset1
008E .dbline 0 ; func end
008E 0895 ret
0090 .dbsym r data 20 c
0090 .dbend
0090 .dbfunc e ReadByte _ReadByte fc
0090 ; p_data -> R20,R21
0090 ; addr -> R22
.even
0090 _ReadByte::
0090 0E940000 xcall push_gset2
0094 A901 movw R20,R18
0096 602F mov R22,R16
0098 .dbline -1
0098 .dbline 77
0098 ;
0098 ;
0098 ;
0098 ; }
0098 ;
0098 ; unsigned char ReadByte(unsigned char addr,
0098 ; unsigned char *p_data)
0098 ; {
0098 .dbline 79
0098 ; //启动I2C
0098 ; Start();
0098 B3DF xcall _Start
009A .dbline 80
009A ; if(STATUS!=START) {ERROR(STATUS);return 0;}
009A 81B1 in R24,0x1
009C 887F andi R24,248
009E 8830 cpi R24,8
00A0 29F0 breq L23
00A2 .dbline 80
00A2 .dbline 80
00A2 01B1 in R16,0x1
00A4 087F andi R16,248
00A6 C5DF xcall _ERROR
00A8 .dbline 80
00A8 0027 clr R16
00AA 38C0 xjmp L22
00AC L23:
00AC .dbline 83
00AC ;
00AC ; //发送从机地址(写),等待回应, 错误检测
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -