📄 bjdj_4.lst
字号:
__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 + -