📄 slaver_1.lis
字号:
.module slaver_1.c
.area data(ram, con, rel)
0000 _Date::
0000 .blkb 2
.area idata
0000 0000 .byte 0,0
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 0000 .byte 0,0
.area data(ram, con, rel)
0004 .dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
0004 .dbsym e Date _Date A[4:4]c
.area text(rom, con, rel)
0000 .dbfile D:\AVR\代码\ICCdaima\TWI/UART.h
0000 .dbfile D:\AVR\代码\ICCdaima\TWI\slaver_1.c
0000 .dbfunc e Start _Start fV
.even
0000 _Start::
0000 .dbline -1
0000 .dbline 22
0000 ; /* 段传辉 2008 1.21
0000 ; TWI 从机的查询和中断接收 依靠广播0X00地址
0000 ; ICCAVR6.31A chuanhuibh@sina.com
0000 ; */
0000 ; #include"iom8v.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 00D0 rcall push_gset1
0034 402F mov R20,R16
0036 .dbline -1
0036 .dbline 45
0036 ; void ERROR(uchar state)
0036 ; {Stop();
0036 .dbline 45
0036 EADF rcall _Stop
0038 .dbline -2
0038 .dbline 46
0038 ; }
0038 L14:
0038 00D0 rcall pop_gset1
003A .dbline 0 ; func end
003A 0895 ret
003C .dbsym r state 20 c
003C .dbend
003C .dbfunc e WriteByte _WriteByte fc
003C ; data -> R20
.even
003C _WriteByte::
003C 00D0 rcall push_gset1
003E 402F mov R20,R16
0040 .dbline -1
0040 .dbline 51
0040 ;
0040 ; /*写一个字节data,成功则返回1,否则
0040 ; 返回0*/
0040 ; uchar WriteByte(uchar data)
0040 ; {
0040 .dbline 53
0040 ; //启动I2C
0040 ; Start();
0040 DFDF rcall _Start
0042 .dbline 54
0042 ; if(STATUS!=START) {ERROR(STATUS);return 0;}
0042 81B1 in R24,0x1
0044 887F andi R24,248
0046 8830 cpi R24,8
0048 29F0 breq L16
004A .dbline 54
004A .dbline 54
004A 01B1 in R16,0x1
004C 087F andi R16,248
004E F1DF rcall _ERROR
0050 .dbline 54
0050 0027 clr R16
0052 18C0 rjmp L15
0054 L16:
0054 .dbline 57
0054 ;
0054 ; //发送从机地址(写),等待回应, 错误检测
0054 ; Load(SLA_W);
0054 02E3 ldi R16,50
0056 DDDF rcall _Load
0058 .dbline 58
0058 ; if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
0058 81B1 in R24,0x1
005A 887F andi R24,248
005C 8831 cpi R24,24
005E 29F0 breq L18
0060 .dbline 58
0060 .dbline 58
0060 01B1 in R16,0x1
0062 087F andi R16,248
0064 E6DF rcall _ERROR
0066 .dbline 58
0066 0027 clr R16
0068 0DC0 rjmp L15
006A L18:
006A .dbline 65
006A ; /*
006A ; //发送EEPROM地址,等待回应,错误检测
006A ; Load(addr);
006A ; if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
006A ; */
006A ; //发送数据,等待回应,错误检测
006A ; Load(data);
006A 042F mov R16,R20
006C D2DF rcall _Load
006E .dbline 66
006E ; if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
006E 81B1 in R24,0x1
0070 887F andi R24,248
0072 8832 cpi R24,40
0074 29F0 breq L20
0076 .dbline 66
0076 .dbline 66
0076 01B1 in R16,0x1
0078 087F andi R16,248
007A DBDF rcall _ERROR
007C .dbline 66
007C 0027 clr R16
007E 02C0 rjmp L15
0080 L20:
0080 .dbline 68
0080 ;
0080 ; Stop();
0080 C5DF rcall _Stop
0082 .dbline 69
0082 ; return 1;//发送成功,返回1;
0082 01E0 ldi R16,1
0084 .dbline -2
0084 L15:
0084 00D0 rcall pop_gset1
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r data 20 c
0088 .dbend
0088 .dbfunc e ReadByte _ReadByte fc
0088 ; p_data -> R20,R21
0088 ; addr -> R22
.even
0088 _ReadByte::
0088 00D0 rcall push_gset2
008A A901 movw R20,R18
008C 602F mov R22,R16
008E .dbline -1
008E .dbline 77
008E ;
008E ;
008E ;
008E ; }
008E ;
008E ; unsigned char ReadByte(unsigned char addr,
008E ; unsigned char *p_data)
008E ; {
008E .dbline 79
008E ; //启动I2C
008E ; Start();
008E B8DF rcall _Start
0090 .dbline 80
0090 ; if(STATUS!=START) {ERROR(STATUS);return 0;}
0090 81B1 in R24,0x1
0092 887F andi R24,248
0094 8830 cpi R24,8
0096 29F0 breq L23
0098 .dbline 80
0098 .dbline 80
0098 01B1 in R16,0x1
009A 087F andi R16,248
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -