?? read-byte.lst
字號(hào):
__start:
__text_start:
46 EFCF LDI R28,0xFF
47 E1D0 LDI R29,0x10
48 BFCD OUT 0x3D,R28
49 BFDE OUT 0x3E,R29
4A 51CE SUBI R28,0x1E
4B 40D0 SBCI R29,0
4C EA0A LDI R16,0xAA
4D 8308 STD Y+0,R16
4E 2400 CLR R0
4F E0E0 LDI R30,0
50 E0F1 LDI R31,1
51 E011 LDI R17,1
52 30E0 CPI R30,0
53 07F1 CPC R31,R17
54 F011 BEQ 0x0057
55 9201 ST R0,Z+
56 CFFB RJMP 0x0052
57 8300 STD Z+0,R16
58 E8EC LDI R30,0x8C
59 E0F0 LDI R31,0
5A E0A0 LDI R26,0
5B E0B1 LDI R27,1
5C E010 LDI R17,0
5D E000 LDI R16,0
5E BF0B OUT 0x3B,R16
5F 38EC CPI R30,0x8C
60 07F1 CPC R31,R17
61 F021 BEQ 0x0066
62 95C8 LPM
63 9631 ADIW R30,1
64 920D ST R0,X+
65 CFF9 RJMP 0x005F
66 940E 00EF CALL _main
_exit:
68 CFFF RJMP _exit
FILE: D:\16實(shí)驗(yàn)程序\I2C讀寫(xiě)24C04\讀一個(gè)字節(jié)\i2c.h
(0001) ///////////////////////i2c通信子程序///////////////////////
(0002) ///////////////////////////////////////////////////////////
(0003) //初始化
(0004) void i2c_init()
(0005) {
(0006) PORTD&=~0x80;
_i2c_init:
69 9897 CBI 0x12,7
(0007) TWBR=0x01 ; //速率=16M/(16+2*16)=33.3k
6A E081 LDI R24,1
6B B980 OUT 0x00,R24
(0008) TWSR=0x01 ; //分頻因子=4
6C B981 OUT 0x01,R24
6D 9508 RET
(0009) }
(0010)
(0011)
(0012) //開(kāi)始信號(hào)
(0013) void i2c_start()
(0014) {
(0015) TWCR=0xa4 ;
_i2c_start:
6E EA84 LDI R24,0xA4
6F BF86 OUT 0x36,R24
(0016) while(!(TWCR&0x80));
70 B626 IN R2,0x36
71 FE27 SBRS R2,7
72 CFFD RJMP 0x0070
73 9508 RET
(0017) }
(0018)
(0019)
(0020) //寫(xiě)數(shù)據(jù)
(0021) void i2c_wrdata(uchar i2c_data)
(0022) {
(0023) TWDR=(i2c_data);
_i2c_wrdata:
i2c_data --> R16
74 B903 OUT 0x03,R16
(0024) TWCR=0x84 ;
75 E884 LDI R24,0x84
76 BF86 OUT 0x36,R24
(0025) while(!(TWCR&0x80));
77 B626 IN R2,0x36
78 FE27 SBRS R2,7
79 CFFD RJMP 0x0077
7A 9508 RET
(0026) }
(0027)
(0028)
(0029) //讀數(shù)據(jù)noack
(0030) uchar i2c_redata()
(0031) {
(0032) uchar i2c_data ;
(0033) TWCR=0x84 ;
_i2c_redata:
i2c_data --> R16
7B E884 LDI R24,0x84
7C BF86 OUT 0x36,R24
(0034) while(!(TWCR&0x80));
7D B626 IN R2,0x36
7E FE27 SBRS R2,7
7F CFFD RJMP 0x007D
(0035) i2c_data=TWDR ;
80 B103 IN R16,0x03
(0036) return(i2c_data);
81 9508 RET
(0037) }
(0038)
(0039) //讀數(shù)據(jù)ack
(0040) uchar i2c_redataack()
(0041) {
(0042) uchar i2c_data ;
(0043) TWCR=0xc4 ;
_i2c_redataack:
i2c_data --> R16
82 EC84 LDI R24,0xC4
83 BF86 OUT 0x36,R24
(0044) while(!(TWCR&0x80));
84 B626 IN R2,0x36
85 FE27 SBRS R2,7
86 CFFD RJMP 0x0084
(0045) i2c_data=TWDR ;
87 B103 IN R16,0x03
(0046) return(i2c_data);
88 9508 RET
(0047) }
(0048)
(0049)
(0050)
(0051) //停止信號(hào)
(0052) void i2c_stop()
(0053) {
(0054) TWCR=0x94 ;
_i2c_stop:
89 E984 LDI R24,0x94
8A BF86 OUT 0x36,R24
8B 9508 RET
_i2c_wrbyte:
i2c_add --> R12
i2c_data --> R10
8C 92AA ST R10,-Y
8D 92CA ST R12,-Y
8E 2EC2 MOV R12,R18
8F 2EA0 MOV R10,R16
(0055) }
(0056)
(0057) //i2c的寫(xiě)字節(jié)子程序
(0058) void i2c_wrbyte(uchar i2c_data,uchar i2c_add)
(0059) {
(0060) do
(0061) {
(0062) i2c_start();
90 DFDD RCALL _i2c_start
(0063) i2c_wrdata(0xa0);
91 EA00 LDI R16,0xA0
92 DFE1 RCALL _i2c_wrdata
(0064) }
(0065) while((TWSR&0xf8)!=0x18); //判斷總線是否可以操作
93 B181 IN R24,0x01
94 7F88 ANDI R24,0xF8
95 3188 CPI R24,0x18
96 F7C9 BNE 0x0090
(0066)
(0067) i2c_wrdata(i2c_add);
97 2D0C MOV R16,R12
98 DFDB RCALL _i2c_wrdata
(0068) i2c_wrdata(i2c_data);
99 2D0A MOV R16,R10
9A DFD9 RCALL _i2c_wrdata
(0069) i2c_stop();
9B DFED RCALL _i2c_stop
9C 90C9 LD R12,Y+
9D 90A9 LD R10,Y+
9E 9508 RET
_i2c_wrpage:
i --> R10
i2c_nub --> Y,+4
i2c_add --> R10
i2c_data --> R12
9F 940E 0104 CALL push_xgset003C
A1 2EA2 MOV R10,R18
A2 0168 MOVW R12,R16
(0070) }
(0071)
(0072) //i2c的頁(yè)寫(xiě)子程序
(0073) //參數(shù)1:要寫(xiě)入的數(shù)組指針
(0074) //參數(shù)2:寫(xiě)入的首地址
(0075) //參數(shù)3:數(shù)組的單元數(shù)
(0076) void i2c_wrpage(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0077) {
(0078) uchar i;
(0079) do
(0080) {
(0081) i2c_start();
A3 DFCA RCALL _i2c_start
(0082) i2c_wrdata(0xa0);
A4 EA00 LDI R16,0xA0
A5 DFCE RCALL _i2c_wrdata
(0083) }
(0084) while((TWSR&0xf8)!=0x18);
A6 B181 IN R24,0x01
A7 7F88 ANDI R24,0xF8
A8 3188 CPI R24,0x18
A9 F7C9 BNE 0x00A3
(0085) //判斷總線是否可以操作
(0086) i2c_wrdata(i2c_add);
AA 2D0A MOV R16,R10
AB DFC8 RCALL _i2c_wrdata
(0087) for(i=0;i<i2c_nub;i++)
AC 24AA CLR R10
AD C005 RJMP 0x00B3
(0088) {
(0089) i2c_wrdata(*i2c_data++);
AE 01F6 MOVW R30,R12
AF 9101 LD R16,Z+
B0 016F MOVW R12,R30
B1 DFC2 RCALL _i2c_wrdata
B2 94A3 INC R10
B3 800C LDD R0,Y+4
B4 14A0 CP R10,R0
B5 F3C0 BCS 0x00AE
(0090) }
(0091) i2c_stop();
B6 DFD2 RCALL _i2c_stop
B7 940C 00F9 JMP pop_xgset003C
_i2c_rebyte:
i2c_data --> R10
i2c_add --> R10
B9 92AA ST R10,-Y
BA 2EA0 MOV R10,R16
(0092) }
(0093)
(0094) //i2c讀一個(gè)字節(jié)子程序
(0095) uchar i2c_rebyte(uchar i2c_add)
(0096) {
(0097) uchar i2c_data ;
(0098) do
(0099) {
(0100) i2c_start();
BB DFB2 RCALL _i2c_start
(0101) i2c_wrdata(0xa0);
BC EA00 LDI R16,0xA0
BD DFB6 RCALL _i2c_wrdata
(0102) }
(0103) while((TWSR&0xf8)!=0x18);
BE B181 IN R24,0x01
BF 7F88 ANDI R24,0xF8
C0 3188 CPI R24,0x18
C1 F7C9 BNE 0x00BB
(0104) //判斷總線是否可以操作
(0105) i2c_wrdata(i2c_add);
C2 2D0A MOV R16,R10
C3 DFB0 RCALL _i2c_wrdata
(0106) i2c_start();
C4 DFA9 RCALL _i2c_start
(0107) i2c_wrdata(0xa1);
C5 EA01 LDI R16,0xA1
C6 DFAD RCALL _i2c_wrdata
(0108) i2c_data=i2c_redata();
C7 DFB3 RCALL _i2c_redata
C8 2EA0 MOV R10,R16
(0109) i2c_stop();
C9 DFBF RCALL _i2c_stop
(0110) return(i2c_data);
CA 2D0A MOV R16,R10
CB 90A9 LD R10,Y+
CC 9508 RET
_i2c_rese:
i --> R10
i2c_nub --> Y,+4
i2c_add --> R10
i2c_data --> R20
CD 940E 0109 CALL push_xgset300C
CF 2EA2 MOV R10,R18
D0 01A8 MOVW R20,R16
(0111) }
(0112)
(0113)
(0114) //i2c連續(xù)讀子程序
(0115) //參數(shù)1:16位地址
(0116) //參數(shù)2:讀取字節(jié)數(shù) 注:<=64
(0117) //讀出的數(shù)據(jù)只能從全局?jǐn)?shù)組變量獲得
(0118) void i2c_rese(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0119) {
(0120) uchar i;
(0121) do
(0122) {
(0123) i2c_start();
D1 DF9C RCALL _i2c_start
(0124) i2c_wrdata(0xa0);
D2 EA00 LDI R16,0xA0
D3 DFA0 RCALL _i2c_wrdata
(0125) }
(0126) while((TWSR&0xf8)!=0x18);
D4 B181 IN R24,0x01
D5 7F88 ANDI R24,0xF8
D6 3188 CPI R24,0x18
D7 F7C9 BNE 0x00D1
(0127) //判斷總線是否可以操作
(0128) i2c_wrdata(i2c_add);
D8 2D0A MOV R16,R10
D9 DF9A RCALL _i2c_wrdata
(0129) i2c_start();
DA DF93 RCALL _i2c_start
(0130) i2c_wrdata(0xa1);
DB EA01 LDI R16,0xA1
DC DF97 RCALL _i2c_wrdata
(0131) for(i=0;i<(i2c_nub-1);i++) //少循環(huán)一次,留給最后發(fā)出no ack信號(hào)
DD 24AA CLR R10
DE C006 RJMP 0x00E5
(0132) {
(0133) *i2c_data=i2c_redataack();
DF DFA2 RCALL _i2c_redataack
E0 01FA MOVW R30,R20
E1 8300 STD Z+0,R16
(0134) i2c_data++;
E2 5F4F SUBI R20,0xFF
E3 4F5F SBCI R21,0xFF
E4 94A3 INC R10
E5 818C LDD R24,Y+4
E6 5081 SUBI R24,1
E7 16A8 CP R10,R24
E8 F3B0 BCS 0x00DF
(0135) }
(0136) *i2c_data=i2c_redata(); //最后一個(gè)字節(jié)發(fā)出no ack信號(hào)
E9 DF91 RCALL _i2c_redata
EA 01FA MOVW R30,R20
EB 8300 STD Z+0,R16
(0137) i2c_stop();
EC DF9C RCALL _i2c_stop
ED 940C 010E JMP pop_xgset300C
FILE: D:\16實(shí)驗(yàn)程序\I2C讀寫(xiě)24C04\讀一個(gè)字節(jié)\read-byte.c
(0001) //讀24c04的一個(gè)字節(jié)程序
(0002) #include<iom16v.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #include"i2c.h"
(0006)
(0007) //讀一個(gè)字節(jié)
(0008) main()
(0009) {
(0010) DDRD=0xff;
_main:
EF EF8F LDI R24,0xFF
F0 BB81 OUT 0x11,R24
(0011) PORTD=0xff;
F1 BB82 OUT 0x12,R24
(0012) i2c_init(); //初始化
F2 DF76 RCALL _i2c_init
(0013) PORTD=~i2c_rebyte(0x12); //讀出地址0x12的字節(jié)
FILE: <library>
F3 E102 LDI R16,0x12
F4 DFC4 RCALL _i2c_rebyte
F5 2E20 MOV R2,R16
F6 9420 COM R2
F7 BA22 OUT 0x12,R2
F8 9508 RET
pop_xgset003C:
F9 90A9 LD R10,Y+
FA 90B9 LD R11,Y+
FB 90C9 LD R12,Y+
FC 90D9 LD R13,Y+
FD 9508 RET
push_xgsetF0FC:
FE 937A ST R23,-Y
FF 936A ST R22,-Y
push_xgset30FC:
100 935A ST R21,-Y
101 934A ST R20,-Y
push_xgset00FC:
102 92FA ST R15,-Y
103 92EA ST R14,-Y
push_xgset003C:
104 92DA ST R13,-Y
105 92CA ST R12,-Y
106 92BA ST R11,-Y
107 92AA ST R10,-Y
108 9508 RET
push_xgset300C:
109 935A ST R21,-Y
10A 934A ST R20,-Y
10B 92BA ST R11,-Y
10C 92AA ST R10,-Y
10D 9508 RET
pop_xgset300C:
10E 90A9 LD R10,Y+
10F 90B9 LD R11,Y+
110 9149 LD R20,Y+
111 9159 LD R21,Y+
112 9508 RET
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -