📄 read-byte.lst
字号:
__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 011A CALL _main
_exit:
68 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:
69 9897 CBI 0x12,7
(0007) TWBR=0x01 ; //速率=16M/(16+2*16)=33.3k
6A E081 LDI R24,1
6B 9380 0070 STS 0x0070,R24
(0008) TWSR=0x01 ; //分频因子=4
6D 9380 0071 STS 0x0071,R24
6F 9508 RET
(0009) }
(0010)
(0011)
(0012) //开始信号
(0013) void i2c_start()
(0014) {
(0015) TWCR=0xa4 ;
_i2c_start:
70 EA84 LDI R24,0xA4
71 9380 0074 STS 0x0074,R24
(0016) while(!(TWCR&0x80));
73 9020 0074 LDS R2,0x0074
75 FE27 SBRS R2,7
76 CFFC RJMP 0x0073
77 9508 RET
(0017) }
(0018)
(0019)
(0020) //写数据
(0021) void i2c_wrdata(uchar i2c_data)
(0022) {
(0023) TWDR=(i2c_data);
_i2c_wrdata:
i2c_data --> R16
78 9300 0073 STS 0x0073,R16
(0024) TWCR=0x84 ;
7A E884 LDI R24,0x84
7B 9380 0074 STS 0x0074,R24
(0025) while(!(TWCR&0x80));
7D 9020 0074 LDS R2,0x0074
7F FE27 SBRS R2,7
80 CFFC RJMP 0x007D
81 9508 RET
(0026) }
(0027)
(0028)
(0029) //读数据noack
(0030) uchar i2c_redata()
(0031) {
(0032) uchar i2c_data ;
(0033) TWCR=0x84 ;
_i2c_redata:
i2c_data --> R16
82 E884 LDI R24,0x84
83 9380 0074 STS 0x0074,R24
(0034) while(!(TWCR&0x80));
85 9020 0074 LDS R2,0x0074
87 FE27 SBRS R2,7
88 CFFC RJMP 0x0085
(0035) i2c_data=TWDR ;
89 9100 0073 LDS R16,0x0073
(0036) return(i2c_data);
8B 9508 RET
(0037) }
(0038)
(0039) //读数据ack
(0040) uchar i2c_redataack()
(0041) {
(0042) uchar i2c_data ;
(0043) TWCR=0xc4 ;
_i2c_redataack:
i2c_data --> R16
8C EC84 LDI R24,0xC4
8D 9380 0074 STS 0x0074,R24
(0044) while(!(TWCR&0x80));
8F 9020 0074 LDS R2,0x0074
91 FE27 SBRS R2,7
92 CFFC RJMP 0x008F
(0045) i2c_data=TWDR ;
93 9100 0073 LDS R16,0x0073
(0046) return(i2c_data);
95 9508 RET
(0047) }
(0048)
(0049)
(0050)
(0051) //停止信号
(0052) void i2c_stop()
(0053) {
(0054) TWCR=0x94 ;
_i2c_stop:
96 E984 LDI R24,0x94
97 9380 0074 STS 0x0074,R24
99 9508 RET
_i2c_wrbyte:
i2c_add --> R12
i2c_data --> R10
9A 92AA ST R10,-Y
9B 92CA ST R12,-Y
9C 2EC2 MOV R12,R18
9D 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();
9E DFD1 RCALL _i2c_start
(0063) i2c_wrdata(0xa0);
9F EA00 LDI R16,0xA0
A0 DFD7 RCALL _i2c_wrdata
(0064) }
(0065) while((TWSR&0xf8)!=0x18); //判断总线是否可以操作
A1 9180 0071 LDS R24,0x0071
A3 7F88 ANDI R24,0xF8
A4 3188 CPI R24,0x18
A5 F7C1 BNE 0x009E
(0066)
(0067) i2c_wrdata(i2c_add);
A6 2D0C MOV R16,R12
A7 DFD0 RCALL _i2c_wrdata
(0068) i2c_wrdata(i2c_data);
A8 2D0A MOV R16,R10
A9 DFCE RCALL _i2c_wrdata
(0069) i2c_stop();
AA DFEB RCALL _i2c_stop
AB 90C9 LD R12,Y+
AC 90A9 LD R10,Y+
AD 9508 RET
_i2c_wrpage:
addh --> R14
addl --> R10
i --> R10
i2c_nub --> Y,+6
i2c_add --> R14
i2c_data --> R12
AE 940E 0138 CALL push_xgset00FC
B0 0179 MOVW R14,R18
B1 0168 MOVW R12,R16
(0070) }
(0071)
(0072) //i2c的页写子程序
(0073) //参数1:要写入的数组数据
(0074) //参数2:写入的首地址
(0075) //参数3:数组的单元数
(0076) void i2c_wrpage(uchar i2c_data[],uint i2c_add,uchar i2c_nub)
(0077) {
(0078) uchar addl,addh,i ;
(0079) addl=i2c_add ;
B2 2CAE MOV R10,R14
(0080) addh=i2c_add>>8 ;
B3 2CEF MOV R14,R15
B4 24FF CLR R15
(0081) do
(0082) {
(0083) i2c_start();
B5 DFBA RCALL _i2c_start
(0084) i2c_wrdata(0xa0);
B6 EA00 LDI R16,0xA0
B7 DFC0 RCALL _i2c_wrdata
(0085) }
(0086) while((TWSR&0xf8)!=0x18);
B8 9180 0071 LDS R24,0x0071
BA 7F88 ANDI R24,0xF8
BB 3188 CPI R24,0x18
BC F7C1 BNE 0x00B5
(0087) //判断总线是否可以操作
(0088) i2c_wrdata(addh);
BD 2D0E MOV R16,R14
BE DFB9 RCALL _i2c_wrdata
(0089) i2c_wrdata(addl);
BF 2D0A MOV R16,R10
C0 DFB7 RCALL _i2c_wrdata
(0090) for(i=0;i<i2c_nub;i++)
C1 24AA CLR R10
C2 C007 RJMP 0x00CA
(0091) {
(0092) i2c_wrdata(i2c_data[i]);
C3 2DEA MOV R30,R10
C4 27FF CLR R31
C5 0DEC ADD R30,R12
C6 1DFD ADC R31,R13
C7 8100 LDD R16,Z+0
C8 DFAF RCALL _i2c_wrdata
C9 94A3 INC R10
CA 800E LDD R0,Y+6
CB 14A0 CP R10,R0
CC F3B0 BCS 0x00C3
(0093) }
(0094) i2c_stop();
CD DFC8 RCALL _i2c_stop
CE 940C 0124 JMP pop_xgset00FC
_i2c_rebyte:
i2c_data --> R10
i2c_add --> R10
D0 92AA ST R10,-Y
D1 2EA0 MOV R10,R16
(0095) }
(0096)
(0097) //i2c读一个字节子程序
(0098) uchar i2c_rebyte(uchar i2c_add)
(0099) {
(0100) uchar i2c_data ;
(0101) do
(0102) {
(0103) i2c_start();
D2 DF9D RCALL _i2c_start
(0104) i2c_wrdata(0xa0);
D3 EA00 LDI R16,0xA0
D4 DFA3 RCALL _i2c_wrdata
(0105) }
(0106) while((TWSR&0xf8)!=0x18);
D5 9180 0071 LDS R24,0x0071
D7 7F88 ANDI R24,0xF8
D8 3188 CPI R24,0x18
D9 F7C1 BNE 0x00D2
(0107) //判断总线是否可以操作
(0108) i2c_wrdata(i2c_add);
DA 2D0A MOV R16,R10
DB DF9C RCALL _i2c_wrdata
(0109) i2c_start();
DC DF93 RCALL _i2c_start
(0110) i2c_wrdata(0xa1);
DD EA01 LDI R16,0xA1
DE DF99 RCALL _i2c_wrdata
(0111) i2c_data=i2c_redata();
DF DFA2 RCALL _i2c_redata
E0 2EA0 MOV R10,R16
(0112) i2c_stop();
E1 DFB4 RCALL _i2c_stop
(0113) return(i2c_data);
E2 2D0A MOV R16,R10
E3 90A9 LD R10,Y+
E4 9508 RET
_i2c_rese:
addh --> R20
addl --> R14
i --> R14
i2c_nub --> R12
i2c_add --> R20
aa --> R10
E5 940E 0136 CALL push_xgset30FC
E7 01A9 MOVW R20,R18
E8 0158 MOVW R10,R16
E9 84C8 LDD R12,Y+8
(0114) }
(0115)
(0116)
(0117) //i2c连续读子程序
(0118) //参数1:16位地址
(0119) //参数2:读取字节数 注:<=64
(0120) //读出的数据只能从全局数组变量获得
(0121) void i2c_rese(uchar aa[],uint i2c_add,uchar i2c_nub)
(0122) {
(0123) uchar addl,addh,i ;
(0124) addl=i2c_add ;
EA 2EE4 MOV R14,R20
(0125) addh=i2c_add>>8 ;
EB 2F45 MOV R20,R21
EC 2755 CLR R21
(0126) i2c_nub--;
ED 94CA DEC R12
(0127) do
(0128) {
(0129) i2c_start();
EE DF81 RCALL _i2c_start
(0130) i2c_wrdata(0xa0);
EF EA00 LDI R16,0xA0
F0 DF87 RCALL _i2c_wrdata
(0131) }
(0132) while((TWSR&0xf8)!=0x18);
F1 9180 0071 LDS R24,0x0071
F3 7F88 ANDI R24,0xF8
F4 3188 CPI R24,0x18
F5 F7C1 BNE 0x00EE
(0133) //判断总线是否可以操作
(0134) i2c_wrdata(addh);
F6 2F04 MOV R16,R20
F7 DF80 RCALL _i2c_wrdata
(0135) i2c_wrdata(addl);
F8 2D0E MOV R16,R14
F9 DF7E RCALL _i2c_wrdata
(0136) i2c_start();
FA DF75 RCALL _i2c_start
(0137) i2c_wrdata(0xa1);
FB EA01 LDI R16,0xA1
FC DF7B RCALL _i2c_wrdata
(0138) for(i=0;i<i2c_nub;i++)
FD 24EE CLR R14
FE C007 RJMP 0x0106
(0139) {
(0140) aa[i]=i2c_redataack();
FF DF8C RCALL _i2c_redataack
100 2DEE MOV R30,R14
101 27FF CLR R31
102 0DEA ADD R30,R10
103 1DFB ADC R31,R11
104 8300 STD Z+0,R16
105 94E3 INC R14
106 14EC CP R14,R12
107 F3B8 BCS 0x00FF
(0141) }
(0142) aa[i2c_nub]=i2c_redata();
108 DF79 RCALL _i2c_redata
109 2DEC MOV R30,R12
10A 27FF CLR R31
10B 0DEA ADD R30,R10
10C 1DFB ADC R31,R11
10D 8300 STD Z+0,R16
(0143) //最后一个字节发出no ack信号
(0144) i2c_stop();
10E DF87 RCALL _i2c_stop
10F 940C 012B JMP pop_xgset30FC
FILE: E:\产品\开发板\mega128-board\实验程序\I2C读写24C04\read-byte.c
(0001) #include<iom128v.h>
(0002) #define uchar unsigned char
(0003) #define uint unsigned int
(0004) #include"i2c.h"
(0005) //延时函数
(0006) void s_ms(unsigned int t)
(0007) {
(0008) for(;t>1;t--)
_s_ms:
t --> R16
111 C002 RJMP 0x0114
112 5001 SUBI R16,1
113 4010 SBCI R17,0
114 E081 LDI R24,1
115 E090 LDI R25,0
116 1780 CP R24,R16
117 0791 CPC R25,R17
118 F3C8 BCS 0x0112
119 9508 RET
(0009) {
(0010) }
(0011) }
(0012)
(0013) //读一个字节
(0014) main()
(0015) {
(0016) DDRA=0xff;
_main:
11A EF8F LDI R24,0xFF
11B BB8A OUT 0x1A,R24
(0017) PORTA=0xff;
11C BB8B OUT 0x1B,R24
(0018) i2c_init(); //初始化
11D DF4B RCALL _i2c_init
(0019) PORTA=~i2c_rebyte(0x12); //读出字节
FILE: <library>
11E E102 LDI R16,0x12
11F DFB0 RCALL _i2c_rebyte
120 2E20 MOV R2,R16
121 9420 COM R2
122 BA2B OUT 0x1B,R2
123 9508 RET
pop_xgset00FC:
124 90A9 LD R10,Y+
125 90B9 LD R11,Y+
126 90C9 LD R12,Y+
127 90D9 LD R13,Y+
128 90E9 LD R14,Y+
129 90F9 LD R15,Y+
12A 9508 RET
pop_xgset30FC:
12B 90A9 LD R10,Y+
12C 90B9 LD R11,Y+
12D 90C9 LD R12,Y+
12E 90D9 LD R13,Y+
12F 90E9 LD R14,Y+
130 90F9 LD R15,Y+
131 9149 LD R20,Y+
132 9159 LD R21,Y+
133 9508 RET
push_xgsetF0FC:
134 937A ST R23,-Y
135 936A ST R22,-Y
push_xgset30FC:
136 935A ST R21,-Y
137 934A ST R20,-Y
push_xgset00FC:
138 92FA ST R15,-Y
139 92EA ST R14,-Y
push_xgset003C:
13A 92DA ST R13,-Y
13B 92CA ST R12,-Y
13C 92BA ST R11,-Y
13D 92AA ST R10,-Y
13E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -