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

📄 bjdj_4.lst

📁 利用mega128控制由L298和L297构成的驱动板
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0058 EFCF      LDI	R28,0xFF
    0059 E1D0      LDI	R29,0x10
    005A BFCD      OUT	P3D,R28
    005B BFDE      OUT	P3E,R29
    005C 51C0      SUBI	R28,0x10
    005D 40D0      SBCI	R29,0
    005E EA0A      LDI	R16,0xAA
    005F 8308      STD	R16,0+Y
    0060 2400      CLR	R0
    0061 E1E4      LDI	R30,0x14
    0062 E0F1      LDI	R31,1
    0063 E011      LDI	R17,1
    0064 31E4      CPI	R30,0x14
    0065 07F1      CPC	R31,R17
    0066 F011      BEQ	0x0069
    0067 9201      ST	R0,Z+
    0068 CFFB      RJMP	0x0064
    0069 8300      STD	R16,0+Z
    006A E9EC      LDI	R30,0x9C
    006B E0F0      LDI	R31,0
    006C E0A0      LDI	R26,0
    006D E0B1      LDI	R27,1
    006E E010      LDI	R17,0
    006F 3BE0      CPI	R30,0xB0
    0070 07F1      CPC	R31,R17
    0071 F021      BEQ	0x0076
    0072 95C8      LPM
    0073 9631      ADIW	R30,1
    0074 920D      ST	R0,X+
    0075 CFF9      RJMP	0x006F
    0076 940E037C  CALL	_main
_exit:
    0078 CFFF      RJMP	_exit
_delay:
  x                    --> R20
  y                    --> R22
  z                    --> R16
    0079 940E03F6  CALL	push_gset2
FILE: E:\重新整理的文件\控制类\步进电机\程序\avr\TWI.C
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) #include "TWI.h"
(0005) 
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) #define Page_size 8
(0009) #define Page_mask Page_size-1
(0010) //#pragma data:code 
(0011) //const 
(0012) char   table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
(0013) char    table1[8]={0,0,0,0,0,0,0,0};
(0014) void delay(uint z)
(0015) {
(0016)   uint x,y;
(0017)   for(x=z;x>0;x--)
    007B 01A8      MOVW	R20,R16
    007C C00A      RJMP	0x0087
(0018)    for(y=1100;y>0;y--);
    007D E46C      LDI	R22,0x4C
    007E E074      LDI	R23,4
    007F C002      RJMP	0x0082
    0080 5061      SUBI	R22,1
    0081 4070      SBCI	R23,0
    0082 3060      CPI	R22,0
    0083 0767      CPC	R22,R23
    0084 F7D9      BNE	0x0080
    0085 5041      SUBI	R20,1
    0086 4050      SBCI	R21,0
    0087 3040      CPI	R20,0
    0088 0745      CPC	R20,R21
    0089 F799      BNE	0x007D
(0019) }
    008A 940E0406  CALL	pop_gset2
    008C 9508      RET
(0020) 
(0021) 
(0022) /*
(0023) 函数:TWI_init()
(0024) 功能:I2C总线初始化,使总线处于空闲状态
(0025) 说明:在main()函数的开始处,通常应当要执行一次本函数
(0026) */
(0027) void TWI_init()
(0028) {
(0029)     TWBR=0X22;
_TWI_init:
    008D E282      LDI	R24,0x22
    008E 93800070  STS	R24,0x70
(0030) 	TWSR=0;
    0090 2422      CLR	R2
    0091 92200071  STS	R2,0x71
(0031) 	TWCR=0X44; 
    0093 E484      LDI	R24,0x44
    0094 93800074  STS	R24,0x74
(0032) }
    0096 9508      RET
(0033) 
(0034) /*
(0035) 函数:TWI_start()
(0036) 功能:产生I2C总线的起始状态
(0037) 说明:
(0038) 	本函数也可以用来产生重复起始状态
(0039) 	本函数执行后,I2C总线处于忙状态
(0040) */
(0041) uchar TWI_start(void)
(0042) {
(0043)     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_TWI_start:
    0097 EA84      LDI	R24,0xA4
    0098 93800074  STS	R24,0x74
(0044) 	while(!(TWCR&(1<<TWINT)));
    009A 90200074  LDS	R2,0x74
    009C FE27      SBRS	R2,7
    009D CFFC      RJMP	0x009A
(0045) 	return 1;
    009E E001      LDI	R16,1
    009F 9508      RET
(0046) }
(0047) 
(0048) void TWI_stop(void)
(0049) {
(0050)     TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_TWI_stop:
    00A0 E984      LDI	R24,0x94
    00A1 93800074  STS	R24,0x74
(0051) }
    00A3 9508      RET
_TWI_writeB:
  ack                  --> R20
  c                    --> R16
    00A4 940E03DF  CALL	push_gset1
(0052) 
(0053) /*
(0054) 函数:TWI_writeB()
(0055) 功能:向I2C总线写1个字节的数据
(0056) 返回:
(0057)       0: 从机无应答
(0058) 	  1:从机应答
(0059) 参数:
(0060) 	c:要写到总线上的数据
(0061) */
(0062) uchar TWI_writeB(uchar c)
(0063) {
(0064)     uchar ack=1;
    00A6 E041      LDI	R20,1
(0065) 	TWDR=c;
    00A7 93000073  STS	R16,0x73
(0066) 	TWCR=(1<<TWINT)|(1<<TWEN);
    00A9 E884      LDI	R24,0x84
    00AA 93800074  STS	R24,0x74
(0067) 	while(!(TWCR&(1<<TWINT)));
    00AC 90200074  LDS	R2,0x74
    00AE FE27      SBRS	R2,7
    00AF CFFC      RJMP	0x00AC
(0068) 	if((TWSR&0xF8)!=SLA_W_ACK)
    00B0 91800071  LDS	R24,0x71
    00B2 7F88      ANDI	R24,0xF8
    00B3 3188      CPI	R24,0x18
    00B4 F009      BEQ	0x00B6
(0069) 	  ack=0;
    00B5 2744      CLR	R20
(0070) 	return ack;
    00B6 2F04      MOV	R16,R20
    00B7 940E03E2  CALL	pop_gset1
    00B9 9508      RET
(0071) }
(0072) 
(0073) /*
(0074) 函数:TWI_readB()
(0075) 功能:从从机读取1个字节的数据
(0076) 返回:读取的一个字节数据
(0077) 说明:ack=0; 不应答
(0078)       ack=1;  应答
(0079) */
(0080) uchar TWI_readB(uchar ack)
(0081) {
(0082)    if(ack)
_TWI_readB:
  ack                  --> R16
    00BA 2300      TST	R16
    00BB F021      BEQ	0x00C0
(0083)       TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); 
    00BC EC84      LDI	R24,0xC4
    00BD 93800074  STS	R24,0x74
    00BF C003      RJMP	0x00C3
(0084)    else
(0085)       TWCR=(1<<TWINT)|(1<<TWEN);
    00C0 E884      LDI	R24,0x84
    00C1 93800074  STS	R24,0x74
(0086)    while(!(TWCR&(1<<TWINT)));
    00C3 90200074  LDS	R2,0x74
    00C5 FE27      SBRS	R2,7
    00C6 CFFC      RJMP	0x00C3
(0087)    return(TWDR);
    00C7 91000073  LDS	R16,0x73
    00C9 9508      RET
_TWI_page_write:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R20
  devadd               --> R12
    00CA 940E03FE  CALL	push_gset4
    00CC 2F42      MOV	R20,R18
    00CD 2EC0      MOV	R12,R16
    00CE 84A8      LDD	R10,8+Y
    00CF 856A      LDD	R22,10+Y
    00D0 857B      LDD	R23,11+Y
(0088) }
(0089) 
(0090) /*
(0091) 函数:TWI_page_write()
(0092) 功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
(0093) 参数:
(0094) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0095) 	addr:从机的子地址
(0096) 	*arr:要发送的数据
(0097) 	   n:数据的字节数
(0098) 返回:
(0099) 	1:发送成功
(0100) 	0:在发送过程中出现异常
(0101) 说明:
(0102) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0103) 	当从机没有子地址时,参数addr任意
(0104) */
(0105) uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0106) {
(0107)     uchar i;
(0108) 	TWI_start();
    00D1 DFC5      RCALL	_TWI_start
(0109) 	TWI_writeB(devadd);
    00D2 2D0C      MOV	R16,R12
    00D3 DFD0      RCALL	_TWI_writeB
(0110) 	TWI_writeB(addr);
    00D4 2F04      MOV	R16,R20
    00D5 DFCE      RCALL	_TWI_writeB
(0111) 	for(i=1;i<=n;i++)
    00D6 E041      LDI	R20,1
    00D7 C006      RJMP	0x00DE
(0112) 	 {
(0113) 	   //TWI_writeB(i);
(0114) 	   //table[i]=i;
(0115) 	   TWI_writeB(*arr);
    00D8 01FB      MOVW	R30,R22
    00D9 8100      LDD	R16,0+Z
    00DA DFC9      RCALL	_TWI_writeB
(0116) 	   arr++;
    00DB 5F6F      SUBI	R22,0xFF
    00DC 4F7F      SBCI	R23,0xFF
    00DD 9543      INC	R20
    00DE 16A4      CP	R10,R20
    00DF F7C0      BCC	0x00D8
(0117) 	 }
(0118) 	TWI_stop();
    00E0 DFBF      RCALL	_TWI_stop
(0119) 	delay(80);
    00E1 E500      LDI	R16,0x50
    00E2 E010      LDI	R17,0
    00E3 DF95      RCALL	_delay
(0120) }
    00E4 940E040C  CALL	pop_gset4
    00E6 9508      RET
_TWI_write:
  n_tmp                --> R14
  arr                  --> R20
  n                    --> R22
  addr                 --> R10
  devadd               --> R12
    00E7 940E0402  CALL	push_gset5
    00E9 2EA2      MOV	R10,R18
    00EA 2EC0      MOV	R12,R16
    00EB 9724      SBIW	R28,4
    00EC 856E      LDD	R22,14+Y
    00ED 8948      LDD	R20,16+Y
    00EE 8959      LDD	R21,17+Y
(0121) 
(0122) /*
(0123) 函数:TWI_page_write()
(0124) 功能:I2C总线综合发送函数,向从机发送多个字节的数据
(0125) 参数:
(0126) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0127) 	addr:从机的子地址
(0128) 	*arr:要发送的数据
(0129) 	   n:数据的字节数
(0130) 返回:
(0131) 	1:发送成功
(0132) 	0:在发送过程中出现异常
(0133) 说明:
(0134) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0135) 	当从机没有子地址时,参数addr任意
(0136) */
(0137) uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0138) {
(0139)     uchar n_tmp;
(0140) 	n_tmp=Page_size-(uchar)(addr&Page_mask);
    00EF 2D8A      MOV	R24,R10
    00F0 2799      CLR	R25
    00F1 7087      ANDI	R24,7
    00F2 7090      ANDI	R25,0
    00F3 E098      LDI	R25,0x8
    00F4 2EE9      MOV	R14,R25
    00F5 1AE8      SUB	R14,R24
(0141) 	if((n>n_tmp)&&(n_tmp!=0))
    00F6 16E6      CP	R14,R22
    00F7 F4E0      BCC	0x0114
    00F8 20EE      TST	R14
    00F9 F0D1      BEQ	0x0114
(0142) 	 {
(0143) 	   TWI_page_write(devadd,addr,n_tmp,arr);//
    00FA 834A      STD	R20,2+Y
    00FB 835B      STD	R21,3+Y
    00FC 82E8      STD	R14,0+Y
    00FD 2D2A      MOV	R18,R10
    00FE 2D0C      MOV	R16,R12
    00FF DFCA      RCALL	_TWI_page_write
(0144) 	   addr+=n_tmp;
    0100 0CAE      ADD	R10,R14
(0145) 	   n-=n_tmp;
    0101 196E      SUB	R22,R14
(0146) 	   arr+=n_tmp;
    0102 2C2E      MOV	R2,R14
    0103 2433      CLR	R3
    0104 0D42      ADD	R20,R2
    0105 1D53      ADC	R21,R3
(0147) 	 }
    0106 C00D      RJMP	0x0114
(0148) 	while(n>=Page_size)
(0149) 	 {
(0150) 	   TWI_page_write(devadd,addr,Page_size,arr);//
    0107 834A      STD	R20,2+Y
    0108 835B      STD	R21,3+Y
    0109 E088      LDI	R24,0x8
    010A 8388      STD	R24,0+Y
    010B 2D2A      MOV	R18,R10
    010C 2D0C      MOV	R16,R12
    010D DFBC      RCALL	_TWI_page_write
(0151) 	   addr+=Page_size;
    010E 2D8A      MOV	R24,R10
    010F 5F88      SUBI	R24,0xF8
    0110 2EA8      MOV	R10,R24
(0152) 	   n-=Page_size;
    0111 5068      SUBI	R22,0x8
(0153) 	   arr+=Page_size;
    0112 5F48      SUBI	R20,0xF8
    0113 4F5F      SBCI	R21,0xFF
    0114 3068      CPI	R22,0x8
    0115 F788      BCC	0x0107
(0154) 	 }
(0155) 	if(n!=0)
    0116 2366      TST	R22
    0117 F031      BEQ	0x011E
(0156) 	   TWI_page_write(devadd,addr,n,arr);//
    0118 834A      STD	R20,2+Y
    0119 835B      STD	R21,3+Y
    011A 8368      STD	R22,0+Y
    011B 2D2A      MOV	R18,R10
    011C 2D0C      MOV	R16,R12
    011D DFAC      RCALL	_TWI_page_write
(0157) }
    011E 9624      ADIW	R28,4
    011F 940E040F  CALL	pop_gset5
    0121 9508      RET
_TWI_read:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R12
  devadd               --> R20
    0122 940E03FE  CALL	push_gset4
    0124 2EC2      MOV	R12,R18
    0125 2F40      MOV	R20,R16
    0126 84A8      LDD	R10,8+Y
    0127 856A      LDD	R22,10+Y
    0128 857B      LDD	R23,11+Y
(0158) 
(0159) /*
(0160) 函数:TWI_read()
(0161) 功能:I2C总线综合接收函数,从从机接收多个字节的数据
(0162) 参数:
(0163) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0164) 	addr:从机的子地址
(0165) 	*arr:要发送的数据
(0166) 	   n:数据的字节数
(0167) 返回:
(0168) 	1:接收成功
(0169) 	0:在接收过程中出现异常
(0170) 说明:
(0171) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0172) 	当从机没有子地址时,参数addr任意
(0173) */
(0174) uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
(0175) {
(0176)     uchar i;
(0177) 	TWI_start();
    0129 DF6D      RCALL	_TWI_start
(0178) 	TWI_writeB(devadd);
    012A 2F04      MOV	R16,R20
    012B DF78      RCALL	_TWI_writeB
(0179) 	TWI_writeB(addr);
    012C 2D0C      MOV	R16,R12
    012D DF76      RCALL	_TWI_writeB
(0180) 	TWI_start();
    012E DF68      RCALL	_TWI_start
(0181) 	TWI_writeB(devadd|1);
    012F 2F04      MOV	R16,R20
    0130 6001      ORI	R16,1
    0131 DF72      RCALL	_TWI_writeB
(0182) 	for(i=1;i<=n-1;i++)
    0132 E041      LDI	R20,1
    0133 C007      RJMP	0x013B
(0183) 	 {
(0184) 	  *arr= TWI_readB(1);
    0134 E001      LDI	R16,1
    0135 DF84      RCALL	_TWI_readB
    0136 01FB      MOVW	R30,R22
    0137 8300      STD	R16,0+Z

⌨️ 快捷键说明

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