?? 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 + -