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

📄 twi_slaver.lst

📁 ICCavr编写的TWI总线协议读写函数
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0024 E5CF      LDI	R28,0x5F
    0025 E0D4      LDI	R29,4
    0026 BFCD      OUT	0x3D,R28
    0027 BFDE      OUT	0x3E,R29
    0028 51C0      SUBI	R28,0x10
    0029 40D0      SBCI	R29,0
    002A EA0A      LDI	R16,0xAA
    002B 8308      STD	Y+0,R16
    002C 2400      CLR	R0
    002D E7E9      LDI	R30,0x79
    002E E0F0      LDI	R31,0
    002F E010      LDI	R17,0
    0030 37E9      CPI	R30,0x79
    0031 07F1      CPC	R31,R17
    0032 F011      BEQ	0x0035
    0033 9201      ST	R0,Z+
    0034 CFFB      RJMP	0x0030
    0035 8300      STD	Z+0,R16
    0036 E2EE      LDI	R30,0x2E
    0037 E0F0      LDI	R31,0
    0038 E6A0      LDI	R26,0x60
    0039 E0B0      LDI	R27,0
    003A E010      LDI	R17,0
    003B 34E7      CPI	R30,0x47
    003C 07F1      CPC	R31,R17
    003D F021      BEQ	0x0042
    003E 95C8      LPM
    003F 9631      ADIW	R30,1
    0040 920D      ST	R0,X+
    0041 CFF9      RJMP	0x003B
    0042 D123      RCALL	_main
_exit:
    0043 CFFF      RJMP	_exit
FILE: D:\AVR\代码\ICCdaima\TWI\delay.c
(0001) 
(0002) 
(0003) void Delay_nus(unsigned int i) 
(0004) {
(0005)    for(;i>1;i--){;}
_Delay_nus:
  i                    --> R16
    0044 C002      RJMP	0x0047
    0045 5001      SUBI	R16,1
    0046 4010      SBCI	R17,0
    0047 E081      LDI	R24,1
    0048 E090      LDI	R25,0
    0049 1780      CP	R24,R16
    004A 0791      CPC	R25,R17
    004B F3C8      BCS	0x0045
(0006) }
    004C 9508      RET
_Delay_1ms:
  i                    --> R20
    004D D14E      RCALL	push_gset1
(0007) void Delay_1ms(void) 
(0008) {unsigned i;
(0009)    for(i=1000;i>1;i--)
    004E EE48      LDI	R20,0xE8
    004F E053      LDI	R21,3
    0050 C005      RJMP	0x0056
(0010)    {Delay_nus(1);
    0051 E001      LDI	R16,1
    0052 E010      LDI	R17,0
    0053 DFF0      RCALL	_Delay_nus
    0054 5041      SUBI	R20,1
    0055 4050      SBCI	R21,0
    0056 D1AB      RCALL	0x0202
    0057 F3C8      BCS	0x0051
(0011)      }
(0012) }
    0058 D146      RCALL	pop_gset1
    0059 9508      RET
_Delay_nms:
  i                    --> R20
    005A D141      RCALL	push_gset1
    005B 01A8      MOVW	R20,R16
(0013) void Delay_nms(unsigned int  i) 
(0014) {
(0015)    for(;i>1;i--)
    005C C003      RJMP	0x0060
(0016)    {Delay_1ms();}
    005D DFEF      RCALL	_Delay_1ms
    005E 5041      SUBI	R20,1
    005F 4050      SBCI	R21,0
    0060 D1A1      RCALL	0x0202
    0061 F3D8      BCS	0x005D
(0017) }
    0062 D13C      RCALL	pop_gset1
    0063 9508      RET
_put:
  d                    --> Y+0
  i                    --> R20
    0064 D137      RCALL	push_gset1
    0065 01A8      MOVW	R20,R16
    0066 9728      SBIW	R28,0x8
FILE: D:\AVR\代码\ICCdaima\TWI\UART.c
(0001) #include <iom8v.h>
(0002) #include<macros.h>
(0003) 
(0004) void put(unsigned int i)
(0005) {
(0006)  char d[8]={0};
    0067 E286      LDI	R24,0x26
    0068 E090      LDI	R25,0
    0069 01FE      MOVW	R30,R28
    006A E008      LDI	R16,0x8
    006B E010      LDI	R17,0
    006C 93FA      ST	R31,-Y
    006D 93EA      ST	R30,-Y
    006E 939A      ST	R25,-Y
    006F 938A      ST	R24,-Y
    0070 D173      RCALL	asgncblk
(0007)  Int_to_Char(i,d);
    0071 019E      MOVW	R18,R28
    0072 018A      MOVW	R16,R20
    0073 D005      RCALL	_Int_to_Char
(0008)  puts(d);
    0074 018E      MOVW	R16,R28
    0075 D039      RCALL	_puts
(0009)  }
    0076 9628      ADIW	R28,0x8
    0077 D127      RCALL	pop_gset1
    0078 9508      RET
_Int_to_Char:
  p                    --> R20
  i                    --> R22
    0079 D139      RCALL	push_gset2
    007A 01A9      MOVW	R20,R18
    007B 01B8      MOVW	R22,R16
(0010)  void Int_to_Char(unsigned int i,char *p)
(0011)  {p[0]=i/1000+48;
    007C EE28      LDI	R18,0xE8
    007D E033      LDI	R19,3
    007E 018B      MOVW	R16,R22
    007F D100      RCALL	div16u
    0080 01C8      MOVW	R24,R16
    0081 96C0      ADIW	R24,0x30
    0082 01FA      MOVW	R30,R20
    0083 8380      STD	Z+0,R24
(0012)   p[1]=(i/100)%10+48;
    0084 E624      LDI	R18,0x64
    0085 E030      LDI	R19,0
    0086 018B      MOVW	R16,R22
    0087 D0F8      RCALL	div16u
    0088 E02A      LDI	R18,0xA
    0089 E030      LDI	R19,0
    008A D0F3      RCALL	mod16u
    008B 01C8      MOVW	R24,R16
    008C 96C0      ADIW	R24,0x30
    008D 01FA      MOVW	R30,R20
    008E 8381      STD	Z+1,R24
(0013)   p[2]=(i%100)/10+48;
    008F E624      LDI	R18,0x64
    0090 E030      LDI	R19,0
    0091 018B      MOVW	R16,R22
    0092 D0EB      RCALL	mod16u
    0093 E02A      LDI	R18,0xA
    0094 E030      LDI	R19,0
    0095 D0EA      RCALL	div16u
    0096 01C8      MOVW	R24,R16
    0097 96C0      ADIW	R24,0x30
    0098 01FA      MOVW	R30,R20
    0099 8382      STD	Z+2,R24
(0014)   p[3]=(i%100)%10+48;
    009A E624      LDI	R18,0x64
    009B E030      LDI	R19,0
    009C 018B      MOVW	R16,R22
    009D D0E0      RCALL	mod16u
    009E E02A      LDI	R18,0xA
    009F E030      LDI	R19,0
    00A0 D0DD      RCALL	mod16u
    00A1 01C8      MOVW	R24,R16
    00A2 96C0      ADIW	R24,0x30
    00A3 01FA      MOVW	R30,R20
    00A4 8383      STD	Z+3,R24
(0015)  }
    00A5 D0F4      RCALL	pop_gset2
    00A6 9508      RET
(0016) /*          字符输出函数         */
(0017) void putchar(char c)
(0018)     {    
(0019)      while (!(UCSRA&(1<<UDRE)));
_putchar:
  c                    --> R16
    00A7 9B5D      SBIS	0x0B,5
    00A8 CFFE      RJMP	_putchar
(0020)      UDR=c;    
    00A9 B90C      OUT	0x0C,R16
(0021)     }
    00AA 9508      RET
(0022) /*          字符输入函数         */	
(0023) unsigned char getchar(void)
(0024)     {
(0025)      while(!(UCSRA& (1<<RXC)));
_getchar:
    00AB 9B5F      SBIS	0x0B,7
    00AC CFFE      RJMP	_getchar
(0026)      
(0027) 	 return UDR;
    00AD B10C      IN	R16,0x0C
    00AE 9508      RET
_puts:
  s                    --> R20
    00AF D0EC      RCALL	push_gset1
    00B0 01A8      MOVW	R20,R16
(0028)     }   	
(0029) /*          字符串输出函数       */ 
(0030) void puts(char * s)
(0031)     {
    00B1 C005      RJMP	0x00B7
(0032)     while (*s)
(0033)         {
(0034)         putchar(*s);
    00B2 01FA      MOVW	R30,R20
    00B3 8100      LDD	R16,Z+0
    00B4 DFF2      RCALL	_putchar
(0035)         s++;
    00B5 5F4F      SUBI	R20,0xFF
    00B6 4F5F      SBCI	R21,0xFF
    00B7 01FA      MOVW	R30,R20
    00B8 8020      LDD	R2,Z+0
    00B9 2022      TST	R2
    00BA F7B9      BNE	0x00B2
(0036)         }	
(0037)     putchar(0x0a);//回车换行
    00BB E00A      LDI	R16,0xA
    00BC DFEA      RCALL	_putchar
(0038)     putchar(0x0d);
    00BD E00D      LDI	R16,0xD
    00BE DFE8      RCALL	_putchar
(0039)     
(0040)     }
    00BF D0DF      RCALL	pop_gset1
    00C0 9508      RET
_putstr:
  s                    --> R20
    00C1 D0DA      RCALL	push_gset1
    00C2 01A8      MOVW	R20,R16
(0041) /*         不含回车换行的字符串输出函数      */ 
(0042) void putstr(char * s)
(0043)     {
    00C3 C005      RJMP	0x00C9
(0044)     while (*s)
(0045)         {
(0046)         putchar(*s);
    00C4 01FA      MOVW	R30,R20
    00C5 8100      LDD	R16,Z+0
    00C6 DFE0      RCALL	_putchar
(0047)         s++;
    00C7 5F4F      SUBI	R20,0xFF
    00C8 4F5F      SBCI	R21,0xFF
    00C9 01FA      MOVW	R30,R20
    00CA 8020      LDD	R2,Z+0
    00CB 2022      TST	R2
    00CC F7B9      BNE	0x00C4
(0048)         }	
(0049)     }   
    00CD D0D1      RCALL	pop_gset1
    00CE 9508      RET
(0050) /*          UART初始化          	*/	
(0051) void uart_init(void)
(0052) {
(0053)  
(0054)  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);;//允许发送和接收
_uart_init:
    00CF E988      LDI	R24,0x98
    00D0 B98A      OUT	0x0A,R24
(0055)  UBRRL=47;
    00D1 E28F      LDI	R24,0x2F
    00D2 B989      OUT	0x09,R24
(0056)  UBRRH=0;  //    7.3728M    9600;  4M 25
    00D3 2422      CLR	R2
    00D4 BC20      OUT	0x20,R2
(0057)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    00D5 E886      LDI	R24,0x86
    00D6 BD80      OUT	0x20,R24
(0058) }
    00D7 9508      RET
FILE: D:\AVR\代码\ICCdaima\TWI\slaver_1.c
(0001) /* 段传辉 2008 1.21
(0002)    TWI 从机的查询和中断接收  依靠广播0X00地址
(0003)    ICCAVR6.31A  chuanhuibh@sina.com
(0004) */
(0005) #include"iom8v.h"
(0006) #include"UART.h"
(0007) #include"delay.h"
(0008) #define  uchar  unsigned char
(0009) #define  STATUS  (TWSR&0xf8)
(0010) #define  SLA_W    0x32
(0011) #define  SLA_R    0x33
(0012) #define  TWI_ADDRESS        0x32
(0013) #define  START              0x08
(0014) #define  RE_START           0x10
(0015) #define  MT_SLA_WRITE_ACK   0x18
(0016) #define  MT_SLA_READ_ACK    0x40 
(0017) #define  MT_DATA_ACK        0x28
(0018) #define  MT_READ_ACK        0x58  
(0019) #define TW_SR_DATA_ACK		0x80   
(0020) 
(0021) void Start(void)
(0022) {
(0023)  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_Start:
    00D8 EA84      LDI	R24,0xA4
    00D9 D123      RCALL	<created procedures>
(0024)  while(!(TWCR&(1<<TWINT)));
(0025) }
    00DA 9508      RET
(0026) void Stop(void)
(0027) {
(0028)  TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_Stop:
    00DB E984      LDI	R24,0x94
    00DC BF86      OUT	0x36,R24
(0029) }
    00DD 9508      RET
(0030) void Load(uchar i)
(0031) {
(0032)  TWDR=i;
_Load:
  i                    --> R16
    00DE B903      OUT	0x03,R16
(0033)  TWCR=(1<<TWINT)|(1<<TWEN);
    00DF E884      LDI	R24,0x84
    00E0 D11C      RCALL	<created procedures>
(0034)  while(!(TWCR&(1<<TWINT))); 
(0035) 
(0036) }
    00E1 9508      RET
(0037) 
(0038) void Get(unsigned char *d)
(0039) {
(0040)  TWCR=(1<<TWINT)|(1<<TWEN);
_Get:
  d                    --> R16
    00E2 E884      LDI	R24,0x84
    00E3 D119      RCALL	<created procedures>
(0041)  while(!(TWCR&(1<<TWINT)));
(0042)  *d= TWDR;
    00E4 B023      IN	R2,0x03
    00E5 01F8      MOVW	R30,R16
    00E6 8220      STD	Z+0,R2
(0043) }/**/
    00E7 9508      RET
_ERROR:
  state                --> R20
    00E8 D0B3      RCALL	push_gset1
    00E9 2F40      MOV	R20,R16
(0044) void ERROR(uchar state)
(0045) {Stop();
    00EA DFF0      RCALL	_Stop
(0046) }
    00EB D0B3      RCALL	pop_gset1
    00EC 9508      RET
_WriteByte:
  data                 --> R20
    00ED D0AE      RCALL	push_gset1
    00EE 2F40      MOV	R20,R16
(0047) 
(0048) /*写一个字节data,成功则返回1,否则
(0049)   返回0*/
(0050) uchar WriteByte(uchar data)
(0051) {
(0052)    //启动I2C
(0053)    Start();
    00EF DFE8      RCALL	_Start
(0054)    if(STATUS!=START) {ERROR(STATUS);return 0;}
    00F0 B181      IN	R24,0x01
    00F1 7F88      ANDI	R24,0xF8
    00F2 3088      CPI	R24,0x8
    00F3 F029      BEQ	0x00F9
    00F4 B101      IN	R16,0x01
    00F5 7F08      ANDI	R16,0xF8
    00F6 DFF1      RCALL	_ERROR
    00F7 2700      CLR	R16
    00F8 C018      RJMP	0x0111
(0055)    
(0056)    //发送从机地址(写),等待回应, 错误检测
(0057)    Load(SLA_W);
    00F9 E302      LDI	R16,0x32
    00FA DFE3      RCALL	_Load
(0058)    if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
    00FB B181      IN	R24,0x01
    00FC 7F88      ANDI	R24,0xF8

⌨️ 快捷键说明

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