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

📄 twi_slaver.lst

📁 atmega16 iic(twi)主从机通信 测试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0113)  
(0114) 	//TWI接口初始化,从器件模式
(0115)  TWAR=TWI_ADDRESS | (1<<TWGCE);
    0110 E383      LDI	R24,0x33
    0111 B982      OUT	0x02,R24
(0116)  TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
    0112 E485      LDI	R24,0x45
    0113 BF86      OUT	0x36,R24
(0117)  asm("SEI");
    0114 9478      BSET	7
(0118) }
    0115 9508      RET
(0119) void main()
(0120) {
(0121)   uchar temp1,temp2;
(0122)   Init_Io();
_main:
  temp2                --> R20
  temp1                --> R22
    0116 DFF3      RCALL	_Init_Io
(0123)   uart_init();
    0117 940E01B2  CALL	_uart_init
    0119 C00D      RJMP	0x0127
(0124)  // puts("串口正常工作");
(0125)   while(1)
(0126)   { 
(0127)     TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //启动一次接收
    011A EC84      LDI	R24,0xC4
    011B BF86      OUT	0x36,R24
(0128)     while((TWCR&(1<<TWINT))==0); //等待有数据被接收
    011C B626      IN	R2,0x36
    011D FE27      SBRS	R2,7
    011E CFFD      RJMP	0x011C
(0129) 	//Delay_nms(100);
(0130) 	temp1=STATUS;
    011F B161      IN	R22,0x01
    0120 7F68      ANDI	R22,0xF8
(0131) 	
(0132) 	temp2=TWDR;
    0121 B143      IN	R20,0x03
(0133) 	//UDR = temp2;
(0134) 	//putchar(temp1);
(0135) 	if(temp1==0x90)
    0122 3960      CPI	R22,0x90
    0123 F419      BNE	0x0127
(0136) 	{ 
(0137) 	//  puts("接受到:");
(0138) 	  putchar(temp2);
    0124 2F04      MOV	R16,R20
    0125 940E0186  CALL	_putchar
    0127 CFF2      RJMP	0x011A
(0139) 	 }
(0140) 	
(0141) 	
(0142)    }
(0143)  
(0144) }
    0128 9508      RET
_TWI_ISR:
  temp2                --> R16
  temp1                --> R16
    0129 930A      ST	R16,-Y
    012A 938A      ST	R24,-Y
    012B B70F      IN	R16,0x3F
    012C 930A      ST	R16,-Y
(0145) #pragma interrupt_handler TWI_ISR:18
(0146) void TWI_ISR(void)
(0147) {
(0148)  uchar temp1,temp2;
(0149)  temp1=STATUS;
    012D B101      IN	R16,0x01
    012E 7F08      ANDI	R16,0xF8
(0150)  temp2=TWDR;
    012F B103      IN	R16,0x03
(0151) /* if(temp1==0x90)
(0152) 	{ 
(0153) 	  puts("接受到:");
(0154) 	  putchar(temp2);
(0155) 	 }*/
(0156) TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //启动一次接收
    0130 EC85      LDI	R24,0xC5
    0131 BF86      OUT	0x36,R24
(0157) 
(0158) }
    0132 9109      LD	R16,Y+
    0133 BF0F      OUT	0x3F,R16
    0134 9189      LD	R24,Y+
    0135 9109      LD	R16,Y+
    0136 9518      RETI
_put:
  d                    --> Y+0
  i                    --> R20
    0137 940E01DA  CALL	push_gset1
    0139 01A8      MOVW	R20,R16
    013A 9728      SBIW	R28,0x8
FILE: E:\atmega16子函数\TWI_slaver0\uart.c
(0001) #include <iom16v.h>
(0002) #include<macros.h>
(0003) 
(0004) void put(unsigned int i)
(0005) {
(0006)  char d[8]={0};
    013B E584      LDI	R24,0x54
    013C E090      LDI	R25,0
    013D 01FE      MOVW	R30,R28
    013E E008      LDI	R16,0x8
    013F E010      LDI	R17,0
    0140 93FA      ST	R31,-Y
    0141 93EA      ST	R30,-Y
    0142 939A      ST	R25,-Y
    0143 938A      ST	R24,-Y
    0144 940E01F5  CALL	asgncblk
(0007)  Int_to_Char(i,d);
    0146 019E      MOVW	R18,R28
    0147 018A      MOVW	R16,R20
    0148 D006      RCALL	_Int_to_Char
(0008)  puts(d);
    0149 018E      MOVW	R16,R28
    014A D043      RCALL	_puts
(0009)  }
    014B 9628      ADIW	R28,0x8
    014C 940E01DD  CALL	pop_gset1
    014E 9508      RET
_Int_to_Char:
  p                    --> R20
  i                    --> R22
    014F 940E01F1  CALL	push_gset2
    0151 01A9      MOVW	R20,R18
    0152 01B8      MOVW	R22,R16
(0010)  void Int_to_Char(unsigned int i,char *p)
(0011)  {p[0]=i/1000+48;
    0153 EE28      LDI	R18,0xE8
    0154 E033      LDI	R19,3
    0155 018B      MOVW	R16,R22
    0156 940E01BD  CALL	div16u
    0158 01C8      MOVW	R24,R16
    0159 96C0      ADIW	R24,0x30
    015A 01FA      MOVW	R30,R20
    015B 8380      STD	Z+0,R24
(0012)   p[1]=(i/100)%10+48;
    015C E624      LDI	R18,0x64
    015D E030      LDI	R19,0
    015E 018B      MOVW	R16,R22
    015F 940E01BD  CALL	div16u
    0161 E02A      LDI	R18,0xA
    0162 E030      LDI	R19,0
    0163 940E01BB  CALL	mod16u
    0165 01C8      MOVW	R24,R16
    0166 96C0      ADIW	R24,0x30
    0167 01FA      MOVW	R30,R20
    0168 8381      STD	Z+1,R24
(0013)   p[2]=(i%100)/10+48;
    0169 E624      LDI	R18,0x64
    016A E030      LDI	R19,0
    016B 018B      MOVW	R16,R22
    016C 940E01BB  CALL	mod16u
    016E E02A      LDI	R18,0xA
    016F E030      LDI	R19,0
    0170 940E01BD  CALL	div16u
    0172 01C8      MOVW	R24,R16
    0173 96C0      ADIW	R24,0x30
    0174 01FA      MOVW	R30,R20
    0175 8382      STD	Z+2,R24
(0014)   p[3]=(i%100)%10+48;
    0176 E624      LDI	R18,0x64
    0177 E030      LDI	R19,0
    0178 018B      MOVW	R16,R22
    0179 940E01BB  CALL	mod16u
    017B E02A      LDI	R18,0xA
    017C E030      LDI	R19,0
    017D 940E01BB  CALL	mod16u
    017F 01C8      MOVW	R24,R16
    0180 96C0      ADIW	R24,0x30
    0181 01FA      MOVW	R30,R20
    0182 8383      STD	Z+3,R24
(0015)  }
    0183 940E01D7  CALL	pop_gset2
    0185 9508      RET
(0016) /*          字符输出函数         */
(0017) void putchar(char c)
(0018)     {    
(0019)      while (!(UCSRA&(1<<UDRE)));
_putchar:
  c                    --> R16
    0186 9B5D      SBIS	0x0B,5
    0187 CFFE      RJMP	_putchar
(0020)      UDR=c;    
    0188 B90C      OUT	0x0C,R16
(0021)     }
    0189 9508      RET
(0022) /*          字符输入函数         */	
(0023) unsigned char getchar(void)
(0024)     {
(0025)      while(!(UCSRA& (1<<RXC)));
_getchar:
    018A 9B5F      SBIS	0x0B,7
    018B CFFE      RJMP	_getchar
(0026)      
(0027) 	 return UDR;
    018C B10C      IN	R16,0x0C
    018D 9508      RET
_puts:
  s                    --> R20
    018E 940E01DA  CALL	push_gset1
    0190 01A8      MOVW	R20,R16
(0028)     }   	
(0029) /*          字符串输出函数       */ 
(0030) void puts(char * s)
(0031)     {
    0191 C005      RJMP	0x0197
(0032)     while (*s)
(0033)         {
(0034)         putchar(*s);
    0192 01FA      MOVW	R30,R20
    0193 8100      LDD	R16,Z+0
    0194 DFF1      RCALL	_putchar
(0035)         s++;
    0195 5F4F      SUBI	R20,0xFF
    0196 4F5F      SBCI	R21,0xFF
    0197 01FA      MOVW	R30,R20
    0198 8020      LDD	R2,Z+0
    0199 2022      TST	R2
    019A F7B9      BNE	0x0192
(0036)         }	
(0037)     putchar(0x0a);//回车换行
    019B E00A      LDI	R16,0xA
    019C DFE9      RCALL	_putchar
(0038)     putchar(0x0d);
    019D E00D      LDI	R16,0xD
    019E DFE7      RCALL	_putchar
(0039)     
(0040)     }
    019F 940E01DD  CALL	pop_gset1
    01A1 9508      RET
_putstr:
  s                    --> R20
    01A2 940E01DA  CALL	push_gset1
    01A4 01A8      MOVW	R20,R16
(0041) /*         不含回车换行的字符串输出函数      */ 
(0042) void putstr(char * s)
(0043)     {
    01A5 C005      RJMP	0x01AB
(0044)     while (*s)
(0045)         {
(0046)         putchar(*s);
    01A6 01FA      MOVW	R30,R20
    01A7 8100      LDD	R16,Z+0
    01A8 DFDD      RCALL	_putchar
(0047)         s++;
    01A9 5F4F      SUBI	R20,0xFF
    01AA 4F5F      SBCI	R21,0xFF
    01AB 01FA      MOVW	R30,R20
    01AC 8020      LDD	R2,Z+0
    01AD 2022      TST	R2
    01AE F7B9      BNE	0x01A6
(0048)         }	
(0049)     }   
    01AF 940E01DD  CALL	pop_gset1
    01B1 9508      RET
(0050) /*          UART初始化          	*/	
(0051) void uart_init(void)
(0052) {
(0053)  
(0054)  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);;//允许发送和接收
_uart_init:
    01B2 E988      LDI	R24,0x98
    01B3 B98A      OUT	0x0A,R24
(0055)  UBRRL=47;  // 4M 25        8M 51    7.3728M 47
    01B4 E28F      LDI	R24,0x2F
    01B5 B989      OUT	0x09,R24
(0056)  UBRRH=0;  //       9600;   
    01B6 2422      CLR	R2
    01B7 BC20      OUT	0x20,R2
(0057)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    01B8 E886      LDI	R24,0x86
    01B9 BD80      OUT	0x20,R24
(0058) }
FILE: <library>
    01BA 9508      RET
mod16u:
    01BB 9468      BSET	6
    01BC C001      RJMP	xdiv16u
div16u:
    01BD 94E8      BCLR	6
xdiv16u:
    01BE 92EA      ST	R14,-Y
    01BF 92FA      ST	R15,-Y
    01C0 938A      ST	R24,-Y
    01C1 24EE      CLR	R14
    01C2 24FF      CLR	R15
    01C3 E180      LDI	R24,0x10
    01C4 0F00      LSL	R16
    01C5 1F11      ROL	R17
    01C6 1CEE      ROL	R14
    01C7 1CFF      ROL	R15
    01C8 16E2      CP	R14,R18
    01C9 06F3      CPC	R15,R19
    01CA F018      BCS	0x01CE
    01CB 1AE2      SUB	R14,R18
    01CC 0AF3      SBC	R15,R19
    01CD 9503      INC	R16
    01CE 958A      DEC	R24
    01CF F7A1      BNE	0x01C4
    01D0 F416      BRTC	0x01D3
    01D1 2D0E      MOV	R16,R14
    01D2 2D1F      MOV	R17,R15
    01D3 9189      LD	R24,Y+
    01D4 90F9      LD	R15,Y+
    01D5 90E9      LD	R14,Y+
    01D6 9508      RET
pop_gset2:
    01D7 E0E2      LDI	R30,2
    01D8 940C01DE  JMP	pop
push_gset1:
    01DA 935A      ST	R21,-Y
    01DB 934A      ST	R20,-Y
    01DC 9508      RET
pop_gset1:
    01DD E0E1      LDI	R30,1
pop:
    01DE 9149      LD	R20,Y+
    01DF 9159      LD	R21,Y+
    01E0 FDE0      SBRC	R30,0
    01E1 9508      RET
    01E2 9169      LD	R22,Y+
    01E3 9179      LD	R23,Y+
    01E4 FDE1      SBRC	R30,1
    01E5 9508      RET
    01E6 90A9      LD	R10,Y+
    01E7 90B9      LD	R11,Y+
    01E8 FDE2      SBRC	R30,2
    01E9 9508      RET
    01EA 90C9      LD	R12,Y+
    01EB 90D9      LD	R13,Y+
    01EC FDE3      SBRC	R30,3
    01ED 9508      RET
    01EE 90E9      LD	R14,Y+
    01EF 90F9      LD	R15,Y+
    01F0 9508      RET
push_gset2:
    01F1 937A      ST	R23,-Y
    01F2 936A      ST	R22,-Y
    01F3 940C01DA  JMP	push_gset1
asgncblk:
    01F5 93AA      ST	R26,-Y
    01F6 93BA      ST	R27,-Y
    01F7 93EA      ST	R30,-Y
    01F8 93FA      ST	R31,-Y
    01F9 920A      ST	R0,-Y
    01FA 81AF      LDD	R26,Y+7
    01FB 85B8      LDD	R27,Y+8
    01FC 81ED      LDD	R30,Y+5
    01FD 81FE      LDD	R31,Y+6
    01FE 3000      CPI	R16,0
    01FF 0701      CPC	R16,R17
    0200 F031      BEQ	0x0207
    0201 95C8      LPM
    0202 920D      ST	R0,X+
    0203 9631      ADIW	R30,1
    0204 5001      SUBI	R16,1
    0205 4010      SBCI	R17,0
    0206 CFF7      RJMP	0x01FE
    0207 9009      LD	R0,Y+
    0208 91F9      LD	R31,Y+
    0209 91E9      LD	R30,Y+
    020A 91B9      LD	R27,Y+
    020B 91A9      LD	R26,Y+
    020C 9624      ADIW	R28,4
    020D 9508      RET

⌨️ 快捷键说明

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