📄 write_page.lst
字号:
__start:
__text_start:
4E EFCF LDI R28,0xFF
4F E1D0 LDI R29,0x10
50 BFCD OUT 0x3D,R28
51 BFDE OUT 0x3E,R29
52 51CE SUBI R28,0x1E
53 40D0 SBCI R29,0
54 EA0A LDI R16,0xAA
55 8308 STD Y+0,R16
56 2400 CLR R0
57 E0E0 LDI R30,0
58 E0F1 LDI R31,1
59 E011 LDI R17,1
5A 30E0 CPI R30,0
5B 07F1 CPC R31,R17
5C F011 BEQ 0x005F
5D 9201 ST R0,Z+
5E CFFB RJMP 0x005A
5F 8300 STD Z+0,R16
60 E9EC LDI R30,0x9C
61 E0F0 LDI R31,0
62 E0A0 LDI R26,0
63 E0B1 LDI R27,1
64 E010 LDI R17,0
65 E000 LDI R16,0
66 BF0B OUT 0x3B,R16
67 39EC CPI R30,0x9C
68 07F1 CPC R31,R17
69 F021 BEQ 0x006E
6A 95C8 LPM
6B 9631 ADIW R30,1
6C 920D ST R0,X+
6D CFF9 RJMP 0x0067
6E 940E 0109 CALL _main
_exit:
70 CFFF RJMP _exit
FILE: E:\产品\开发板\mega128-board\实验程序\I2C读写24C04\页写\i2c.h
(0001) ///////////////////////i2c通信子程序///////////////////////
(0002) ///////////////////////////////////////////////////////////
(0003) //初始化
(0004) void i2c_init()
(0005) {
(0006) PORTD&=~0x80;
_i2c_init:
71 9897 CBI 0x12,7
(0007) TWBR=0x01 ; //速率=16M/(16+2*16)=33.3k
72 E081 LDI R24,1
73 9380 0070 STS 0x0070,R24
(0008) TWSR=0x01 ; //分频因子=4
75 9380 0071 STS 0x0071,R24
77 9508 RET
(0009) }
(0010)
(0011)
(0012) //开始信号
(0013) void i2c_start()
(0014) {
(0015) TWCR=0xa4 ;
_i2c_start:
78 EA84 LDI R24,0xA4
79 9380 0074 STS 0x0074,R24
(0016) while(!(TWCR&0x80));
7B 9020 0074 LDS R2,0x0074
7D FE27 SBRS R2,7
7E CFFC RJMP 0x007B
7F 9508 RET
(0017) }
(0018)
(0019)
(0020) //写数据
(0021) void i2c_wrdata(uchar i2c_data)
(0022) {
(0023) TWDR=(i2c_data);
_i2c_wrdata:
i2c_data --> R16
80 9300 0073 STS 0x0073,R16
(0024) TWCR=0x84 ;
82 E884 LDI R24,0x84
83 9380 0074 STS 0x0074,R24
(0025) while(!(TWCR&0x80));
85 9020 0074 LDS R2,0x0074
87 FE27 SBRS R2,7
88 CFFC RJMP 0x0085
89 9508 RET
(0026) }
(0027)
(0028)
(0029) //读数据noack
(0030) uchar i2c_redata()
(0031) {
(0032) uchar i2c_data ;
(0033) TWCR=0x84 ;
_i2c_redata:
i2c_data --> R16
8A E884 LDI R24,0x84
8B 9380 0074 STS 0x0074,R24
(0034) while(!(TWCR&0x80));
8D 9020 0074 LDS R2,0x0074
8F FE27 SBRS R2,7
90 CFFC RJMP 0x008D
(0035) i2c_data=TWDR ;
91 9100 0073 LDS R16,0x0073
(0036) return(i2c_data);
93 9508 RET
(0037) }
(0038)
(0039) //读数据ack
(0040) uchar i2c_redataack()
(0041) {
(0042) uchar i2c_data ;
(0043) TWCR=0xc4 ;
_i2c_redataack:
i2c_data --> R16
94 EC84 LDI R24,0xC4
95 9380 0074 STS 0x0074,R24
(0044) while(!(TWCR&0x80));
97 9020 0074 LDS R2,0x0074
99 FE27 SBRS R2,7
9A CFFC RJMP 0x0097
(0045) i2c_data=TWDR ;
9B 9100 0073 LDS R16,0x0073
(0046) return(i2c_data);
9D 9508 RET
(0047) }
(0048)
(0049)
(0050)
(0051) //停止信号
(0052) void i2c_stop()
(0053) {
(0054) TWCR=0x94 ;
_i2c_stop:
9E E984 LDI R24,0x94
9F 9380 0074 STS 0x0074,R24
A1 9508 RET
_i2c_wrbyte:
i2c_add --> R12
i2c_data --> R10
A2 92AA ST R10,-Y
A3 92CA ST R12,-Y
A4 2EC2 MOV R12,R18
A5 2EA0 MOV R10,R16
(0055) }
(0056)
(0057) //i2c的写字节子程序
(0058) void i2c_wrbyte(uchar i2c_data,uchar i2c_add)
(0059) {
(0060) do
(0061) {
(0062) i2c_start();
A6 DFD1 RCALL _i2c_start
(0063) i2c_wrdata(0xa0);
A7 EA00 LDI R16,0xA0
A8 DFD7 RCALL _i2c_wrdata
(0064) }
(0065) while((TWSR&0xf8)!=0x18); //判断总线是否可以操作
A9 9180 0071 LDS R24,0x0071
AB 7F88 ANDI R24,0xF8
AC 3188 CPI R24,0x18
AD F7C1 BNE 0x00A6
(0066)
(0067) i2c_wrdata(i2c_add);
AE 2D0C MOV R16,R12
AF DFD0 RCALL _i2c_wrdata
(0068) i2c_wrdata(i2c_data);
B0 2D0A MOV R16,R10
B1 DFCE RCALL _i2c_wrdata
(0069) i2c_stop();
B2 DFEB RCALL _i2c_stop
B3 90C9 LD R12,Y+
B4 90A9 LD R10,Y+
B5 9508 RET
_i2c_wrpage:
i --> R10
i2c_nub --> Y,+4
i2c_add --> R10
i2c_data --> R12
B6 940E 012B CALL push_xgset003C
B8 2EA2 MOV R10,R18
B9 0168 MOVW R12,R16
(0070) }
(0071)
(0072) //i2c的页写子程序
(0073) //参数1:要写入的数组指针
(0074) //参数2:写入的首地址
(0075) //参数3:数组的单元数
(0076) void i2c_wrpage(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0077) {
(0078) uchar i;
(0079) do
(0080) {
(0081) i2c_start();
BA DFBD RCALL _i2c_start
(0082) i2c_wrdata(0xa0);
BB EA00 LDI R16,0xA0
BC DFC3 RCALL _i2c_wrdata
(0083) }
(0084) while((TWSR&0xf8)!=0x18);
BD 9180 0071 LDS R24,0x0071
BF 7F88 ANDI R24,0xF8
C0 3188 CPI R24,0x18
C1 F7C1 BNE 0x00BA
(0085) //判断总线是否可以操作
(0086) i2c_wrdata(i2c_add);
C2 2D0A MOV R16,R10
C3 DFBC RCALL _i2c_wrdata
(0087) for(i=0;i<i2c_nub;i++)
C4 24AA CLR R10
C5 C005 RJMP 0x00CB
(0088) {
(0089) i2c_wrdata(*i2c_data++);
C6 01F6 MOVW R30,R12
C7 9101 LD R16,Z+
C8 016F MOVW R12,R30
C9 DFB6 RCALL _i2c_wrdata
CA 94A3 INC R10
CB 800C LDD R0,Y+4
CC 14A0 CP R10,R0
CD F3C0 BCS 0x00C6
(0090) }
(0091) i2c_stop();
CE DFCF RCALL _i2c_stop
CF 940C 0120 JMP pop_xgset003C
_i2c_rebyte:
i2c_data --> R10
i2c_add --> R10
D1 92AA ST R10,-Y
D2 2EA0 MOV R10,R16
(0092) }
(0093)
(0094) //i2c读一个字节子程序
(0095) uchar i2c_rebyte(uchar i2c_add)
(0096) {
(0097) uchar i2c_data ;
(0098) do
(0099) {
(0100) i2c_start();
D3 DFA4 RCALL _i2c_start
(0101) i2c_wrdata(0xa0);
D4 EA00 LDI R16,0xA0
D5 DFAA RCALL _i2c_wrdata
(0102) }
(0103) while((TWSR&0xf8)!=0x18);
D6 9180 0071 LDS R24,0x0071
D8 7F88 ANDI R24,0xF8
D9 3188 CPI R24,0x18
DA F7C1 BNE 0x00D3
(0104) //判断总线是否可以操作
(0105) i2c_wrdata(i2c_add);
DB 2D0A MOV R16,R10
DC DFA3 RCALL _i2c_wrdata
(0106) i2c_start();
DD DF9A RCALL _i2c_start
(0107) i2c_wrdata(0xa1);
DE EA01 LDI R16,0xA1
DF DFA0 RCALL _i2c_wrdata
(0108) i2c_data=i2c_redata();
E0 DFA9 RCALL _i2c_redata
E1 2EA0 MOV R10,R16
(0109) i2c_stop();
E2 DFBB RCALL _i2c_stop
(0110) return(i2c_data);
E3 2D0A MOV R16,R10
E4 90A9 LD R10,Y+
E5 9508 RET
_i2c_rese:
i --> R10
i2c_nub --> Y,+4
i2c_add --> R10
i2c_data --> R20
E6 940E 0130 CALL push_xgset300C
E8 2EA2 MOV R10,R18
E9 01A8 MOVW R20,R16
(0111) }
(0112)
(0113)
(0114) //i2c连续读子程序
(0115) //参数1:16位地址
(0116) //参数2:读取字节数 注:<=64
(0117) //读出的数据只能从全局数组变量获得
(0118) void i2c_rese(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
(0119) {
(0120) uchar i;
(0121) do
(0122) {
(0123) i2c_start();
EA DF8D RCALL _i2c_start
(0124) i2c_wrdata(0xa0);
EB EA00 LDI R16,0xA0
EC DF93 RCALL _i2c_wrdata
(0125) }
(0126) while((TWSR&0xf8)!=0x18);
ED 9180 0071 LDS R24,0x0071
EF 7F88 ANDI R24,0xF8
F0 3188 CPI R24,0x18
F1 F7C1 BNE 0x00EA
(0127) //判断总线是否可以操作
(0128) i2c_wrdata(i2c_add);
F2 2D0A MOV R16,R10
F3 DF8C RCALL _i2c_wrdata
(0129) i2c_start();
F4 DF83 RCALL _i2c_start
(0130) i2c_wrdata(0xa1);
F5 EA01 LDI R16,0xA1
F6 DF89 RCALL _i2c_wrdata
(0131) for(i=0;i<(i2c_nub-1);i++) //少循环一次,留给最后发出no ack信号
F7 24AA CLR R10
F8 C006 RJMP 0x00FF
(0132) {
(0133) *i2c_data=i2c_redataack();
F9 DF9A RCALL _i2c_redataack
FA 01FA MOVW R30,R20
FB 8300 STD Z+0,R16
(0134) i2c_data++;
FC 5F4F SUBI R20,0xFF
FD 4F5F SBCI R21,0xFF
FE 94A3 INC R10
FF 818C LDD R24,Y+4
100 5081 SUBI R24,1
101 16A8 CP R10,R24
102 F3B0 BCS 0x00F9
(0135) }
(0136) *i2c_data=i2c_redata(); //最后一个字节发出no ack信号
103 DF86 RCALL _i2c_redata
104 01FA MOVW R30,R20
105 8300 STD Z+0,R16
(0137) i2c_stop();
106 DF97 RCALL _i2c_stop
107 940C 0135 JMP pop_xgset300C
_main:
aa --> Y,+1
109 9761 SBIW R28,0x11
FILE: E:\产品\开发板\mega128-board\实验程序\I2C读写24C04\页写\write_page.c
(0001) #include<iom128v.h>
(0002) #define uchar unsigned char
(0003) #define uint unsigned int
(0004) #include"i2c.h"
(0005)
(0006)
(0007) //写一个字节
(0008) main()
(0009) {
(0010) uchar aa[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
10A E88C LDI R24,0x8C
10B E090 LDI R25,0
10C 01FE MOVW R30,R28
10D 9631 ADIW R30,1
10E E100 LDI R16,0x10
10F E010 LDI R17,0
110 93FA ST R31,-Y
111 93EA ST R30,-Y
112 939A ST R25,-Y
113 938A ST R24,-Y
114 940E 013A CALL asgncblkx
(0011) i2c_init(); //初始化
116 DF5A RCALL _i2c_init
(0012) i2c_wrpage(aa,0x00,16); //字节写入
FILE: <library>
117 E180 LDI R24,0x10
118 8388 STD Y+0,R24
119 2722 CLR R18
11A 018E MOVW R16,R28
11B 5F0F SUBI R16,0xFF
11C 4F1F SBCI R17,0xFF
11D DF98 RCALL _i2c_wrpage
11E 9661 ADIW R28,0x11
11F 9508 RET
pop_xgset003C:
120 90A9 LD R10,Y+
121 90B9 LD R11,Y+
122 90C9 LD R12,Y+
123 90D9 LD R13,Y+
124 9508 RET
push_xgsetF0FC:
125 937A ST R23,-Y
126 936A ST R22,-Y
push_xgset30FC:
127 935A ST R21,-Y
128 934A ST R20,-Y
push_xgset00FC:
129 92FA ST R15,-Y
12A 92EA ST R14,-Y
push_xgset003C:
12B 92DA ST R13,-Y
12C 92CA ST R12,-Y
12D 92BA ST R11,-Y
12E 92AA ST R10,-Y
12F 9508 RET
push_xgset300C:
130 935A ST R21,-Y
131 934A ST R20,-Y
132 92BA ST R11,-Y
133 92AA ST R10,-Y
134 9508 RET
pop_xgset300C:
135 90A9 LD R10,Y+
136 90B9 LD R11,Y+
137 9149 LD R20,Y+
138 9159 LD R21,Y+
139 9508 RET
asgncblkx:
13A 93AA ST R26,-Y
13B 93BA ST R27,-Y
13C 93EA ST R30,-Y
13D 93FA ST R31,-Y
13E 920A ST R0,-Y
13F 81AF LDD R26,Y+7
140 85B8 LDD R27,Y+8
141 81ED LDD R30,Y+5
142 81FE LDD R31,Y+6
143 3000 CPI R16,0
144 0701 CPC R16,R17
145 F031 BEQ 0x014C
146 95D8 ELPM
147 920D ST R0,X+
148 9631 ADIW R30,1
149 5001 SUBI R16,1
14A 4010 SBCI R17,0
14B CFF7 RJMP 0x0143
14C 9009 LD R0,Y+
14D 91F9 LD R31,Y+
14E 91E9 LD R30,Y+
14F 91B9 LD R27,Y+
150 91A9 LD R26,Y+
151 9624 ADIW R28,4
152 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -