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

📄 read-byte.lst

📁 16个单片机c语言实验程序
💻 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 00EF CALL	_main
_exit:
      68 CFFF      RJMP	_exit
FILE: D:\16实验程序\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 B980      OUT	0x00,R24
(0008)     TWSR=0x01 ;  //分频因子=4
      6C B981      OUT	0x01,R24
      6D 9508      RET
(0009) }
(0010) 
(0011) 
(0012) //开始信号
(0013) void i2c_start()
(0014) {
(0015)     TWCR=0xa4 ;
_i2c_start:
      6E EA84      LDI	R24,0xA4
      6F BF86      OUT	0x36,R24
(0016)     while(!(TWCR&0x80)); 
      70 B626      IN	R2,0x36
      71 FE27      SBRS	R2,7
      72 CFFD      RJMP	0x0070
      73 9508      RET
(0017) }
(0018) 
(0019) 
(0020) //写数据
(0021) void i2c_wrdata(uchar i2c_data)
(0022) {
(0023)     TWDR=(i2c_data);
_i2c_wrdata:
  i2c_data             --> R16
      74 B903      OUT	0x03,R16
(0024)     TWCR=0x84 ;
      75 E884      LDI	R24,0x84
      76 BF86      OUT	0x36,R24
(0025)     while(!(TWCR&0x80));
      77 B626      IN	R2,0x36
      78 FE27      SBRS	R2,7
      79 CFFD      RJMP	0x0077
      7A 9508      RET
(0026) }
(0027) 
(0028) 
(0029) //读数据noack
(0030) uchar i2c_redata()
(0031) {
(0032)     uchar i2c_data ;
(0033)     TWCR=0x84 ;
_i2c_redata:
  i2c_data             --> R16
      7B E884      LDI	R24,0x84
      7C BF86      OUT	0x36,R24
(0034)     while(!(TWCR&0x80));
      7D B626      IN	R2,0x36
      7E FE27      SBRS	R2,7
      7F CFFD      RJMP	0x007D
(0035)     i2c_data=TWDR ;
      80 B103      IN	R16,0x03
(0036)     return(i2c_data);
      81 9508      RET
(0037) }
(0038) 
(0039) //读数据ack
(0040) uchar i2c_redataack()
(0041) {
(0042)     uchar i2c_data ;
(0043)     TWCR=0xc4 ;
_i2c_redataack:
  i2c_data             --> R16
      82 EC84      LDI	R24,0xC4
      83 BF86      OUT	0x36,R24
(0044)     while(!(TWCR&0x80));
      84 B626      IN	R2,0x36
      85 FE27      SBRS	R2,7
      86 CFFD      RJMP	0x0084
(0045)     i2c_data=TWDR ;
      87 B103      IN	R16,0x03
(0046)     return(i2c_data);
      88 9508      RET
(0047) }
(0048) 
(0049) 
(0050) 
(0051) //停止信号
(0052) void i2c_stop()
(0053) {
(0054)     TWCR=0x94 ;
_i2c_stop:
      89 E984      LDI	R24,0x94
      8A BF86      OUT	0x36,R24
      8B 9508      RET
_i2c_wrbyte:
  i2c_add              --> R12
  i2c_data             --> R10
      8C 92AA      ST	R10,-Y
      8D 92CA      ST	R12,-Y
      8E 2EC2      MOV	R12,R18
      8F 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();
      90 DFDD      RCALL	_i2c_start
(0063)         i2c_wrdata(0xa0);
      91 EA00      LDI	R16,0xA0
      92 DFE1      RCALL	_i2c_wrdata
(0064)     }
(0065)     while((TWSR&0xf8)!=0x18);     //判断总线是否可以操作
      93 B181      IN	R24,0x01
      94 7F88      ANDI	R24,0xF8
      95 3188      CPI	R24,0x18
      96 F7C9      BNE	0x0090
(0066)     
(0067)     i2c_wrdata(i2c_add);
      97 2D0C      MOV	R16,R12
      98 DFDB      RCALL	_i2c_wrdata
(0068)     i2c_wrdata(i2c_data);
      99 2D0A      MOV	R16,R10
      9A DFD9      RCALL	_i2c_wrdata
(0069)     i2c_stop();
      9B DFED      RCALL	_i2c_stop
      9C 90C9      LD	R12,Y+
      9D 90A9      LD	R10,Y+
      9E 9508      RET
_i2c_wrpage:
  i                    --> R10
  i2c_nub              --> Y,+4
  i2c_add              --> R10
  i2c_data             --> R12
      9F 940E 0104 CALL	push_xgset003C
      A1 2EA2      MOV	R10,R18
      A2 0168      MOVW	R12,R16
(0070) }
(0071) 
(0072) //i2c的页写子程序
(0073) //参数1:要写入的数组指针
(0074) //参数2:写入的首地址
(0075) //参数3:数组的单元数
(0076) void i2c_wrpage(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0077) {
(0078)     uchar i;
(0079)     do 
(0080)     {
(0081)         i2c_start();
      A3 DFCA      RCALL	_i2c_start
(0082)         i2c_wrdata(0xa0);
      A4 EA00      LDI	R16,0xA0
      A5 DFCE      RCALL	_i2c_wrdata
(0083)     }
(0084)     while((TWSR&0xf8)!=0x18);
      A6 B181      IN	R24,0x01
      A7 7F88      ANDI	R24,0xF8
      A8 3188      CPI	R24,0x18
      A9 F7C9      BNE	0x00A3
(0085)     //判断总线是否可以操作
(0086)     i2c_wrdata(i2c_add);
      AA 2D0A      MOV	R16,R10
      AB DFC8      RCALL	_i2c_wrdata
(0087)     for(i=0;i<i2c_nub;i++)
      AC 24AA      CLR	R10
      AD C005      RJMP	0x00B3
(0088)     {
(0089)         i2c_wrdata(*i2c_data++);
      AE 01F6      MOVW	R30,R12
      AF 9101      LD	R16,Z+
      B0 016F      MOVW	R12,R30
      B1 DFC2      RCALL	_i2c_wrdata
      B2 94A3      INC	R10
      B3 800C      LDD	R0,Y+4
      B4 14A0      CP	R10,R0
      B5 F3C0      BCS	0x00AE
(0090)     }
(0091)     i2c_stop();
      B6 DFD2      RCALL	_i2c_stop
      B7 940C 00F9 JMP	pop_xgset003C
_i2c_rebyte:
  i2c_data             --> R10
  i2c_add              --> R10
      B9 92AA      ST	R10,-Y
      BA 2EA0      MOV	R10,R16
(0092) }
(0093) 
(0094) //i2c读一个字节子程序
(0095) uchar i2c_rebyte(uchar i2c_add)
(0096) {
(0097)     uchar i2c_data ;
(0098)     do 
(0099)     {
(0100)         i2c_start();
      BB DFB2      RCALL	_i2c_start
(0101)         i2c_wrdata(0xa0);
      BC EA00      LDI	R16,0xA0
      BD DFB6      RCALL	_i2c_wrdata
(0102)     }
(0103)     while((TWSR&0xf8)!=0x18);
      BE B181      IN	R24,0x01
      BF 7F88      ANDI	R24,0xF8
      C0 3188      CPI	R24,0x18
      C1 F7C9      BNE	0x00BB
(0104)     //判断总线是否可以操作
(0105)     i2c_wrdata(i2c_add);
      C2 2D0A      MOV	R16,R10
      C3 DFB0      RCALL	_i2c_wrdata
(0106)     i2c_start();
      C4 DFA9      RCALL	_i2c_start
(0107)     i2c_wrdata(0xa1);
      C5 EA01      LDI	R16,0xA1
      C6 DFAD      RCALL	_i2c_wrdata
(0108)     i2c_data=i2c_redata();
      C7 DFB3      RCALL	_i2c_redata
      C8 2EA0      MOV	R10,R16
(0109)     i2c_stop();
      C9 DFBF      RCALL	_i2c_stop
(0110)     return(i2c_data);
      CA 2D0A      MOV	R16,R10
      CB 90A9      LD	R10,Y+
      CC 9508      RET
_i2c_rese:
  i                    --> R10
  i2c_nub              --> Y,+4
  i2c_add              --> R10
  i2c_data             --> R20
      CD 940E 0109 CALL	push_xgset300C
      CF 2EA2      MOV	R10,R18
      D0 01A8      MOVW	R20,R16
(0111) }
(0112) 
(0113) 
(0114) //i2c连续读子程序
(0115) //参数1:16位地址
(0116) //参数2:读取字节数  注:<=64
(0117) //读出的数据只能从全局数组变量获得
(0118) void i2c_rese(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0119) {
(0120)     uchar i;
(0121)     do 
(0122)     {
(0123)         i2c_start();
      D1 DF9C      RCALL	_i2c_start
(0124)         i2c_wrdata(0xa0);
      D2 EA00      LDI	R16,0xA0
      D3 DFA0      RCALL	_i2c_wrdata
(0125)     }
(0126)     while((TWSR&0xf8)!=0x18);
      D4 B181      IN	R24,0x01
      D5 7F88      ANDI	R24,0xF8
      D6 3188      CPI	R24,0x18
      D7 F7C9      BNE	0x00D1
(0127)     //判断总线是否可以操作
(0128)     i2c_wrdata(i2c_add);
      D8 2D0A      MOV	R16,R10
      D9 DF9A      RCALL	_i2c_wrdata
(0129)     i2c_start();
      DA DF93      RCALL	_i2c_start
(0130)     i2c_wrdata(0xa1);
      DB EA01      LDI	R16,0xA1
      DC DF97      RCALL	_i2c_wrdata
(0131)     for(i=0;i<(i2c_nub-1);i++)              //少循环一次,留给最后发出no ack信号
      DD 24AA      CLR	R10
      DE C006      RJMP	0x00E5
(0132)     {
(0133)         *i2c_data=i2c_redataack();
      DF DFA2      RCALL	_i2c_redataack
      E0 01FA      MOVW	R30,R20
      E1 8300      STD	Z+0,R16
(0134) 		i2c_data++;
      E2 5F4F      SUBI	R20,0xFF
      E3 4F5F      SBCI	R21,0xFF
      E4 94A3      INC	R10
      E5 818C      LDD	R24,Y+4
      E6 5081      SUBI	R24,1
      E7 16A8      CP	R10,R24
      E8 F3B0      BCS	0x00DF
(0135)     }
(0136)     *i2c_data=i2c_redata();                 //最后一个字节发出no ack信号
      E9 DF91      RCALL	_i2c_redata
      EA 01FA      MOVW	R30,R20
      EB 8300      STD	Z+0,R16
(0137)     i2c_stop();
      EC DF9C      RCALL	_i2c_stop
      ED 940C 010E JMP	pop_xgset300C
FILE: D:\16实验程序\I2C读写24C04\读一个字节\read-byte.c
(0001) //读24c04的一个字节程序
(0002) #include<iom16v.h>
(0003) #define uchar unsigned char 
(0004) #define uint unsigned int 
(0005) #include"i2c.h"
(0006) 
(0007) //读一个字节
(0008) main()
(0009) {
(0010) DDRD=0xff;
_main:
      EF EF8F      LDI	R24,0xFF
      F0 BB81      OUT	0x11,R24
(0011) PORTD=0xff;
      F1 BB82      OUT	0x12,R24
(0012) i2c_init();  //初始化
      F2 DF76      RCALL	_i2c_init
(0013) PORTD=~i2c_rebyte(0x12);  //读出地址0x12的字节
FILE: <library>
      F3 E102      LDI	R16,0x12
      F4 DFC4      RCALL	_i2c_rebyte
      F5 2E20      MOV	R2,R16
      F6 9420      COM	R2
      F7 BA22      OUT	0x12,R2
      F8 9508      RET
pop_xgset003C:
      F9 90A9      LD	R10,Y+
      FA 90B9      LD	R11,Y+
      FB 90C9      LD	R12,Y+
      FC 90D9      LD	R13,Y+
      FD 9508      RET
push_xgsetF0FC:
      FE 937A      ST	R23,-Y
      FF 936A      ST	R22,-Y
push_xgset30FC:
     100 935A      ST	R21,-Y
     101 934A      ST	R20,-Y
push_xgset00FC:
     102 92FA      ST	R15,-Y
     103 92EA      ST	R14,-Y
push_xgset003C:
     104 92DA      ST	R13,-Y
     105 92CA      ST	R12,-Y
     106 92BA      ST	R11,-Y
     107 92AA      ST	R10,-Y
     108 9508      RET
push_xgset300C:
     109 935A      ST	R21,-Y
     10A 934A      ST	R20,-Y
     10B 92BA      ST	R11,-Y
     10C 92AA      ST	R10,-Y
     10D 9508      RET
pop_xgset300C:
     10E 90A9      LD	R10,Y+
     10F 90B9      LD	R11,Y+
     110 9149      LD	R20,Y+
     111 9159      LD	R21,Y+
     112 9508      RET

⌨️ 快捷键说明

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