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

📄 twi.lst

📁 AVR的MEGA16通过TWI接口读写AT24C02
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0031 E5CF      LDI	R28,0x5F
    0032 E0D4      LDI	R29,4
    0033 BFCD      OUT	0x3D,R28
    0034 BFDE      OUT	0x3E,R29
    0035 51C0      SUBI	R28,0x10
    0036 40D0      SBCI	R29,0
    0037 EA0A      LDI	R16,0xAA
    0038 8308      STD	Y+0,R16
    0039 2400      CLR	R0
    003A E6E2      LDI	R30,0x62
    003B E0F0      LDI	R31,0
    003C E010      LDI	R17,0
    003D 36E3      CPI	R30,0x63
    003E 07F1      CPC	R31,R17
    003F F011      BEQ	0x0042
    0040 9201      ST	R0,Z+
    0041 CFFB      RJMP	0x003D
    0042 8300      STD	Z+0,R16
    0043 E6E0      LDI	R30,0x60
    0044 E0F0      LDI	R31,0
    0045 E6A0      LDI	R26,0x60
    0046 E0B0      LDI	R27,0
    0047 E010      LDI	R17,0
    0048 36E2      CPI	R30,0x62
    0049 07F1      CPC	R31,R17
    004A F021      BEQ	0x004F
    004B 95C8      LPM
    004C 9631      ADIW	R30,1
    004D 920D      ST	R0,X+
    004E CFF9      RJMP	0x0048
    004F 940E015B  CALL	_main
_exit:
    0051 CFFF      RJMP	_exit
FILE: D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
(0001) #include <iom8v.h>			
(0002) #include <macros.h>
(0003) //-----------------------------------------------
(0004) #define uchar unsigned char	
(0005) #define uint unsigned int
(0006) 
(0007) //TWI状态定义
(0008) //MT 主方式传输  MR 主方式接收
(0009) #define START 0x08 
(0010) #define RE_START 0x10
(0011) #define MT_SLA_ACK 0x18
(0012) #define MT_SLA_NOACK 0x20
(0013) #define MT_DATA_ACK  0x28
(0014) #define MT_DATA_NOACK 0x30
(0015) #define MR_SLA_ACK  0x40
(0016) #define MR_SLA_NOACK 0x48
(0017) #define MR_DATA_ACK 0x50
(0018) #define MR_DATA_NOACK 0x58
(0019) 
(0020) 
(0021) #define rd_device_add 0xa1
(0022) #define wr_device_add 0xa0
(0023) 
(0024) #define DS12_CONTROL_PORT        PORTB 
(0025) #define CS                       PB3 
(0026) #define CS_ON()   ( DS12_CONTROL_PORT &= ~(1<<CS) ) 
(0027) #define CS_OFF()  ( DS12_CONTROL_PORT |=  (1<<CS) )
(0028) 
(0029) //常用TWI操作(主模式写和主模式读)
(0030) #define Start()    	  (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0031) #define Stop()     	  (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0032) #define Wait()	   	  {while(!(TWCR&(1<<TWINT)));}
(0033) #define TestAck() 	  (TWSR&0xf8)
(0034) #define SetAck()	  (TWCR|=(1<<TWEA))
(0035) #define SetNoAck()    (TWCR&=~(1<<TWEA))
(0036) #define Twi()	  	  (TWCR=(1<<TWINT)|(1<<TWEN))
(0037) #define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 	
(0038) 	
(0039) #define xtal 8   			
(0040) 
(0041) flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
(0042) flash unsigned char position[]={0x10,0x20};
(0043) unsigned char dis_buff[2]={0,0},posit;
(0044) 
(0045) //========函数声明=========
(0046) 
(0047) void port_init(void);
(0048) void delay_ms(unsigned int time);
(0049) void delay_us(int time);
(0050) //=======================
(0051) 
(0052) void Delay_2us()
(0053) {
(0054) 	NOP();NOP();NOP();
_Delay_2us:
    0052 0000      NOP
    0053 0000      NOP
    0054 0000      NOP
    0055 9508      RET
__delay_us:
  xus                  --> R20
    0056 940E01A0  CALL	push_gset1
    0058 01A8      MOVW	R20,R16
(0055) }
(0056) 
(0057) void _delay_us(unsigned int xus)
(0058) {
    0059 C001      RJMP	0x005B
(0059) 	 while (xus--)
(0060)        	Delay_2us();
    005A DFF7      RCALL	_Delay_2us
    005B 011A      MOVW	R2,R20
    005C 5041      SUBI	R20,1
    005D 4050      SBCI	R21,0
    005E 2022      TST	R2
    005F F7D1      BNE	0x005A
    0060 2033      TST	R3
    0061 F7C1      BNE	0x005A
    0062 940E01A3  CALL	pop_gset1
    0064 9508      RET
_delay_ms:
  i                    --> R20
  j                    --> R22
  xms                  --> R16
    0065 940E019E  CALL	push_gset2
(0061) }
(0062) 
(0063) void delay_ms(unsigned int  xms) //crystal=8MHz
(0064) {
(0065) 	unsigned int i,j; //variable:declare Word
(0066) 	for(i=0; i<xms; i++)
    0067 2744      CLR	R20
    0068 2755      CLR	R21
    0069 C014      RJMP	0x007E
(0067) 		for(j=0; j<498;j++)
    006A 2766      CLR	R22
    006B 2777      CLR	R23
    006C C00B      RJMP	0x0078
(0068) 		{
(0069) 			NOP();NOP();NOP();NOP();
    006D 0000      NOP
    006E 0000      NOP
    006F 0000      NOP
    0070 0000      NOP
(0070) 			NOP();NOP();NOP();NOP();NOP();		
    0071 0000      NOP
    0072 0000      NOP
    0073 0000      NOP
    0074 0000      NOP
    0075 0000      NOP
    0076 5F6F      SUBI	R22,0xFF
    0077 4F7F      SBCI	R23,0xFF
    0078 3F62      CPI	R22,0xF2
    0079 E0E1      LDI	R30,1
    007A 077E      CPC	R23,R30
    007B F388      BCS	0x006D
    007C 5F4F      SUBI	R20,0xFF
    007D 4F5F      SBCI	R21,0xFF
    007E 1740      CP	R20,R16
    007F 0751      CPC	R21,R17
    0080 F348      BCS	0x006A
    0081 940E0195  CALL	pop_gset2
    0083 9508      RET
_display:
  adc1                 --> R20
    0084 940E01A0  CALL	push_gset1
    0086 2F40      MOV	R20,R16
(0071) 			
(0072) 		}
(0073) }
(0074) 
(0075) void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
(0076) {
(0077)    dis_buff[1]=adc1 /10;
    0087 E01A      LDI	R17,0xA
    0088 2F04      MOV	R16,R20
    0089 940E017F  CALL	div8u
    008B 93000061  STS	dis_buff+1,R16
(0078) 
(0079)     dis_buff[0]=adc1 %10;
    008D E01A      LDI	R17,0xA
    008E 2F04      MOV	R16,R20
    008F 940E017D  CALL	mod8u
    0091 93000060  STS	dis_buff,R16
(0080)   
(0081)   //PORTB = 0x00;
(0082)   for(posit=0; posit<2;posit++)
    0093 2422      CLR	R2
    0094 92200062  STS	posit,R2
    0096 C020      RJMP	0x00B7
(0083)   {
(0084)    
(0085)    PORTD = dis_7[dis_buff[posit]];
    0097 E680      LDI	R24,0x60
    0098 E090      LDI	R25,0
    0099 91E00062  LDS	R30,posit
    009B 27FF      CLR	R31
    009C 0FE8      ADD	R30,R24
    009D 1FF9      ADC	R31,R25
    009E 81E0      LDD	R30,Z+0
    009F 27FF      CLR	R31
    00A0 E584      LDI	R24,0x54
    00A1 E090      LDI	R25,0
    00A2 0FE8      ADD	R30,R24
    00A3 1FF9      ADC	R31,R25
    00A4 91E4      LPM	R30,0(Z)
    00A5 BBE2      OUT	0x12,R30
(0086)    PORTB = position[posit];
    00A6 E58E      LDI	R24,0x5E
    00A7 E090      LDI	R25,0
    00A8 91E00062  LDS	R30,posit
    00AA 27FF      CLR	R31
    00AB 0FE8      ADD	R30,R24
    00AC 1FF9      ADC	R31,R25
    00AD 91E4      LPM	R30,0(Z)
    00AE BBE8      OUT	0x18,R30
(0087)    
(0088)   _delay_us(100);
    00AF E604      LDI	R16,0x64
    00B0 E010      LDI	R17,0
    00B1 DFA4      RCALL	__delay_us
    00B2 91800062  LDS	R24,posit
    00B4 5F8F      SUBI	R24,0xFF
    00B5 93800062  STS	posit,R24
    00B7 91800062  LDS	R24,posit
    00B9 3082      CPI	R24,2
    00BA F2E0      BCS	0x0097
    00BB 940E01A3  CALL	pop_gset1
    00BD 9508      RET
(0089)    //PORTB &= ~position[posit];
(0090)   
(0091)   }
(0092) }
(0093) 
(0094) /********************端口初始化******************/
(0095) void port_init(void)
(0096) {
(0097)  //PORTA = 0x00;
(0098)  //DDRA  = 0xFF;
(0099) // PORTB = 0x00;
(0100)  DDRB  = 0xFF;
_port_init:
    00BE EF8F      LDI	R24,0xFF
    00BF BB87      OUT	0x17,R24
(0101) // PORTC = 0x00; 
(0102)  DDRC  = 0x30;
    00C0 E380      LDI	R24,0x30
    00C1 BB84      OUT	0x14,R24
(0103) // PORTD = 0xFF;
(0104)  DDRD  = 0xFF;
    00C2 EF8F      LDI	R24,0xFF
    00C3 BB81      OUT	0x11,R24
    00C4 9508      RET
_i2c_Read:
  temp                 --> R20
  RomAddress           --> R16
    00C5 940E01A0  CALL	push_gset1
(0105) }
(0106) 
(0107) 
(0108) /******************************************
(0109)                I2C总线读一个字节
(0110) 			   如果读失败返回0
(0111) *******************************************/
(0112) unsigned char i2c_Read(unsigned char RomAddress) 
(0113)       {
(0114) 	   unsigned char temp;
(0115) 	   Start();
    00C7 EA84      LDI	R24,0xA4
    00C8 BF86      OUT	0x36,R24
(0116) 	   Wait();
    00C9 B626      IN	R2,0x36
    00CA FE27      SBRS	R2,7
    00CB CFFD      RJMP	0x00C9
(0117) 	   if (TestAck()!=START) return 0;	   
    00CC B181      IN	R24,0x01
    00CD 7F88      ANDI	R24,0xF8
    00CE 3088      CPI	R24,0x8
    00CF F011      BEQ	0x00D2
    00D0 2700      CLR	R16
    00D1 C040      RJMP	0x0112
(0118) 	   Write8Bit(wr_device_add);
    00D2 EA80      LDI	R24,0xA0
    00D3 B983      OUT	0x03,R24
    00D4 E884      LDI	R24,0x84
    00D5 BF86      OUT	0x36,R24
(0119) 	   Wait(); 
    00D6 B626      IN	R2,0x36
    00D7 FE27      SBRS	R2,7
    00D8 CFFD      RJMP	0x00D6
(0120) 	   if (TestAck()!=MT_SLA_ACK) return 0;
    00D9 B181      IN	R24,0x01
    00DA 7F88      ANDI	R24,0xF8
    00DB 3188      CPI	R24,0x18
    00DC F011      BEQ	0x00DF
    00DD 2700      CLR	R16
    00DE C033      RJMP	0x0112
(0121) 	   Write8Bit(RomAddress);
    00DF B903      OUT	0x03,R16
    00E0 E884      LDI	R24,0x84
    00E1 BF86      OUT	0x36,R24
(0122) 	   Wait();
    00E2 B626      IN	R2,0x36
    00E3 FE27      SBRS	R2,7
    00E4 CFFD      RJMP	0x00E2
(0123) 	   if (TestAck()!=MT_DATA_ACK) return 0;
    00E5 B181      IN	R24,0x01
    00E6 7F88      ANDI	R24,0xF8
    00E7 3288      CPI	R24,0x28

⌨️ 快捷键说明

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