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

📄 read-byte.lst

📁 这个程序是用atmega128芯片对24c04进行读写的例子
💻 LST
字号:
__start:
__text_start:
      46 EFCF      LDI	R28,0xFF
      47 E1D0      LDI	R29,0x10
      48 BFCD      OUT	0x3D,R28
      49 BFDE      OUT	0x3E,R29
      4A 51CE      SUBI	R28,0x1E
      4B 40D0      SBCI	R29,0
      4C EA0A      LDI	R16,0xAA
      4D 8308      STD	Y+0,R16
      4E 2400      CLR	R0
      4F E0E0      LDI	R30,0
      50 E0F1      LDI	R31,1
      51 E011      LDI	R17,1
      52 30E0      CPI	R30,0
      53 07F1      CPC	R31,R17
      54 F011      BEQ	0x0057
      55 9201      ST	R0,Z+
      56 CFFB      RJMP	0x0052
      57 8300      STD	Z+0,R16
      58 E8EC      LDI	R30,0x8C
      59 E0F0      LDI	R31,0
      5A E0A0      LDI	R26,0
      5B E0B1      LDI	R27,1
      5C E010      LDI	R17,0
      5D E000      LDI	R16,0
      5E BF0B      OUT	0x3B,R16
      5F 38EC      CPI	R30,0x8C
      60 07F1      CPC	R31,R17
      61 F021      BEQ	0x0066
      62 95C8      LPM
      63 9631      ADIW	R30,1
      64 920D      ST	R0,X+
      65 CFF9      RJMP	0x005F
      66 940E 011A CALL	_main
_exit:
      68 CFFF      RJMP	_exit
FILE: E:\产品\开发板\mega128-board\实验程序\I2C读写24C04\i2c.h
(0001) ///////////////////////i2c通信子程序///////////////////////
(0002) ///////////////////////////////////////////////////////////
(0003) //初始化
(0004) void i2c_init()
(0005) {
(0006)     PORTD&=~0x80;
_i2c_init:
      69 9897      CBI	0x12,7
(0007)     TWBR=0x01 ;  //速率=16M/(16+2*16)=33.3k
      6A E081      LDI	R24,1
      6B 9380 0070 STS	0x0070,R24
(0008)     TWSR=0x01 ;  //分频因子=4
      6D 9380 0071 STS	0x0071,R24
      6F 9508      RET
(0009) }
(0010) 
(0011) 
(0012) //开始信号
(0013) void i2c_start()
(0014) {
(0015)     TWCR=0xa4 ;
_i2c_start:
      70 EA84      LDI	R24,0xA4
      71 9380 0074 STS	0x0074,R24
(0016)     while(!(TWCR&0x80)); 
      73 9020 0074 LDS	R2,0x0074
      75 FE27      SBRS	R2,7
      76 CFFC      RJMP	0x0073
      77 9508      RET
(0017) }
(0018) 
(0019) 
(0020) //写数据
(0021) void i2c_wrdata(uchar i2c_data)
(0022) {
(0023)     TWDR=(i2c_data);
_i2c_wrdata:
  i2c_data             --> R16
      78 9300 0073 STS	0x0073,R16
(0024)     TWCR=0x84 ;
      7A E884      LDI	R24,0x84
      7B 9380 0074 STS	0x0074,R24
(0025)     while(!(TWCR&0x80));
      7D 9020 0074 LDS	R2,0x0074
      7F FE27      SBRS	R2,7
      80 CFFC      RJMP	0x007D
      81 9508      RET
(0026) }
(0027) 
(0028) 
(0029) //读数据noack
(0030) uchar i2c_redata()
(0031) {
(0032)     uchar i2c_data ;
(0033)     TWCR=0x84 ;
_i2c_redata:
  i2c_data             --> R16
      82 E884      LDI	R24,0x84
      83 9380 0074 STS	0x0074,R24
(0034)     while(!(TWCR&0x80));
      85 9020 0074 LDS	R2,0x0074
      87 FE27      SBRS	R2,7
      88 CFFC      RJMP	0x0085
(0035)     i2c_data=TWDR ;
      89 9100 0073 LDS	R16,0x0073
(0036)     return(i2c_data);
      8B 9508      RET
(0037) }
(0038) 
(0039) //读数据ack
(0040) uchar i2c_redataack()
(0041) {
(0042)     uchar i2c_data ;
(0043)     TWCR=0xc4 ;
_i2c_redataack:
  i2c_data             --> R16
      8C EC84      LDI	R24,0xC4
      8D 9380 0074 STS	0x0074,R24
(0044)     while(!(TWCR&0x80));
      8F 9020 0074 LDS	R2,0x0074
      91 FE27      SBRS	R2,7
      92 CFFC      RJMP	0x008F
(0045)     i2c_data=TWDR ;
      93 9100 0073 LDS	R16,0x0073
(0046)     return(i2c_data);
      95 9508      RET
(0047) }
(0048) 
(0049) 
(0050) 
(0051) //停止信号
(0052) void i2c_stop()
(0053) {
(0054)     TWCR=0x94 ;
_i2c_stop:
      96 E984      LDI	R24,0x94
      97 9380 0074 STS	0x0074,R24
      99 9508      RET
_i2c_wrbyte:
  i2c_add              --> R12
  i2c_data             --> R10
      9A 92AA      ST	R10,-Y
      9B 92CA      ST	R12,-Y
      9C 2EC2      MOV	R12,R18
      9D 2EA0      MOV	R10,R16
(0055) }
(0056) 
(0057) //i2c的写字节子程序
(0058) void i2c_wrbyte(uchar i2c_data,uchar i2c_add)
(0059) {
(0060)     do 
(0061)     {
(0062)         i2c_start();
      9E DFD1      RCALL	_i2c_start
(0063)         i2c_wrdata(0xa0);
      9F EA00      LDI	R16,0xA0
      A0 DFD7      RCALL	_i2c_wrdata
(0064)     }
(0065)     while((TWSR&0xf8)!=0x18);     //判断总线是否可以操作
      A1 9180 0071 LDS	R24,0x0071
      A3 7F88      ANDI	R24,0xF8
      A4 3188      CPI	R24,0x18
      A5 F7C1      BNE	0x009E
(0066)     
(0067)     i2c_wrdata(i2c_add);
      A6 2D0C      MOV	R16,R12
      A7 DFD0      RCALL	_i2c_wrdata
(0068)     i2c_wrdata(i2c_data);
      A8 2D0A      MOV	R16,R10
      A9 DFCE      RCALL	_i2c_wrdata
(0069)     i2c_stop();
      AA DFEB      RCALL	_i2c_stop
      AB 90C9      LD	R12,Y+
      AC 90A9      LD	R10,Y+
      AD 9508      RET
_i2c_wrpage:
  addh                 --> R14
  addl                 --> R10
  i                    --> R10
  i2c_nub              --> Y,+6
  i2c_add              --> R14
  i2c_data             --> R12
      AE 940E 0138 CALL	push_xgset00FC
      B0 0179      MOVW	R14,R18
      B1 0168      MOVW	R12,R16
(0070) }
(0071) 
(0072) //i2c的页写子程序
(0073) //参数1:要写入的数组数据
(0074) //参数2:写入的首地址
(0075) //参数3:数组的单元数
(0076) void i2c_wrpage(uchar i2c_data[],uint i2c_add,uchar i2c_nub)
(0077) {
(0078)     uchar addl,addh,i ;
(0079)     addl=i2c_add ;
      B2 2CAE      MOV	R10,R14
(0080)     addh=i2c_add>>8 ;
      B3 2CEF      MOV	R14,R15
      B4 24FF      CLR	R15
(0081)     do 
(0082)     {
(0083)         i2c_start();
      B5 DFBA      RCALL	_i2c_start
(0084)         i2c_wrdata(0xa0);
      B6 EA00      LDI	R16,0xA0
      B7 DFC0      RCALL	_i2c_wrdata
(0085)     }
(0086)     while((TWSR&0xf8)!=0x18);
      B8 9180 0071 LDS	R24,0x0071
      BA 7F88      ANDI	R24,0xF8
      BB 3188      CPI	R24,0x18
      BC F7C1      BNE	0x00B5
(0087)     //判断总线是否可以操作
(0088)     i2c_wrdata(addh);
      BD 2D0E      MOV	R16,R14
      BE DFB9      RCALL	_i2c_wrdata
(0089)     i2c_wrdata(addl);
      BF 2D0A      MOV	R16,R10
      C0 DFB7      RCALL	_i2c_wrdata
(0090)     for(i=0;i<i2c_nub;i++)
      C1 24AA      CLR	R10
      C2 C007      RJMP	0x00CA
(0091)     {
(0092)         i2c_wrdata(i2c_data[i]);
      C3 2DEA      MOV	R30,R10
      C4 27FF      CLR	R31
      C5 0DEC      ADD	R30,R12
      C6 1DFD      ADC	R31,R13
      C7 8100      LDD	R16,Z+0
      C8 DFAF      RCALL	_i2c_wrdata
      C9 94A3      INC	R10
      CA 800E      LDD	R0,Y+6
      CB 14A0      CP	R10,R0
      CC F3B0      BCS	0x00C3
(0093)     }
(0094)     i2c_stop();
      CD DFC8      RCALL	_i2c_stop
      CE 940C 0124 JMP	pop_xgset00FC
_i2c_rebyte:
  i2c_data             --> R10
  i2c_add              --> R10
      D0 92AA      ST	R10,-Y
      D1 2EA0      MOV	R10,R16
(0095) }
(0096) 
(0097) //i2c读一个字节子程序
(0098) uchar i2c_rebyte(uchar i2c_add)
(0099) {
(0100)     uchar i2c_data ;
(0101)     do 
(0102)     {
(0103)         i2c_start();
      D2 DF9D      RCALL	_i2c_start
(0104)         i2c_wrdata(0xa0);
      D3 EA00      LDI	R16,0xA0
      D4 DFA3      RCALL	_i2c_wrdata
(0105)     }
(0106)     while((TWSR&0xf8)!=0x18);
      D5 9180 0071 LDS	R24,0x0071
      D7 7F88      ANDI	R24,0xF8
      D8 3188      CPI	R24,0x18
      D9 F7C1      BNE	0x00D2
(0107)     //判断总线是否可以操作
(0108)     i2c_wrdata(i2c_add);
      DA 2D0A      MOV	R16,R10
      DB DF9C      RCALL	_i2c_wrdata
(0109)     i2c_start();
      DC DF93      RCALL	_i2c_start
(0110)     i2c_wrdata(0xa1);
      DD EA01      LDI	R16,0xA1
      DE DF99      RCALL	_i2c_wrdata
(0111)     i2c_data=i2c_redata();
      DF DFA2      RCALL	_i2c_redata
      E0 2EA0      MOV	R10,R16
(0112)     i2c_stop();
      E1 DFB4      RCALL	_i2c_stop
(0113)     return(i2c_data);
      E2 2D0A      MOV	R16,R10
      E3 90A9      LD	R10,Y+
      E4 9508      RET
_i2c_rese:
  addh                 --> R20
  addl                 --> R14
  i                    --> R14
  i2c_nub              --> R12
  i2c_add              --> R20
  aa                   --> R10
      E5 940E 0136 CALL	push_xgset30FC
      E7 01A9      MOVW	R20,R18
      E8 0158      MOVW	R10,R16
      E9 84C8      LDD	R12,Y+8
(0114) }
(0115) 
(0116) 
(0117) //i2c连续读子程序
(0118) //参数1:16位地址
(0119) //参数2:读取字节数  注:<=64
(0120) //读出的数据只能从全局数组变量获得
(0121) void i2c_rese(uchar aa[],uint i2c_add,uchar i2c_nub)
(0122) {
(0123)     uchar addl,addh,i ;
(0124)     addl=i2c_add ;
      EA 2EE4      MOV	R14,R20
(0125)     addh=i2c_add>>8 ;
      EB 2F45      MOV	R20,R21
      EC 2755      CLR	R21
(0126)     i2c_nub--;
      ED 94CA      DEC	R12
(0127)     do 
(0128)     {
(0129)         i2c_start();
      EE DF81      RCALL	_i2c_start
(0130)         i2c_wrdata(0xa0);
      EF EA00      LDI	R16,0xA0
      F0 DF87      RCALL	_i2c_wrdata
(0131)     }
(0132)     while((TWSR&0xf8)!=0x18);
      F1 9180 0071 LDS	R24,0x0071
      F3 7F88      ANDI	R24,0xF8
      F4 3188      CPI	R24,0x18
      F5 F7C1      BNE	0x00EE
(0133)     //判断总线是否可以操作
(0134)     i2c_wrdata(addh);
      F6 2F04      MOV	R16,R20
      F7 DF80      RCALL	_i2c_wrdata
(0135)     i2c_wrdata(addl);
      F8 2D0E      MOV	R16,R14
      F9 DF7E      RCALL	_i2c_wrdata
(0136)     i2c_start();
      FA DF75      RCALL	_i2c_start
(0137)     i2c_wrdata(0xa1);
      FB EA01      LDI	R16,0xA1
      FC DF7B      RCALL	_i2c_wrdata
(0138)     for(i=0;i<i2c_nub;i++)
      FD 24EE      CLR	R14
      FE C007      RJMP	0x0106
(0139)     {
(0140)         aa[i]=i2c_redataack();
      FF DF8C      RCALL	_i2c_redataack
     100 2DEE      MOV	R30,R14
     101 27FF      CLR	R31
     102 0DEA      ADD	R30,R10
     103 1DFB      ADC	R31,R11
     104 8300      STD	Z+0,R16
     105 94E3      INC	R14
     106 14EC      CP	R14,R12
     107 F3B8      BCS	0x00FF
(0141)     }
(0142)     aa[i2c_nub]=i2c_redata();
     108 DF79      RCALL	_i2c_redata
     109 2DEC      MOV	R30,R12
     10A 27FF      CLR	R31
     10B 0DEA      ADD	R30,R10
     10C 1DFB      ADC	R31,R11
     10D 8300      STD	Z+0,R16
(0143)     //最后一个字节发出no ack信号
(0144)     i2c_stop();
     10E DF87      RCALL	_i2c_stop
     10F 940C 012B JMP	pop_xgset30FC
FILE: E:\产品\开发板\mega128-board\实验程序\I2C读写24C04\read-byte.c
(0001) #include<iom128v.h>
(0002) #define uchar unsigned char 
(0003) #define uint unsigned int 
(0004) #include"i2c.h"
(0005) //延时函数
(0006) void s_ms(unsigned int t)
(0007) {
(0008)     for(;t>1;t--)
_s_ms:
  t                    --> R16
     111 C002      RJMP	0x0114
     112 5001      SUBI	R16,1
     113 4010      SBCI	R17,0
     114 E081      LDI	R24,1
     115 E090      LDI	R25,0
     116 1780      CP	R24,R16
     117 0791      CPC	R25,R17
     118 F3C8      BCS	0x0112
     119 9508      RET
(0009)     {
(0010)     }
(0011) }
(0012) 
(0013) //读一个字节
(0014) main()
(0015) {
(0016) DDRA=0xff;
_main:
     11A EF8F      LDI	R24,0xFF
     11B BB8A      OUT	0x1A,R24
(0017) PORTA=0xff;
     11C BB8B      OUT	0x1B,R24
(0018) i2c_init();  //初始化
     11D DF4B      RCALL	_i2c_init
(0019) PORTA=~i2c_rebyte(0x12);  //读出字节
FILE: <library>
     11E E102      LDI	R16,0x12
     11F DFB0      RCALL	_i2c_rebyte
     120 2E20      MOV	R2,R16
     121 9420      COM	R2
     122 BA2B      OUT	0x1B,R2
     123 9508      RET
pop_xgset00FC:
     124 90A9      LD	R10,Y+
     125 90B9      LD	R11,Y+
     126 90C9      LD	R12,Y+
     127 90D9      LD	R13,Y+
     128 90E9      LD	R14,Y+
     129 90F9      LD	R15,Y+
     12A 9508      RET
pop_xgset30FC:
     12B 90A9      LD	R10,Y+
     12C 90B9      LD	R11,Y+
     12D 90C9      LD	R12,Y+
     12E 90D9      LD	R13,Y+
     12F 90E9      LD	R14,Y+
     130 90F9      LD	R15,Y+
     131 9149      LD	R20,Y+
     132 9159      LD	R21,Y+
     133 9508      RET
push_xgsetF0FC:
     134 937A      ST	R23,-Y
     135 936A      ST	R22,-Y
push_xgset30FC:
     136 935A      ST	R21,-Y
     137 934A      ST	R20,-Y
push_xgset00FC:
     138 92FA      ST	R15,-Y
     139 92EA      ST	R14,-Y
push_xgset003C:
     13A 92DA      ST	R13,-Y
     13B 92CA      ST	R12,-Y
     13C 92BA      ST	R11,-Y
     13D 92AA      ST	R10,-Y
     13E 9508      RET

⌨️ 快捷键说明

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