📄 twi_slaver.lst
字号:
__text_start:
__start:
0024 E5CF LDI R28,0x5F
0025 E0D4 LDI R29,4
0026 BFCD OUT 0x3D,R28
0027 BFDE OUT 0x3E,R29
0028 51C0 SUBI R28,0x10
0029 40D0 SBCI R29,0
002A EA0A LDI R16,0xAA
002B 8308 STD Y+0,R16
002C 2400 CLR R0
002D E7E9 LDI R30,0x79
002E E0F0 LDI R31,0
002F E010 LDI R17,0
0030 37E9 CPI R30,0x79
0031 07F1 CPC R31,R17
0032 F011 BEQ 0x0035
0033 9201 ST R0,Z+
0034 CFFB RJMP 0x0030
0035 8300 STD Z+0,R16
0036 E2EE LDI R30,0x2E
0037 E0F0 LDI R31,0
0038 E6A0 LDI R26,0x60
0039 E0B0 LDI R27,0
003A E010 LDI R17,0
003B 34E7 CPI R30,0x47
003C 07F1 CPC R31,R17
003D F021 BEQ 0x0042
003E 95C8 LPM
003F 9631 ADIW R30,1
0040 920D ST R0,X+
0041 CFF9 RJMP 0x003B
0042 D123 RCALL _main
_exit:
0043 CFFF RJMP _exit
FILE: D:\AVR\代码\ICCdaima\TWI\delay.c
(0001)
(0002)
(0003) void Delay_nus(unsigned int i)
(0004) {
(0005) for(;i>1;i--){;}
_Delay_nus:
i --> R16
0044 C002 RJMP 0x0047
0045 5001 SUBI R16,1
0046 4010 SBCI R17,0
0047 E081 LDI R24,1
0048 E090 LDI R25,0
0049 1780 CP R24,R16
004A 0791 CPC R25,R17
004B F3C8 BCS 0x0045
(0006) }
004C 9508 RET
_Delay_1ms:
i --> R20
004D D14E RCALL push_gset1
(0007) void Delay_1ms(void)
(0008) {unsigned i;
(0009) for(i=1000;i>1;i--)
004E EE48 LDI R20,0xE8
004F E053 LDI R21,3
0050 C005 RJMP 0x0056
(0010) {Delay_nus(1);
0051 E001 LDI R16,1
0052 E010 LDI R17,0
0053 DFF0 RCALL _Delay_nus
0054 5041 SUBI R20,1
0055 4050 SBCI R21,0
0056 D1AB RCALL 0x0202
0057 F3C8 BCS 0x0051
(0011) }
(0012) }
0058 D146 RCALL pop_gset1
0059 9508 RET
_Delay_nms:
i --> R20
005A D141 RCALL push_gset1
005B 01A8 MOVW R20,R16
(0013) void Delay_nms(unsigned int i)
(0014) {
(0015) for(;i>1;i--)
005C C003 RJMP 0x0060
(0016) {Delay_1ms();}
005D DFEF RCALL _Delay_1ms
005E 5041 SUBI R20,1
005F 4050 SBCI R21,0
0060 D1A1 RCALL 0x0202
0061 F3D8 BCS 0x005D
(0017) }
0062 D13C RCALL pop_gset1
0063 9508 RET
_put:
d --> Y+0
i --> R20
0064 D137 RCALL push_gset1
0065 01A8 MOVW R20,R16
0066 9728 SBIW R28,0x8
FILE: D:\AVR\代码\ICCdaima\TWI\UART.c
(0001) #include <iom8v.h>
(0002) #include<macros.h>
(0003)
(0004) void put(unsigned int i)
(0005) {
(0006) char d[8]={0};
0067 E286 LDI R24,0x26
0068 E090 LDI R25,0
0069 01FE MOVW R30,R28
006A E008 LDI R16,0x8
006B E010 LDI R17,0
006C 93FA ST R31,-Y
006D 93EA ST R30,-Y
006E 939A ST R25,-Y
006F 938A ST R24,-Y
0070 D173 RCALL asgncblk
(0007) Int_to_Char(i,d);
0071 019E MOVW R18,R28
0072 018A MOVW R16,R20
0073 D005 RCALL _Int_to_Char
(0008) puts(d);
0074 018E MOVW R16,R28
0075 D039 RCALL _puts
(0009) }
0076 9628 ADIW R28,0x8
0077 D127 RCALL pop_gset1
0078 9508 RET
_Int_to_Char:
p --> R20
i --> R22
0079 D139 RCALL push_gset2
007A 01A9 MOVW R20,R18
007B 01B8 MOVW R22,R16
(0010) void Int_to_Char(unsigned int i,char *p)
(0011) {p[0]=i/1000+48;
007C EE28 LDI R18,0xE8
007D E033 LDI R19,3
007E 018B MOVW R16,R22
007F D100 RCALL div16u
0080 01C8 MOVW R24,R16
0081 96C0 ADIW R24,0x30
0082 01FA MOVW R30,R20
0083 8380 STD Z+0,R24
(0012) p[1]=(i/100)%10+48;
0084 E624 LDI R18,0x64
0085 E030 LDI R19,0
0086 018B MOVW R16,R22
0087 D0F8 RCALL div16u
0088 E02A LDI R18,0xA
0089 E030 LDI R19,0
008A D0F3 RCALL mod16u
008B 01C8 MOVW R24,R16
008C 96C0 ADIW R24,0x30
008D 01FA MOVW R30,R20
008E 8381 STD Z+1,R24
(0013) p[2]=(i%100)/10+48;
008F E624 LDI R18,0x64
0090 E030 LDI R19,0
0091 018B MOVW R16,R22
0092 D0EB RCALL mod16u
0093 E02A LDI R18,0xA
0094 E030 LDI R19,0
0095 D0EA RCALL div16u
0096 01C8 MOVW R24,R16
0097 96C0 ADIW R24,0x30
0098 01FA MOVW R30,R20
0099 8382 STD Z+2,R24
(0014) p[3]=(i%100)%10+48;
009A E624 LDI R18,0x64
009B E030 LDI R19,0
009C 018B MOVW R16,R22
009D D0E0 RCALL mod16u
009E E02A LDI R18,0xA
009F E030 LDI R19,0
00A0 D0DD RCALL mod16u
00A1 01C8 MOVW R24,R16
00A2 96C0 ADIW R24,0x30
00A3 01FA MOVW R30,R20
00A4 8383 STD Z+3,R24
(0015) }
00A5 D0F4 RCALL pop_gset2
00A6 9508 RET
(0016) /* 字符输出函数 */
(0017) void putchar(char c)
(0018) {
(0019) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00A7 9B5D SBIS 0x0B,5
00A8 CFFE RJMP _putchar
(0020) UDR=c;
00A9 B90C OUT 0x0C,R16
(0021) }
00AA 9508 RET
(0022) /* 字符输入函数 */
(0023) unsigned char getchar(void)
(0024) {
(0025) while(!(UCSRA& (1<<RXC)));
_getchar:
00AB 9B5F SBIS 0x0B,7
00AC CFFE RJMP _getchar
(0026)
(0027) return UDR;
00AD B10C IN R16,0x0C
00AE 9508 RET
_puts:
s --> R20
00AF D0EC RCALL push_gset1
00B0 01A8 MOVW R20,R16
(0028) }
(0029) /* 字符串输出函数 */
(0030) void puts(char * s)
(0031) {
00B1 C005 RJMP 0x00B7
(0032) while (*s)
(0033) {
(0034) putchar(*s);
00B2 01FA MOVW R30,R20
00B3 8100 LDD R16,Z+0
00B4 DFF2 RCALL _putchar
(0035) s++;
00B5 5F4F SUBI R20,0xFF
00B6 4F5F SBCI R21,0xFF
00B7 01FA MOVW R30,R20
00B8 8020 LDD R2,Z+0
00B9 2022 TST R2
00BA F7B9 BNE 0x00B2
(0036) }
(0037) putchar(0x0a);//回车换行
00BB E00A LDI R16,0xA
00BC DFEA RCALL _putchar
(0038) putchar(0x0d);
00BD E00D LDI R16,0xD
00BE DFE8 RCALL _putchar
(0039)
(0040) }
00BF D0DF RCALL pop_gset1
00C0 9508 RET
_putstr:
s --> R20
00C1 D0DA RCALL push_gset1
00C2 01A8 MOVW R20,R16
(0041) /* 不含回车换行的字符串输出函数 */
(0042) void putstr(char * s)
(0043) {
00C3 C005 RJMP 0x00C9
(0044) while (*s)
(0045) {
(0046) putchar(*s);
00C4 01FA MOVW R30,R20
00C5 8100 LDD R16,Z+0
00C6 DFE0 RCALL _putchar
(0047) s++;
00C7 5F4F SUBI R20,0xFF
00C8 4F5F SBCI R21,0xFF
00C9 01FA MOVW R30,R20
00CA 8020 LDD R2,Z+0
00CB 2022 TST R2
00CC F7B9 BNE 0x00C4
(0048) }
(0049) }
00CD D0D1 RCALL pop_gset1
00CE 9508 RET
(0050) /* UART初始化 */
(0051) void uart_init(void)
(0052) {
(0053)
(0054) UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);;//允许发送和接收
_uart_init:
00CF E988 LDI R24,0x98
00D0 B98A OUT 0x0A,R24
(0055) UBRRL=47;
00D1 E28F LDI R24,0x2F
00D2 B989 OUT 0x09,R24
(0056) UBRRH=0; // 7.3728M 9600; 4M 25
00D3 2422 CLR R2
00D4 BC20 OUT 0x20,R2
(0057) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
00D5 E886 LDI R24,0x86
00D6 BD80 OUT 0x20,R24
(0058) }
00D7 9508 RET
FILE: D:\AVR\代码\ICCdaima\TWI\slaver_1.c
(0001) /* 段传辉 2008 1.21
(0002) TWI 从机的查询和中断接收 依靠广播0X00地址
(0003) ICCAVR6.31A chuanhuibh@sina.com
(0004) */
(0005) #include"iom8v.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:
00D8 EA84 LDI R24,0xA4
00D9 D123 RCALL <created procedures>
(0024) while(!(TWCR&(1<<TWINT)));
(0025) }
00DA 9508 RET
(0026) void Stop(void)
(0027) {
(0028) TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
00DB E984 LDI R24,0x94
00DC BF86 OUT 0x36,R24
(0029) }
00DD 9508 RET
(0030) void Load(uchar i)
(0031) {
(0032) TWDR=i;
_Load:
i --> R16
00DE B903 OUT 0x03,R16
(0033) TWCR=(1<<TWINT)|(1<<TWEN);
00DF E884 LDI R24,0x84
00E0 D11C RCALL <created procedures>
(0034) while(!(TWCR&(1<<TWINT)));
(0035)
(0036) }
00E1 9508 RET
(0037)
(0038) void Get(unsigned char *d)
(0039) {
(0040) TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
d --> R16
00E2 E884 LDI R24,0x84
00E3 D119 RCALL <created procedures>
(0041) while(!(TWCR&(1<<TWINT)));
(0042) *d= TWDR;
00E4 B023 IN R2,0x03
00E5 01F8 MOVW R30,R16
00E6 8220 STD Z+0,R2
(0043) }/**/
00E7 9508 RET
_ERROR:
state --> R20
00E8 D0B3 RCALL push_gset1
00E9 2F40 MOV R20,R16
(0044) void ERROR(uchar state)
(0045) {Stop();
00EA DFF0 RCALL _Stop
(0046) }
00EB D0B3 RCALL pop_gset1
00EC 9508 RET
_WriteByte:
data --> R20
00ED D0AE RCALL push_gset1
00EE 2F40 MOV R20,R16
(0047)
(0048) /*写一个字节data,成功则返回1,否则
(0049) 返回0*/
(0050) uchar WriteByte(uchar data)
(0051) {
(0052) //启动I2C
(0053) Start();
00EF DFE8 RCALL _Start
(0054) if(STATUS!=START) {ERROR(STATUS);return 0;}
00F0 B181 IN R24,0x01
00F1 7F88 ANDI R24,0xF8
00F2 3088 CPI R24,0x8
00F3 F029 BEQ 0x00F9
00F4 B101 IN R16,0x01
00F5 7F08 ANDI R16,0xF8
00F6 DFF1 RCALL _ERROR
00F7 2700 CLR R16
00F8 C018 RJMP 0x0111
(0055)
(0056) //发送从机地址(写),等待回应, 错误检测
(0057) Load(SLA_W);
00F9 E302 LDI R16,0x32
00FA DFE3 RCALL _Load
(0058) if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
00FB B181 IN R24,0x01
00FC 7F88 ANDI R24,0xF8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -