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

📄 twi_master.lst

📁 atmega16 iic(twi)主从机通信 测试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0028 E5CF      LDI	R28,0x5F
    0029 E0D4      LDI	R29,4
    002A BFCD      OUT	0x3D,R28
    002B BFDE      OUT	0x3E,R29
    002C 51C0      SUBI	R28,0x10
    002D 40D0      SBCI	R29,0
    002E EA0A      LDI	R16,0xAA
    002F 8308      STD	Y+0,R16
    0030 2400      CLR	R0
    0031 E8E2      LDI	R30,0x82
    0032 E0F0      LDI	R31,0
    0033 E010      LDI	R17,0
    0034 38E2      CPI	R30,0x82
    0035 07F1      CPC	R31,R17
    0036 F011      BEQ	0x0039
    0037 9201      ST	R0,Z+
    0038 CFFB      RJMP	0x0034
    0039 8300      STD	Z+0,R16
    003A E2EE      LDI	R30,0x2E
    003B E0F0      LDI	R31,0
    003C E6A0      LDI	R26,0x60
    003D E0B0      LDI	R27,0
    003E E010      LDI	R17,0
    003F 35E0      CPI	R30,0x50
    0040 07F1      CPC	R31,R17
    0041 F021      BEQ	0x0046
    0042 95C8      LPM
    0043 9631      ADIW	R30,1
    0044 920D      ST	R0,X+
    0045 CFF9      RJMP	0x003F
    0046 D04A      RCALL	_main
_exit:
    0047 CFFF      RJMP	_exit
FILE: E:\atmega16子函数\TWI_master\main.c
(0001) #include"iom16v.h"
(0002) #include <iom16v.h>
(0003) #include<macros.h>
(0004) #include"UART.h"
(0005) #include"DELAY.h"
(0006) 
(0007) #define  uchar  unsigned char
(0008) #define  STATUS  (TWSR&0xf8)
(0009) #define  SLA_W    0x32
(0010) #define  SLA_R    0x33
(0011) #define  SLAVER_ADDRESS     0x32
(0012) #define  START              0x08
(0013) #define  RE_START           0x10
(0014) #define  MT_SLA_WRITE_ACK   0x18
(0015) #define  MT_SLA_READ_ACK    0x40 
(0016) #define  MT_DATA_ACK        0x28
(0017) #define  MT_READ_ACK        0x58  
(0018)     
(0019) void Start(void)
(0020) {
(0021)  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
    0048 EA84      LDI	R24,0xA4
    0049 BF86      OUT	0x36,R24
(0022)  while(!(TWCR&(1<<TWINT)));
    004A B626      IN	R2,0x36
    004B FE27      SBRS	R2,7
    004C CFFD      RJMP	0x004A
(0023) }
    004D 9508      RET
(0024) void Stop(void)
(0025) {
(0026)  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
    004E E984      LDI	R24,0x94
    004F BF86      OUT	0x36,R24
(0027) }
    0050 9508      RET
(0028) void Load(uchar i)
(0029) {
(0030)  TWDR=i;
_Load:
  i                    --> R16
    0051 B903      OUT	0x03,R16
(0031)  TWCR=(1<<TWINT)|(1<<TWEN);
    0052 E884      LDI	R24,0x84
    0053 BF86      OUT	0x36,R24
(0032)  while(!(TWCR&(1<<TWINT))); 
    0054 B626      IN	R2,0x36
    0055 FE27      SBRS	R2,7
    0056 CFFD      RJMP	0x0054
(0033) 
(0034) }
    0057 9508      RET
(0035) 
(0036) void Get(unsigned char *d)
(0037) {
(0038)  TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
  d                    --> R16
    0058 E884      LDI	R24,0x84
    0059 BF86      OUT	0x36,R24
(0039)  while(!(TWCR&(1<<TWINT)));
    005A B626      IN	R2,0x36
    005B FE27      SBRS	R2,7
    005C CFFD      RJMP	0x005A
(0040)  *d= TWDR;
    005D B023      IN	R2,0x03
    005E 01F8      MOVW	R30,R16
    005F 8220      STD	Z+0,R2
(0041) }
    0060 9508      RET
_ERROR:
  state                --> R20
    0061 D0ED      RCALL	push_gset1
    0062 2F40      MOV	R20,R16
(0042) void ERROR(uchar state)
(0043) {Stop();
    0063 DFEA      RCALL	_Stop
(0044) }
    0064 D0ED      RCALL	pop_gset1
    0065 9508      RET
_SendByte:
  data                 --> R20
    0066 D0E8      RCALL	push_gset1
    0067 2F40      MOV	R20,R16
(0045) 
(0046) /*写一个字节data,成功则返回1,否则
(0047)   返回0*/
(0048) uchar SendByte(uchar data)
(0049) {
(0050)    //启动I2C
(0051)    Start();
    0068 DFDF      RCALL	_Start
(0052)   if(STATUS!=START) //{ERROR(STATUS);return 0;}
    0069 B181      IN	R24,0x01
    006A 7F88      ANDI	R24,0xF8
    006B 3088      CPI	R24,0x8
    006C F019      BEQ	0x0070
(0053)                       puts("Start ERRor");
    006D E706      LDI	R16,0x76
    006E E010      LDI	R17,0
    006F D072      RCALL	_puts
(0054)    //发送从机地址(写),等待回应, 错误检测
(0055)    Load(0);
    0070 2700      CLR	R16
    0071 DFDF      RCALL	_Load
(0056)    if(STATUS!=MT_SLA_WRITE_ACK) //{ERROR(STATUS);return 0;}
    0072 B181      IN	R24,0x01
    0073 7F88      ANDI	R24,0xF8
    0074 3188      CPI	R24,0x18
    0075 F019      BEQ	0x0079
(0057)                       puts("SLA_W RROR");
    0076 E60B      LDI	R16,0x6B
    0077 E010      LDI	R17,0
    0078 D069      RCALL	_puts
(0058)    /*
(0059)    //发送EEPROM地址,等待回应,错误检测
(0060)    Load(addr);
(0061)    if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
(0062)    */
(0063)    //发送数据,等待回应,错误检测
(0064)    Load(data);
    0079 2F04      MOV	R16,R20
    007A DFD6      RCALL	_Load
(0065)    if(STATUS!=MT_DATA_ACK) //{ERROR(STATUS);return 0;}
    007B B181      IN	R24,0x01
    007C 7F88      ANDI	R24,0xF8
    007D 3288      CPI	R24,0x28
    007E F019      BEQ	0x0082
(0066)                          puts("Date Error");
    007F E600      LDI	R16,0x60
    0080 E010      LDI	R17,0
    0081 D060      RCALL	_puts
(0067)    Stop();
    0082 DFCB      RCALL	_Stop
(0068)    return 1;//发送成功,返回1;
    0083 E001      LDI	R16,1
    0084 D0CD      RCALL	pop_gset1
    0085 9508      RET
(0069)    
(0070) }
(0071) 
(0072) void Init_Io(void)
(0073) {
(0074)  DDRC&=~((1<<PC0)&(1<<PC1)&(1<<PC2));  
_Init_Io:
    0086 B384      IN	R24,0x14
    0087 7F8F      ANDI	R24,0xFF
    0088 BB84      OUT	0x14,R24
(0075)  PORTC|= (1<<PC0)|(1<<PC1)|(1<<PC2);
    0089 B385      IN	R24,0x15
    008A 6087      ORI	R24,7
    008B BB85      OUT	0x15,R24
(0076)  TWCR=(1<<TWEA)|(1<<TWEN); //主机模式,使能TWI
    008C E484      LDI	R24,0x44
    008D BF86      OUT	0x36,R24
(0077)  TWBR=32;//波特率 100K   8M晶振
    008E E280      LDI	R24,0x20
    008F B980      OUT	0x00,R24
(0078) }
    0090 9508      RET
(0079) void main()
(0080) {
(0081)   uchar temp;
(0082)   Init_Io();
_main:
  temp                 --> Y+1
    0091 DFF4      RCALL	_Init_Io
(0083)   uart_init();
    0092 D06F      RCALL	_uart_init
(0084) //  puts("串口工作");
(0085)  SendByte(0x30);
    0093 E300      LDI	R16,0x30
    0094 DFD1      RCALL	_SendByte
(0086)   while(1)
    0095 CFFF      RJMP	0x0095
(0087)   {
(0088)   ;
(0089)   }
(0090)   /*for(temp=0;temp<10;temp++)
(0091)   {
(0092)     SendByte(temp+0x30);  
(0093) 	Delay_nms(10);
(0094)    }
(0095)   */
(0096) }
    0096 9508      RET
_put:
  d                    --> Y+0
  i                    --> R20
    0097 D0B7      RCALL	push_gset1
    0098 01A8      MOVW	R20,R16
    0099 9728      SBIW	R28,0x8
FILE: E:\atmega16子函数\TWI_master\uart.c
(0001) #include <iom8v.h>
(0002) #include<macros.h>
(0003) 
(0004) void put(unsigned int i)
(0005) {
(0006)  char d[8]={0};
    009A E286      LDI	R24,0x26
    009B E090      LDI	R25,0
    009C 01FE      MOVW	R30,R28
    009D E008      LDI	R16,0x8
    009E E010      LDI	R17,0
    009F 93FA      ST	R31,-Y
    00A0 93EA      ST	R30,-Y
    00A1 939A      ST	R25,-Y
    00A2 938A      ST	R24,-Y
    00A3 D0C5      RCALL	asgncblk
(0007)  Int_to_Char(i,d);
    00A4 019E      MOVW	R18,R28
    00A5 018A      MOVW	R16,R20
    00A6 D005      RCALL	_Int_to_Char
(0008)  puts(d);
    00A7 018E      MOVW	R16,R28
    00A8 D039      RCALL	_puts
(0009)  }
    00A9 9628      ADIW	R28,0x8
    00AA D0A7      RCALL	pop_gset1
    00AB 9508      RET
_Int_to_Char:
  p                    --> R20
  i                    --> R22
    00AC D0B9      RCALL	push_gset2
    00AD 01A9      MOVW	R20,R18
    00AE 01B8      MOVW	R22,R16
(0010)  void Int_to_Char(unsigned int i,char *p)
(0011)  {p[0]=i/1000+48;
    00AF EE28      LDI	R18,0xE8
    00B0 E033      LDI	R19,3
    00B1 018B      MOVW	R16,R22
    00B2 D080      RCALL	div16u
    00B3 01C8      MOVW	R24,R16
    00B4 96C0      ADIW	R24,0x30
    00B5 01FA      MOVW	R30,R20
    00B6 8380      STD	Z+0,R24
(0012)   p[1]=(i/100)%10+48;
    00B7 E624      LDI	R18,0x64
    00B8 E030      LDI	R19,0
    00B9 018B      MOVW	R16,R22
    00BA D078      RCALL	div16u
    00BB E02A      LDI	R18,0xA
    00BC E030      LDI	R19,0
    00BD D073      RCALL	mod16u
    00BE 01C8      MOVW	R24,R16
    00BF 96C0      ADIW	R24,0x30

⌨️ 快捷键说明

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