⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi_usart.lss

📁 利用ATmega16对24c0进行读写操作
💻 LSS
字号:

TWI_USART.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000001dc  00000000  00000000  00000054  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .stab         0000036c  00000000  00000000  00000230  2**2
                  CONTENTS, READONLY, DEBUGGING
  2 .stabstr      00000084  00000000  00000000  0000059c  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_aranges 00000020  00000000  00000000  00000620  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_pubnames 00000094  00000000  00000000  00000640  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_info   000003ef  00000000  00000000  000006d4  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_abbrev 000001d7  00000000  00000000  00000ac3  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_line   00000333  00000000  00000000  00000c9a  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_frame  000000b0  00000000  00000000  00000fcd  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_str    0000012a  00000000  00000000  0000107d  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_loc    000000f2  00000000  00000000  000011a7  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 <__ctors_end>
   4:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
   8:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
   c:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  10:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  14:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  18:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  1c:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  20:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  24:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  28:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  2c:	0c 94 9b 00 	jmp	0x136	; 0x136 <__vector_11>
  30:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  34:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  38:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  3c:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  40:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  44:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  48:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  4c:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>
  50:	0c 94 45 00 	jmp	0x8a	; 0x8a <__bad_interrupt>

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	ec ed       	ldi	r30, 0xDC	; 220
  68:	f1 e0       	ldi	r31, 0x01	; 1
  6a:	02 c0       	rjmp	.+4      	; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
  70:	a0 36       	cpi	r26, 0x60	; 96
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	a0 e6       	ldi	r26, 0x60	; 96
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
  7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
  80:	a0 36       	cpi	r26, 0x60	; 96
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e <.do_clear_bss_loop>
  86:	0c 94 b1 00 	jmp	0x162	; 0x162 <main>

0000008a <__bad_interrupt>:
  8a:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

0000008e <I2C_start>:
#define TW_BUS_ERROR   0x00 //由于非法的START 或STOP 引起的总线错误
*/
/*****************************************************/ 
void I2C_start(void) 
{ 
  8e:	84 ea       	ldi	r24, 0xA4	; 164
  90:	86 bf       	out	0x36, r24	; 54
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);  //TWINT清零  
  while (!(TWCR & (1<<TWINT)));  //0x08    
  92:	06 b6       	in	r0, 0x36	; 54
  94:	07 fe       	sbrs	r0, 7
  96:	fd cf       	rjmp	.-6      	; 0x92 <I2C_start+0x4>
  98:	08 95       	ret

0000009a <I2C_stop>:
} 
/*****************************************************/ 
void  I2C_stop(void) 
{ 
  9a:	84 e9       	ldi	r24, 0x94	; 148
  9c:	86 bf       	out	0x36, r24	; 54
  9e:	08 95       	ret

000000a0 <I2C_write>:
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);  
}      
/*****************************************************/ 
void I2C_write(uchar addr,uchar c) 
{ 
  a0:	98 2f       	mov	r25, r24
  TWDR = SLA_W;
  a2:	80 ea       	ldi	r24, 0xA0	; 160
  a4:	83 b9       	out	0x03, r24	; 3
  TWCR = (1<<TWINT) | (1<<TWEN);
  a6:	84 e8       	ldi	r24, 0x84	; 132
  a8:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x18
  aa:	06 b6       	in	r0, 0x36	; 54
  ac:	07 fe       	sbrs	r0, 7
  ae:	fd cf       	rjmp	.-6      	; 0xaa <I2C_write+0xa>
  TWDR = addr;
  b0:	93 b9       	out	0x03, r25	; 3
  TWCR = (1<<TWINT) | (1<<TWEN);
  b2:	84 e8       	ldi	r24, 0x84	; 132
  b4:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x28
  b6:	06 b6       	in	r0, 0x36	; 54
  b8:	07 fe       	sbrs	r0, 7
  ba:	fd cf       	rjmp	.-6      	; 0xb6 <I2C_write+0x16>
	TWDR = c; 
  bc:	63 b9       	out	0x03, r22	; 3
	TWCR = (1<<TWINT) | (1<<TWEN);   
  be:	84 e8       	ldi	r24, 0x84	; 132
  c0:	86 bf       	out	0x36, r24	; 54
	while (!(TWCR & (1<<TWINT)));  //0x18   
  c2:	06 b6       	in	r0, 0x36	; 54
  c4:	07 fe       	sbrs	r0, 7
  c6:	fd cf       	rjmp	.-6      	; 0xc2 <I2C_write+0x22>
  c8:	08 95       	ret

000000ca <I2C_read>:
}      
/*****************************************************/    
uchar I2C_read(uchar addr)   //读一字节 
{ 
  ca:	98 2f       	mov	r25, r24
  uchar temp;
  TWDR = SLA_W;
  cc:	80 ea       	ldi	r24, 0xA0	; 160
  ce:	83 b9       	out	0x03, r24	; 3
  TWCR = (1<<TWINT) | (1<<TWEN);
  d0:	84 e8       	ldi	r24, 0x84	; 132
  d2:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x18
  d4:	06 b6       	in	r0, 0x36	; 54
  d6:	07 fe       	sbrs	r0, 7
  d8:	fd cf       	rjmp	.-6      	; 0xd4 <I2C_read+0xa>
  TWDR = addr;
  da:	93 b9       	out	0x03, r25	; 3
  TWCR = (1<<TWINT) | (1<<TWEN);
  dc:	84 e8       	ldi	r24, 0x84	; 132
  de:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT))); //0x28
  e0:	06 b6       	in	r0, 0x36	; 54
  e2:	07 fe       	sbrs	r0, 7
  e4:	fd cf       	rjmp	.-6      	; 0xe0 <I2C_read+0x16>
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
  e6:	84 ea       	ldi	r24, 0xA4	; 164
  e8:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x10
  ea:	06 b6       	in	r0, 0x36	; 54
  ec:	07 fe       	sbrs	r0, 7
  ee:	fd cf       	rjmp	.-6      	; 0xea <I2C_read+0x20>
  TWDR = SLA_R;
  f0:	81 ea       	ldi	r24, 0xA1	; 161
  f2:	83 b9       	out	0x03, r24	; 3
  TWCR = (1<<TWINT) | (1<<TWEN);
  f4:	84 e8       	ldi	r24, 0x84	; 132
  f6:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x40
  f8:	06 b6       	in	r0, 0x36	; 54
  fa:	07 fe       	sbrs	r0, 7
  fc:	fd cf       	rjmp	.-6      	; 0xf8 <I2C_read+0x2e>
  TWCR = (1<<TWINT) | (1<<TWEN);
  fe:	84 e8       	ldi	r24, 0x84	; 132
 100:	86 bf       	out	0x36, r24	; 54
  while (!(TWCR & (1<<TWINT)));  //0x58  
 102:	06 b6       	in	r0, 0x36	; 54
 104:	07 fe       	sbrs	r0, 7
 106:	fd cf       	rjmp	.-6      	; 0x102 <I2C_read+0x38>
  return(TWDR);   
 108:	83 b1       	in	r24, 0x03	; 3
} 
 10a:	99 27       	eor	r25, r25
 10c:	08 95       	ret

0000010e <TWI_init>:

/****************************************************
函数名:TWI_init
作  用:TWI接口的初始化
*****************************************************/
void TWI_init(void)
{
 10e:	81 e0       	ldi	r24, 0x01	; 1
 110:	85 bb       	out	0x15, r24	; 21
  PORTC = _BV(PC0);   // i2c SCL 
  PORTC = _BV(PC1);   // i2c SDA
 112:	82 e0       	ldi	r24, 0x02	; 2
 114:	85 bb       	out	0x15, r24	; 21
  TWAR = 0x00;         //主机模式,该地址无效
 116:	12 b8       	out	0x02, r1	; 2
  TWSR = 0x00;
 118:	11 b8       	out	0x01, r1	; 1
  TWBR=(F_CPU/FSCL-16)/2;    // TWI比特率 
 11a:	8f e2       	ldi	r24, 0x2F	; 47
 11c:	80 b9       	out	0x00, r24	; 0
  //TWBR = Baud_set;        //100
  //TWSR = P_value;         //64分频
  TWCR = 0x00;		   //关闭TWI模块
 11e:	16 be       	out	0x36, r1	; 54
  TWCR=(1<<TWEA)|(1<<TWEN);  //允许ACK应答:On
 120:	84 e4       	ldi	r24, 0x44	; 68
 122:	86 bf       	out	0x36, r24	; 54
 124:	08 95       	ret

00000126 <UartInit>:
}
/****************************************************/
void UartInit( )
{
 126:	88 e9       	ldi	r24, 0x98	; 152
 128:	8a b9       	out	0x0a, r24	; 10
  //接收使能,发送使能,接收中断允许
	UCSRB=(1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
  //UBRR=CK/(BUAD*16)-1,(CK=11.059MHz ATMEG16)
  //1200   UBRRH=2; UBRRL=63;  575
  //4800   UBRRH=0; UBRRL=143;
  //9600   UBRRH=0; UBRRL=71;
  //19200  UBRRH=0; UBRRL=35;
  //38400  UBRRH=0; UBRRL=17;
  //57600  UBRRH=0; UBRRL=11;
  //115200 UBRRH=0; UBRRL=5;   
  //到目前为止,1200波特率还不能设置,原因是UBRRH写上进去东西

  //UBRR=CK/(BUAD*16)-1,(CK=8.169984MHz ATMEG48)
  //1200   UBRR0H=1; UBRR0L=0xA9;
  //4800   UBRR0H=; UBRR0L=0x69;
  //9600   UBRR0H=; UBRR0L=0x34;
  //19200  UBRR0H=; UBRR0L=0x1A; 由于内部不是RC振荡器,所以高了不可取
  //38400  UBRR0H=; UBRR0L=;
  //57600  UBRR0H=; UBRR0L=;
  //115200 UBRR0H=; UBRR0L=;

  UBRRH=0; UBRRL=0x0C;	//内部晶振,CK=1MHZ,UBRR=CK/(BUAD*16)-1
 12a:	10 bc       	out	0x20, r1	; 32
 12c:	8c e0       	ldi	r24, 0x0C	; 12
 12e:	89 b9       	out	0x09, r24	; 9
  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
 130:	86 e8       	ldi	r24, 0x86	; 134
 132:	80 bd       	out	0x20, r24	; 32
 134:	08 95       	ret

00000136 <__vector_11>:
}
/****************************************************/
//接收中断
SIGNAL(SIG_UART_RECV)
{
 136:	1f 92       	push	r1
 138:	0f 92       	push	r0
 13a:	0f b6       	in	r0, 0x3f	; 63
 13c:	0f 92       	push	r0
 13e:	11 24       	eor	r1, r1
 140:	8f 93       	push	r24
	unsigned char c=UDR;
 142:	8c b1       	in	r24, 0x0c	; 12
 144:	8f 91       	pop	r24
 146:	0f 90       	pop	r0
 148:	0f be       	out	0x3f, r0	; 63
 14a:	0f 90       	pop	r0
 14c:	1f 90       	pop	r1
 14e:	18 95       	reti

00000150 <SendChar>:

//	if(c=='*') cRecState=1;
//	else if(c=='A' && cRecState==1) cRecState=2;
//	else if(c=='.' && cRecState==2)	cGiveGift=1;
//	else cRecState=0;

}
//发送中断
//SIGNAL(SIG_UART_TRANS)
//{
//	if(--g_bTxdLen>0)
//		UDR=g_aSendBuf[++g_bTxdPos];
//
//}
/****************************************************/
//从发送缓冲区发送指定长度的数据
void SendChar(unsigned char num)
{
 150:	5d 9b       	sbis	0x0b, 5	; 11
 152:	fe cf       	rjmp	.-4      	; 0x150 <SendChar>
	while((UCSRA & (1<<UDRE))==0);
	UDR=num;
 154:	8c b9       	out	0x0c, r24	; 12
 156:	08 95       	ret

00000158 <RevChar>:
}
/****************************************************/
//从接收缓冲去接收数据并返回
unsigned char RevChar ( void )
{
 158:	5f 9b       	sbis	0x0b, 7	; 11
 15a:	fe cf       	rjmp	.-4      	; 0x158 <RevChar>
	while ( (UCSRA & (1<<RXC))==0 );
	return UDR;
 15c:	8c b1       	in	r24, 0x0c	; 12
}
 15e:	99 27       	eor	r25, r25
 160:	08 95       	ret

00000162 <main>:
/****************************************************/
int main (void)
{
 162:	f8 94       	cli
  uchar temp;
  cli();
  //Chip_init();
  TWI_init();
 164:	0e 94 87 00 	call	0x10e	; 0x10e <TWI_init>
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 168:	80 e0       	ldi	r24, 0x00	; 0
 16a:	9c e6       	ldi	r25, 0x6C	; 108
 16c:	01 97       	sbiw	r24, 0x01	; 1
 16e:	f1 f7       	brne	.-4      	; 0x16c <main+0xa>
 170:	88 e9       	ldi	r24, 0x98	; 152
 172:	8a b9       	out	0x0a, r24	; 10
 174:	10 bc       	out	0x20, r1	; 32
 176:	8c e0       	ldi	r24, 0x0C	; 12
 178:	89 b9       	out	0x09, r24	; 9
 17a:	86 e8       	ldi	r24, 0x86	; 134
 17c:	80 bd       	out	0x20, r24	; 32
  _delay_ms(10);
  UartInit();
  sei();
 17e:	78 94       	sei
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 180:	80 e0       	ldi	r24, 0x00	; 0
 182:	9c e6       	ldi	r25, 0x6C	; 108
 184:	01 97       	sbiw	r24, 0x01	; 1
 186:	f1 f7       	brne	.-4      	; 0x184 <main+0x22>
 188:	84 ea       	ldi	r24, 0xA4	; 164
 18a:	86 bf       	out	0x36, r24	; 54
 18c:	06 b6       	in	r0, 0x36	; 54
 18e:	07 fe       	sbrs	r0, 7
 190:	fd cf       	rjmp	.-6      	; 0x18c <main+0x2a>
  _delay_ms(10);
  while(1)
  {
	  //写一个字节c到addr位置
	  I2C_start();
	  I2C_write(0x00,0x05);//addr,data
 192:	65 e0       	ldi	r22, 0x05	; 5
 194:	80 e0       	ldi	r24, 0x00	; 0
 196:	0e 94 50 00 	call	0xa0	; 0xa0 <I2C_write>
 19a:	84 e9       	ldi	r24, 0x94	; 148
 19c:	86 bf       	out	0x36, r24	; 54
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 19e:	80 e0       	ldi	r24, 0x00	; 0
 1a0:	90 e0       	ldi	r25, 0x00	; 0
 1a2:	01 97       	sbiw	r24, 0x01	; 1
 1a4:	f1 f7       	brne	.-4      	; 0x1a2 <main+0x40>
 1a6:	84 ea       	ldi	r24, 0xA4	; 164
 1a8:	86 bf       	out	0x36, r24	; 54
 1aa:	06 b6       	in	r0, 0x36	; 54
 1ac:	07 fe       	sbrs	r0, 7
 1ae:	fd cf       	rjmp	.-6      	; 0x1aa <main+0x48>
	  I2C_stop();
	  _delay_ms(50);
	  //读出刚才写入的数据
	  I2C_start();
	  temp = I2C_read(0x00);//addr
 1b0:	80 e0       	ldi	r24, 0x00	; 0
 1b2:	0e 94 65 00 	call	0xca	; 0xca <I2C_read>
 1b6:	28 2f       	mov	r18, r24
 1b8:	84 e9       	ldi	r24, 0x94	; 148
 1ba:	86 bf       	out	0x36, r24	; 54
	  I2C_stop();
	  //如果读出的数据与写入相同,则亮灯,灯闪
	  if (temp == 0x05)
 1bc:	25 30       	cpi	r18, 0x05	; 5
 1be:	51 f4       	brne	.+20     	; 0x1d4 <main+0x72>
	  {
		PORTA |=(1<<PA5);
 1c0:	dd 9a       	sbi	0x1b, 5	; 27
		DDRA |=(1<<PA5);//LED亮
 1c2:	d5 9a       	sbi	0x1a, 5	; 26
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1c4:	80 e0       	ldi	r24, 0x00	; 0
 1c6:	90 e0       	ldi	r25, 0x00	; 0
 1c8:	fc 01       	movw	r30, r24
 1ca:	31 97       	sbiw	r30, 0x01	; 1
 1cc:	f1 f7       	brne	.-4      	; 0x1ca <main+0x68>
		_delay_ms(1000);
		DDRA &=~(1<<PA5);//LED暗
 1ce:	d5 98       	cbi	0x1a, 5	; 26
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1d0:	01 97       	sbiw	r24, 0x01	; 1
 1d2:	f1 f7       	brne	.-4      	; 0x1d0 <main+0x6e>
 1d4:	5d 9b       	sbis	0x0b, 5	; 11
 1d6:	fe cf       	rjmp	.-4      	; 0x1d4 <main+0x72>
 1d8:	2c b9       	out	0x0c, r18	; 12
 1da:	d6 cf       	rjmp	.-84     	; 0x188 <main+0x26>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -