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

📄 test.lst

📁 24IIC的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
      65 E5CF      LDI	R28,0x5F
      66 E0D4      LDI	R29,4
      67 BFCD      OUT	0x3D,R28
      68 BFDE      OUT	0x3E,R29
      69 51C0      SUBI	R28,0x10
      6A 40D0      SBCI	R29,0
      6B EA0A      LDI	R16,0xAA
      6C 8308      STD	Y+0,R16
      6D 2400      CLR	R0
      6E E7E1      LDI	R30,0x71
      6F E0F0      LDI	R31,0
      70 E010      LDI	R17,0
      71 37E1      CPI	R30,0x71
      72 07F1      CPC	R31,R17
      73 F011      BEQ	0x0076
      74 9201      ST	R0,Z+
      75 CFFB      RJMP	0x0071
      76 8300      STD	Z+0,R16
      77 EBE8      LDI	R30,0xB8
      78 E0F0      LDI	R31,0
      79 E6A0      LDI	R26,0x60
      7A E0B0      LDI	R27,0
      7B E010      LDI	R17,0
      7C E000      LDI	R16,0
      7D BF0B      OUT	0x3B,R16
      7E 3CE9      CPI	R30,0xC9
      7F 07F1      CPC	R31,R17
      80 F021      BEQ	0x0085
      81 95C8      LPM
      82 9631      ADIW	R30,1
      83 920D      ST	R0,X+
      84 CFF9      RJMP	0x007E
      85 D17C      RCALL	_main
_exit:
      86 CFFF      RJMP	_exit
FILE: D:\iccavr\mega16\11\24CXX\delay.h
(0001) /**********延时函数*****************/
(0002) /*-----------------------------------------------
(0003) delay_us	   :1us延时函数
(0004) ------------------------------------------------*/
(0005) void delay_1us(void)
(0006) {
(0007)  asm("nop");
_delay_1us:
      87 0000      NOP
      88 9508      RET
_delay_us:
  t                    --> R20
      89 934A      ST	R20,-Y
      8A 935A      ST	R21,-Y
      8B 01A8      MOVW	R20,R16
(0008) }
(0009) /*-----------------------------------------------
(0010) delay_nus          :长延时函数
(0011) 输入参数: t        :延时时间 us
(0012) ------------------------------------------------*/
(0013) void delay_us(unsigned int t)
(0014) {
      8C C001      RJMP	0x008E
(0015)  while(t--)
(0016)   delay_1us();
      8D DFF9      RCALL	_delay_1us
      8E 011A      MOVW	R2,R20
      8F 5041      SUBI	R20,1
      90 4050      SBCI	R21,0
      91 2022      TST	R2
      92 F7D1      BNE	0x008D
      93 2033      TST	R3
      94 F7C1      BNE	0x008D
      95 9159      LD	R21,Y+
      96 9149      LD	R20,Y+
      97 9508      RET
(0017) }
(0018) /*----------------------------------------------
(0019) delay_ms	   :1ms延时函数
(0020) -----------------------------------------------*/
(0021) void delay_1ms(void)
(0022) {
(0023)  unsigned int i;
(0024)  for(i=0;i<1140;i++);
_delay_1ms:
  i0                   --> R16
      98 2700      CLR	R16
      99 2711      CLR	R17
      9A C002      RJMP	0x009D
      9B 5F0F      SUBI	R16,0xFF
      9C 4F1F      SBCI	R17,0xFF
      9D 3704      CPI	R16,0x74
      9E E0E4      LDI	R30,4
      9F 071E      CPC	R17,R30
      A0 F3D0      BCS	0x009B
      A1 9508      RET
_delay_ms:
  t                    --> R20
      A2 934A      ST	R20,-Y
      A3 935A      ST	R21,-Y
      A4 01A8      MOVW	R20,R16
(0025) }
(0026) /*----------------------------------------------
(0027) delay_nms          :长延时函数
(0028) 输入参数: t        :延时时间 ms
(0029) -----------------------------------------------*/
(0030) void delay_ms(unsigned int t)
(0031) {
      A5 C001      RJMP	0x00A7
(0032)  while(t--)
(0033)   delay_1ms();
      A6 DFF1      RCALL	_delay_1ms
      A7 011A      MOVW	R2,R20
      A8 5041      SUBI	R20,1
      A9 4050      SBCI	R21,0
      AA 2022      TST	R2
      AB F7D1      BNE	0x00A6
      AC 2033      TST	R3
      AD F7C1      BNE	0x00A6
      AE 9159      LD	R21,Y+
      AF 9149      LD	R20,Y+
      B0 9508      RET
_WriteByte:
  ltg                  --> Y,+0
  Wdata                --> R10
  RomAddress           --> R12
      B1 D1D9      RCALL	push_xgset003C
      B2 2EA2      MOV	R10,R18
      B3 0168      MOVW	R12,R16
      B4 9722      SBIW	R28,2
FILE: D:\iccavr\mega16\11\24CXX\24cxx_twi.h
(0001) typedef unsigned char     uint8; 
(0002) typedef unsigned int      uint16; 
(0003) 
(0004) typedef  union reccnt 
(0005) { 
(0006)  uint16 rcnt; 
(0007)  uint8  rcntl[2]; 
(0008) }LngToChar; 
(0009) 
(0010) #define wr_24c64_cmd      0xA0 
(0011) #define rd_24c64_cmd      0xA1 
(0012)          
(0013) #define START 0x08   
(0014) #define RE_START 0x10   
(0015) #define MT_SLA_ACK 0x18   
(0016) //#define MT_SLA_ACK 0x38   
(0017) #define MT_SLA_NOACK 0x20   
(0018) #define MT_DATA_ACK  0x28   
(0019) #define MT_DATA_NOACK 0x30   
(0020) #define MR_SLA_ACK  0x40   
(0021) #define MR_SLA_NOACK 0x48   
(0022) #define MR_DATA_ACK 0x50   
(0023) #define MR_DATA_NOACK 0x58  
(0024)    
(0025) #define Start()         (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   
(0026) #define Stop()          (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))   
(0027) #define Wait()          {while(!(TWCR&(1<<TWINT)));}   
(0028) #define TestAck()       (TWSR&0xf8)  
(0029) #define SetAck()        (TWCR|=(1<<TWEA))   
(0030) #define SetNoAck()      (TWCR&=~(1<<TWEA))   
(0031) #define Twi()           (TWCR=(1<<TWINT)|(1<<TWEN))  
(0032) #define Write8Bit(x)    {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 
(0033)   
(0034) uint8 WriteByte(uint16 RomAddress,uint8 Wdata);
(0035) uint8 ReadByte(uint16 RomAddress);
(0036) 
(0037) //******************************************    
(0038) uint8 WriteByte(uint16 RomAddress,uint8 Wdata)    
(0039) {       
(0040)  LngToChar ltg; 
(0041)           
(0042)  ltg.rcnt=RomAddress; 
      B5 82D9      STD	Y+1,R13
      B6 82C8      STD	Y+0,R12
(0043) 
(0044)  _CLI(); 
      B7 94F8      BCLR	7
(0045)  Start();//twi 
      B8 EA84      LDI	R24,0xA4
      B9 940E 02CF CALL	<created procedures>
(0046)  Wait();   
(0047)  if(TestAck()!=START) goto wr_exit;//ACK 0x08    
      BB 3088      CPI	R24,0x8
      BC F009      BEQ	0x00BE
      BD C027      RJMP	0x00E5
(0048) 
(0049)  Write8Bit(wr_24c64_cmd);// 
      BE EA80      LDI	R24,0xA0
      BF B983      OUT	0x03,R24
      C0 E884      LDI	R24,0x84
      C1 940E 02CF CALL	<created procedures>
(0050)  Wait();   
(0051)  if(TestAck()!=MT_SLA_ACK) goto wr_exit;//ACK MT_SLA_ACK 0x18  
      C3 3188      CPI	R24,0x18
      C4 F009      BEQ	0x00C6
      C5 C01F      RJMP	0x00E5
(0052)  
(0053)  Write8Bit(ltg.rcntl[1]);  //写操作单元的高8位地址    
      C6 8029      LDD	R2,Y+1
      C7 B823      OUT	0x03,R2
      C8 E884      LDI	R24,0x84
      C9 940E 02CF CALL	<created procedures>
(0054)  Wait(); 
(0055)  if(TestAck()!=MT_DATA_ACK) goto wr_exit;//ACK   
      CB 3288      CPI	R24,0x28
      CC F009      BEQ	0x00CE
      CD C017      RJMP	0x00E5
(0056) 
(0057)  Write8Bit(ltg.rcntl[0]);   //写操作单元的低8位地址    
      CE 8028      LDD	R2,Y+0
      CF B823      OUT	0x03,R2
      D0 E884      LDI	R24,0x84
      D1 940E 02CF CALL	<created procedures>
(0058)  Wait(); 
(0059)  if(TestAck()!=MT_DATA_ACK) goto wr_exit;//ACK   
      D3 3288      CPI	R24,0x28
      D4 F009      BEQ	0x00D6
      D5 C00F      RJMP	0x00E5
(0060)     
(0061)  Write8Bit(Wdata);// 
      D6 B8A3      OUT	0x03,R10
      D7 E884      LDI	R24,0x84
      D8 940E 02CF CALL	<created procedures>
(0062)  Wait();   
(0063)  if(TestAck()!=MT_DATA_ACK) goto wr_exit;//ACK      
      DA 3288      CPI	R24,0x28
      DB F009      BEQ	0x00DD
      DC C008      RJMP	0x00E5
(0064)       
(0065)  Stop();// 
      DD E984      LDI	R24,0x94
      DE BF86      OUT	0x36,R24
(0066)  delay_ms(30);//   
      DF E10E      LDI	R16,0x1E
      E0 E010      LDI	R17,0
      E1 DFC0      RCALL	_delay_ms
(0067)  _SEI(); 
      E2 9478      BSET	7
(0068)  return 0;   
      E3 2700      CLR	R16
      E4 C004      RJMP	0x00E9
(0069)  wr_exit://出错退出 
(0070)    Stop();// 
      E5 E984      LDI	R24,0x94
      E6 BF86      OUT	0x36,R24
(0071)    _SEI(); 
      E7 9478      BSET	7
(0072)  return 1; 
      E8 E001      LDI	R16,1
      E9 9622      ADIW	R28,2
      EA C190      RJMP	pop_xgset003C
_ReadByte:
  ltg                  --> Y,+0
  temp0                --> R10
  RomAddress           --> R16
      EB 92AA      ST	R10,-Y
      EC 9722      SBIW	R28,2
(0073) }  
(0074)   
(0075) //******************************************   
(0076) uint8 ReadByte(uint16 RomAddress) 
(0077) {   
(0078)  uint8 temp;  
(0079)  LngToChar ltg; 
(0080)  _CLI(); 
      ED 94F8      BCLR	7
(0081)  ltg.rcnt=RomAddress; 
      EE 8319      STD	Y+1,R17
      EF 8308      STD	Y+0,R16
(0082) 
(0083)  Start();  
      F0 EA84      LDI	R24,0xA4
      F1 940E 02CF CALL	<created procedures>
(0084)  Wait();  
(0085)  if (TestAck()!=START) goto re_exit;//ACK  
      F3 3088      CPI	R24,0x8
      F4 F009      BEQ	0x00F6
      F5 C032      RJMP	0x0128
(0086)                         
(0087)  Write8Bit(wr_24c64_cmd);//  
      F6 EA80      LDI	R24,0xA0
      F7 B983      OUT	0x03,R24
      F8 E884      LDI	R24,0x84
      F9 940E 02CF CALL	<created procedures>
(0088)  Wait();               
(0089)  if (TestAck()!=MT_SLA_ACK) goto re_exit;//ACK   
      FB 3188      CPI	R24,0x18
      FC F009      BEQ	0x00FE
      FD C02A      RJMP	0x0128
(0090)            
(0091)  Write8Bit(ltg.rcntl[1]); //写操作单元的高8位地址    
      FE 8029      LDD	R2,Y+1
      FF B823      OUT	0x03,R2
     100 E884      LDI	R24,0x84
     101 940E 02CF CALL	<created procedures>
(0092)  Wait();   
(0093)  if (TestAck()!=MT_DATA_ACK) goto re_exit;   
     103 3288      CPI	R24,0x28
     104 F009      BEQ	0x0106
     105 C022      RJMP	0x0128
(0094)            
(0095)  Write8Bit(ltg.rcntl[0]);  //写操作单元的低8位地址       
     106 8028      LDD	R2,Y+0
     107 B823      OUT	0x03,R2
     108 E884      LDI	R24,0x84
     109 940E 02CF CALL	<created procedures>
(0096)  Wait();   
(0097)  if (TestAck()!=MT_DATA_ACK) goto re_exit; 
     10B 3288      CPI	R24,0x28
     10C F009      BEQ	0x010E
     10D C01A      RJMP	0x0128
(0098)            
(0099)  Start();//twi 
     10E EA84      LDI	R24,0xA4
     10F 940E 02CF CALL	<created procedures>
(0100)  Wait();   
(0101)  if (TestAck()!=RE_START)  goto re_exit;   
     111 3180      CPI	R24,0x10
     112 F009      BEQ	0x0114
     113 C014      RJMP	0x0128
(0102)             
(0103)  Write8Bit(rd_24c64_cmd);//   
     114 EA81      LDI	R24,0xA1
     115 B983      OUT	0x03,R24
     116 E884      LDI	R24,0x84
     117 940E 02CF CALL	<created procedures>
(0104)  Wait();   
(0105)  if(TestAck()!=MR_SLA_ACK)  goto re_exit;//ACK   
     119 3480      CPI	R24,0x40
     11A F009      BEQ	0x011C
     11B C00C      RJMP	0x0128
(0106)                
(0107)  Twi();//启动主I2C读方式 
     11C E884      LDI	R24,0x84
     11D 940E 02CF CALL	<created procedures>
(0108)  Wait();   
(0109)  if(TestAck()!=MR_DATA_NOACK) goto re_exit;//ACK  MR_DATA_NOACK 0x58   
     11F 3588      CPI	R24,0x58
     120 F009      BEQ	0x0122
     121 C006      RJMP	0x0128
(0110)    
(0111)  temp=TWDR;// 读取I2C接收的数据      
     122 B0A3      IN	R10,0x03
(0112)  Stop();//I2C停止  
     123 E984      LDI	R24,0x94
     124 BF86      OUT	0x36,R24
(0113) 
(0114)  _SEI(); 
     125 9478      BSET	7
(0115)  return temp; 
     126 2D0A      MOV	R16,R10
     127 C004      RJMP	0x012C

⌨️ 快捷键说明

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