📄 ex7-4.lst
字号:
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 1
MCS-51 Family Cross Assembler A S E M - 5 1 V 1.2
=====================================================
Source File: EX7-4.ASM
Object File: EX7-4.HEX
List File: EX7-4.LST
Line I Addr Code Source
1: N 10 ACK BIT 10H ;应答标志位
2: N 50 SLA DATA 50H ;器件地址字
3: N 51 SUBA DATA 51H ;器件子地址
4: N 52 NUMBYTE DATA 52H ;读/写字节数
5: B 97 SDA BIT P1.7
6: B 96 SCL BIT P1.6 ;I2C总线定义
7: N 0030 MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
8: N 0040 MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
9: N 0000 ORG 0000H
10: 0000 21 30 AJMP MAIN
11: N 0030 ORG 0030H
12: ;*********************************************************************
13: ;名称:IWRNBYTE
14: ;描述:向器件指定子地址写N个数据
15: ;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
16: ;*********************************************************************
17: 0030 AB 52 IWRNBYTE: MOV R3,NUMBYTE
18: 0032 12 00 97 LCALL START ;启动总线
19: 0035 E5 50 MOV A,SLA
20: 0037 12 00 F3 LCALL WRBYTE ;发送器件地址字
21: 003A 12 00 DE LCALL CACK
22: 003D 30 10 17 JNB ACK,RETWRN ;无应答则退出
23: 0040 E5 51 MOV A,SUBA ;指定子地址
24: 0042 12 00 F3 LCALL WRBYTE
25: 0045 12 00 DE LCALL CACK
26: 0048 79 30 MOV R1,#MTD
27: 004A E7 WRDA: MOV A,@R1
28: 004B 12 00 F3 LCALL WRBYTE ;开始写入数据
29: 004E 12 00 DE LCALL CACK
30: 0051 30 10 DC JNB ACK,IWRNBYTE
31: 0054 09 INC R1
32: 0055 DB F3 DJNZ R3,WRDA ;判断是否写完
33: 0057 12 00 AB RETWRN: LCALL STOP
34: 005A 22 RET
35: ;*********************************************************************
36: ;名称:IRDNBYTE
37: ;描述:从器件指定子地址读取N个数据
38: ;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
39: ;*********************************************************************
40: 005B AB 52 IRDNBYTE: MOV R3,NUMBYTE
41: 005D 12 00 97 LCALL START
42: 0060 E5 50 MOV A,SLA
43: 0062 12 00 F3 LCALL WRBYTE ;发送器件地址字
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 2
Line I Addr Code Source
44: 0065 12 00 DE LCALL CACK
45: 0068 30 10 22 JNB ACK,RETRDN
46: 006B E5 51 MOV A,SUBA ;指定子地址
47: 006D 12 00 F3 LCALL WRBYTE
48: 0070 12 00 DE LCALL CACK
49: 0073 12 00 97 LCALL START ;重新启动总线
50: 0076 E5 50 MOV A,SLA
51: 0078 04 INC A ;准备进行读操作
52: 0079 12 00 F3 LCALL WRBYTE
53: 007C 12 00 DE LCALL CACK
54: 007F 30 10 D9 JNB ACK,IRDNBYTE
55: 0082 79 40 MOV R1,#MRD
56: 0084 12 01 1A RON1: LCALL RDBYTE ;读操作开始
57: 0087 F7 MOV @R1,A
58: 0088 DB 07 DJNZ R3,SACK
59: 008A 12 00 CE LCALL MNACK ;最后一字节发非应答位
60: 008D 12 00 AB RETRDN: LCALL STOP
61: 0090 22 RET
62: 0091 12 00 BE SACK: LCALL MACK
63: 0094 09 INC R1
64: 0095 80 ED SJMP RON1
65: ;*********************************************************************
66: ;名称:STRRT
67: ;描述:启动I2C总线子程序—发送I2C总线起始条件
68: ;*********************************************************************
69: 0097 D2 97 START: SETB SDA ;发送起始条件数据信号
70: 0099 00 NOP ;起始条件建立时间大于4.7us
71: 009A D2 96 SETB SCL ;发送起始条件的时钟信号
72: 009C 00 NOP
73: 009D 00 NOP
74: 009E 00 NOP
75: 009F 00 NOP
76: 00A0 00 NOP ;起始条件锁定时间大于4.7us
77: 00A1 C2 97 CLR SDA ;发送起始信号
78: 00A3 00 NOP
79: 00A4 00 NOP
80: 00A5 00 NOP
81: 00A6 00 NOP ;起始条件锁定时间大于4.7us
82: 00A7 C2 96 CLR SCL ;钳住I2C总线,准备发送或接收数据
83: 00A9 00 NOP
84: 00AA 22 RET
85: ;*********************************************************************
86: ;名称:STOP
87: ;描述:停止I2C总线子程序—发送I2C总线停止条件
88: ;*********************************************************************
89: 00AB C2 97 STOP: CLR SDA ;发送停止条件的数据信号
90: 00AD 00 NOP
91: 00AE 00 NOP
92: 00AF D2 96 SETB SCL ;发送停止条件的时钟信号
93: 00B1 00 NOP
94: 00B2 00 NOP
95: 00B3 00 NOP
96: 00B4 00 NOP
97: 00B5 00 NOP ;起始条件建立时间大于4.7us
98: 00B6 D2 97 SETB SDA ;发送I2C总线停止信号
99: 00B8 00 NOP
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 3
Line I Addr Code Source
100: 00B9 00 NOP
101: 00BA 00 NOP
102: 00BB 00 NOP
103: 00BC 00 NOP ;延迟时间大于4.7us
104: 00BD 22 RET
105: ;*********************************************************************
106: ;名称:MACK
107: ;描述:发送应答信号子程序
108: ;*********************************************************************
109: 00BE C2 97 MACK: CLR SDA ;将SDA置0
110: 00C0 00 NOP
111: 00C1 00 NOP
112: 00C2 D2 96 SETB SCL
113: 00C4 00 NOP
114: 00C5 00 NOP
115: 00C6 00 NOP
116: 00C7 00 NOP
117: 00C8 00 NOP ;保持数据时间,大于4.7us
118: 00C9 C2 96 CLR SCL
119: 00CB 00 NOP
120: 00CC 00 NOP
121: 00CD 22 RET
122: ;*********************************************************************
123: ;名称:MNACK
124: ;描述:发送非应答信号子程序
125: ;*********************************************************************
126: 00CE D2 97 MNACK: SETB SDA ;将SDA置1
127: 00D0 00 NOP
128: 00D1 00 NOP
129: 00D2 D2 96 SETB SCL
130: 00D4 00 NOP
131: 00D5 00 NOP
132: 00D6 00 NOP
133: 00D7 00 NOP
134: 00D8 00 NOP
135: 00D9 C2 96 CLR SCL ;保持数据时间,大于4.7us
136: 00DB 00 NOP
137: 00DC 00 NOP
138: 00DD 22 RET
139: ;*********************************************************************
140: ;名称:CACK
141: ;描述:检查应答位子程序,返回值:ACK=1时表示有应答
142: ;*********************************************************************
143: 00DE D2 97 CACK: SETB SDA
144: 00E0 00 NOP
145: 00E1 00 NOP
146: 00E2 D2 96 SETB SCL
147: 00E4 C2 10 CLR ACK
148: 00E6 00 NOP
149: 00E7 00 NOP
150: 00E8 A2 97 MOV C,SDA
151: 00EA 40 02 JC CEND
152: 00EC D2 10 SETB ACK ;判断应答位
153: 00EE 00 CEND: NOP
154: 00EF C2 96 CLR SCL
155: 00F1 00 NOP
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 4
Line I Addr Code Source
156: 00F2 22 RET
157: ;*********************************************************************
158: ;名称:WRBYTE
159: ;描述:发送字节子程序,字节数据放入ACC
160: ;*********************************************************************
161: 00F3 78 08 WRBYTE: MOV R0,#08H
162: 00F5 33 WLP: RLC A ;取数据位
163: 00F6 40 06 JC WRI
164: 00F8 80 12 SJMP WRO ;判断数据位
165: 00FA D8 F9 WLP1: DJNZ R0,WLP
166: 00FC 00 NOP
167: 00FD 22 RET
168: 00FE D2 97 WRI: SETB SDA ;发送1
169: 0100 00 NOP
170: 0101 D2 96 SETB SCL
171: 0103 00 NOP
172: 0104 00 NOP
173: 0105 00 NOP
174: 0106 00 NOP
175: 0107 00 NOP
176: 0108 C2 96 CLR SCL
177: 010A 80 EE SJMP WLP1
178: 010C C2 97 WRO: CLR SDA ;发送0
179: 010E 00 NOP
180: 010F D2 96 SETB SCL
181: 0111 00 NOP
182: 0112 00 NOP
183: 0113 00 NOP
184: 0114 00 NOP
185: 0115 00 NOP
186: 0116 C2 96 CLR SCL
187: 0118 80 E0 SJMP WLP1
188: ;*********************************************************************
189: ;名称:RDBYTE
190: ;描述:读取字节子程序,读出的数据存放在ACC
191: ;*********************************************************************
192: 011A 78 08 RDBYTE: MOV R0,#08H
193: 011C D2 97 RLP: SETB SDA
194: 011E 00 NOP
195: 011F D2 96 SETB SCL ;时钟线为高,接收数据位
196: 0121 00 NOP
197: 0122 00 NOP
198: 0123 A2 97 MOV C,SDA ;读取数据位
199: 0125 EA MOV A,R2
200: 0126 C2 96 CLR SCL ;将SCL拉低,时间大于4.7us
201: 0128 33 RLC A ;进行数据位的处理
202: 0129 FA MOV R2,A
203: 012A 00 NOP
204: 012B 00 NOP
205: 012C 00 NOP
206: 012D D8 ED DJNZ R0,RLP ;未够8位,继续读入
207: 012F 22 RET
208:
209: 0130 7C F0 MAIN: MOV R4,#0F0H ;延时,等待其它芯片复位完成
210: 0132 DC FE DJNZ R4,$
211: ;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 5
Line I Addr Code Source
212: 0134 74 00 MOV A,#00H
213: 0136 78 30 MOV R0,#30H
214: 0138 F6 S1: MOV @R0,A
215: 0139 08 INC R0
216: 013A 04 INC A
217: 013B B8 40 FA CJNE R0,#40H,S1
218: ;向24C02C中写数据,数据存放在24C02C中50H开始的16个字节中
219: 013E 75 50 A0 MOV SLA,#0A0H ;24C02C地址字,写操作
220: 0141 75 51 50 MOV SUBA,#50H ;目标地址
221: 0144 75 52 10 MOV NUMBYTE,#16 ;字节数
222: 0147 12 00 30 LCALL IWRNBYTE ;写数据
223: 014A 7D 14 DELAY: MOV R5,#20
224: 014C 7E F8 D1: MOV R6,#248
225: 014E 7F F8 D2: MOV R7,#248
226: 0150 DF FE DJNZ R7,$
227: 0152 DE FA DJNZ R6,D2
228: 0154 DD F6 DJNZ R5,D1
229: ;从24C04C中读数据,数据送AT89C51中40H开始的16个字节中
230: 0156 75 50 A0 MOV SLA,#0A0H ;24C02C地址字,伪写入操作
231: 0159 75 51 50 MOV SUBA,#50H ;目标地址
232: 015C 75 52 10 MOV NUMBYTE,#16 ;字节数
233: 015F 12 00 5B LCALL IRDNBYTE ;读数据
234: 0162 80 FE SJMP $
235: END
register banks used: ---
no errors
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 6
L I S T O F S Y M B O L S
=============================
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
AC BIT D6
ACC DATA E0
ACK BIT 10 1
B DATA F0
CACK CODE 00DE 143
CEND CODE 00EE 153
CY BIT D7
D1 CODE 014C 224
D2 CODE 014E 225
DELAY CODE 014A 223
DPH DATA 83
DPL DATA 82
EA BIT AF
ES BIT AC
ET0 BIT A9
ET1 BIT AB
EX0 BIT A8
EX1 BIT AA
EXTI0 CODE 0003
EXTI1 CODE 0013
F0 BIT D5
IE DATA A8
IE0 BIT 89
IE1 BIT 8B
INT0 BIT B2
INT1 BIT B3
IP DATA B8
IRDNBYTE CODE 005B 40
IT0 BIT 88
IT1 BIT 8A
IWRNBYTE CODE 0030 17
MACK CODE 00BE 109
MAIN CODE 0130 209
MNACK CODE 00CE 126
MRD NUMBER 0040 8
MTD NUMBER 0030 7
NUMBYTE DATA 52 4
OV BIT D2
P BIT D0
P0 DATA 80
P1 DATA 90
P2 DATA A0
P3 DATA B0
PCON DATA 87
PS BIT BC
PSW DATA D0
PT0 BIT B9
PT1 BIT BB
PX0 BIT B8
PX1 BIT BA
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 7
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
RB8 BIT 9A
RD BIT B7
RDBYTE CODE 011A 192
REN BIT 9C
RESET CODE 0000
RETRDN CODE 008D 60
RETWRN CODE 0057 33
RI BIT 98
RLP CODE 011C 193
RON1 CODE 0084 56
RS0 BIT D3
RS1 BIT D4
RXD BIT B0
S1 CODE 0138 214
SACK CODE 0091 62
SBUF DATA 99
SCL BIT 96 6
SCON DATA 98
SDA BIT 97 5
SINT CODE 0023
SLA DATA 50 2
SM0 BIT 9F
SM1 BIT 9E
SM2 BIT 9D
SP DATA 81
START CODE 0097 69
STOP CODE 00AB 89
SUBA DATA 51 3
T0 BIT B4
T1 BIT B5
TB8 BIT 9B
TCON DATA 88
TF0 BIT 8D
TF1 BIT 8F
TH0 DATA 8C
TH1 DATA 8D
TI BIT 99
TIMER0 CODE 000B
TIMER1 CODE 001B
TL0 DATA 8A
TL1 DATA 8B
TMOD DATA 89
TR0 BIT 8C
TR1 BIT 8E
TXD BIT B1
WLP CODE 00F5 162
WLP1 CODE 00FA 165
WR BIT B6
WRBYTE CODE 00F3 161
WRDA CODE 004A 27
WRI CODE 00FE 168
WRO CODE 010C 178
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -