📄 ex.lst
字号:
+1 225
+1 226 ;========================================================================================
+1 227 ;========================================================================================
+1 228 ; 以下是用户接口子程序
+1 229 ;
+1 230
+1 231 ;无子地址器件写字节数据
+1 232 ;入口参数: 数据为ACC、器件从地址SLA
+1 233 ;占用: A、R0、CY
01F3 C0E0 +1 234 IWRBYTE: PUSH ACC
01F5 12014A +1 235 IWBLOOP: LCALL START ;起动总线
01F8 E550 +1 236 MOV A,SLA
01FA 1201A5 +1 237 LCALL WRBYTE ;发送器件从地址
01FD 120190 +1 238 LCALL CACK
0200 30100C +1 239 JNB ACK,RETWRB ;无应答则跳转
0203 D0E0 +1 240 POP ACC ;写数据
0205 1201A5 +1 241 LCALL WRBYTE
0208 120190 +1 242 LCALL CACK
020B 12015F +1 243 LCALL STOP
020E 22 +1 244 RET
020F D0E0 +1 245 RETWRB: POP ACC
0211 12015F +1 246 LCALL STOP
0214 22 +1 247 RET
+1 248
+1 249 ;无子地址器件读字节数据
+1 250 ;入口参数: 器件从地址SLA
+1 251 ;出口参数: 数据为ACC
+1 252 ;占用: A 、R0、R2 、CY
0215 12014A +1 253 IRDBYTE: LCALL START
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 5
0218 E550 +1 254 MOV A,SLA ;发送器件从地址
021A 04 +1 255 INC A
021B 1201A5 +1 256 LCALL WRBYTE
021E 120190 +1 257 LCALL CACK
0221 301006 +1 258 JNB ACK,RETRDB
0224 1201CC +1 259 LCALL RDBYTE ;进行读字节操作
0227 120180 +1 260 LCALL MNACK ;发送非应信号
022A 12015F +1 261 RETRDB: LCALL STOP ;结束总线
022D 22 +1 262 RET
+1 263
+1 264 ;向器件指定子地址写N字节数据
+1 265 ;入口参数: 器件从地址SLA、器件子地址SUBA 、发送数据缓冲区MTD、发送字节数NUMBYTE
+1 266 ; 占用: A 、R0 、R1 、R3 、CY
022E E552 +1 267 IWRNBYTE: MOV A,NUMBYTE
0230 FB +1 268 MOV R3,A
0231 12014A +1 269 LCALL START ;起动总线
0234 E550 +1 270 MOV A,SLA
0236 1201A5 +1 271 LCALL WRBYTE ;发送器件从地址
0239 120190 +1 272 LCALL CACK
023C 301017 +1 273 JNB ACK,RETWRN ;无应答则退出
023F E551 +1 274 MOV A,SUBA ;指定子地址
0241 1201A5 +1 275 LCALL WRBYTE
0244 120190 +1 276 LCALL CACK
0247 7940 +1 277 MOV R1,#MTD
0249 E7 +1 278 WRDA: MOV A,@R1
024A 1201A5 +1 279 LCALL WRBYTE ;开始写入数据
024D 120190 +1 280 LCALL CACK
0250 3010DB +1 281 JNB ACK,IWRNBYTE
0253 09 +1 282 INC R1
0254 DBF3 +1 283 DJNZ R3,WRDA ;判断写完没有
0256 12015F +1 284 RETWRN: LCALL STOP
0259 22 +1 285 RET
+1 286
+1 287 ;向器件指定子地址读取N字节数据
+1 288 ;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
+1 289 ;出口参数: 接收数据缓冲区MTD
+1 290 ;占用:A、 R0、 R1、 R2、 R3、 CY
025A AB52 +1 291 IRDNBYTE: MOV R3,NUMBYTE
025C 12014A +1 292 LCALL START
025F E550 +1 293 MOV A,SLA
0261 1201A5 +1 294 LCALL WRBYTE ;发送器件从地址
0264 120190 +1 295 LCALL CACK
0267 301022 +1 296 JNB ACK,RETRDN
026A E551 +1 297 MOV A,SUBA ;指定子地址
026C 1201A5 +1 298 LCALL WRBYTE
026F 120190 +1 299 LCALL CACK
0272 12014A +1 300 LCALL START ;重新起动总线
0275 E550 +1 301 MOV A,SLA
0277 04 +1 302 INC A ;准备进行读操作
0278 1201A5 +1 303 LCALL WRBYTE
027B 120190 +1 304 LCALL CACK
027E 3010D9 +1 305 JNB ACK,IRDNBYTE
0281 7949 +1 306 MOV R1,#MRD
0283 1201CC +1 307 RDN1: LCALL RDBYTE ;读操作开始
0286 F7 +1 308 MOV @R1,A
+1 309 ;NOP ;+1
+1 310 ;NOP ;+1
0287 DB07 +1 311 DJNZ R3,SACK
0289 120180 +1 312 LCALL MNACK ;最后一字节发非应答位
028C 12015F +1 313 RETRDN: LCALL STOP ;并结束总线
028F 22 +1 314 RET
0290 120170 +1 315 SACK: LCALL MACK
0293 09 +1 316 INC R1
0294 80ED +1 317 SJMP RDN1
+1 318
+1 319
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 6
+1 320 ;无子地址器件写N字节数据
+1 321 ;入口参数: 器件从地址SLA、发送数据缓冲区MTD、发送字节数NUMBYTE
+1 322 ; 占用: A 、R0 、R1 、R3 、CY
+1 323 ;不发送子地址SUBA,直接发送多个数据.
0296 +1 324 IWRNBYTEEXT:
0296 E552 +1 325 MOV A,NUMBYTE
0298 FB +1 326 MOV R3,A
0299 12014A +1 327 LCALL START ;起动总线
029C E550 +1 328 MOV A,SLA
029E 1201A5 +1 329 LCALL WRBYTE ;发送器件从地址
02A1 120190 +1 330 LCALL CACK
02A4 30100F +1 331 JNB ACK,RETWRNE ;无应答则退出
02A7 7940 +1 332 MOV R1,#MTD
02A9 E7 +1 333 WRDAE: MOV A,@R1
02AA 1201A5 +1 334 LCALL WRBYTE ;开始写入数据
02AD 120190 +1 335 LCALL CACK
02B0 301003 +1 336 JNB ACK,RETWRNE
02B3 09 +1 337 INC R1
02B4 DBF3 +1 338 DJNZ R3,WRDAE ;判断写完没有
02B6 12015F +1 339 RETWRNE: LCALL STOP
02B9 22 +1 340 RET
+1 341
+1 342
+1 343 ;无子地址器件读取N字节数据
+1 344 ;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
+1 345 ;出口参数: 接收数据缓冲区MTD
+1 346 ;占用:A、 R0、 R1、 R2、 R3、 CY
+1 347 ;说明:此函数不发送子址,也不重新启动总线,而是直接读取多个数据.
02BA +1 348 IRDNBYTEEXT:
02BA AB52 +1 349 MOV R3,NUMBYTE
02BC 12014A +1 350 LCALL START
02BF E550 +1 351 MOV A,SLA
02C1 04 +1 352 INC A
02C2 1201A5 +1 353 LCALL WRBYTE ;发送器件从地址
02C5 120190 +1 354 LCALL CACK
02C8 30100B +1 355 JNB ACK,RETRDNE
02CB 7949 +1 356 MOV R1,#MRD
02CD 1201CC +1 357 RDNE1: LCALL RDBYTE ;读操作开始
02D0 F7 +1 358 MOV @R1,A
02D1 DB07 +1 359 DJNZ R3,SACKE
02D3 120180 +1 360 LCALL MNACK ;最后一字节发非应答位
02D6 12015F +1 361 RETRDNE: LCALL STOP ;并结束总线
02D9 22 +1 362 RET
02DA 120170 +1 363 SACKE: LCALL MACK
02DD 09 +1 364 INC R1
02DE 80ED +1 365 SJMP RDNE1
+1 366
+1 367
+1 368
+1 369 ;******************************************************************************************
***
+1 370 ; 请注意
+1 371 ;
+1 372 ; 占用内部资源: R0,R1,R2,R3,ACC,Cy。
+1 373 ; 在你的程序里要做以下定义:
+1 374 ; 1、定义变量: SLA 器件从地址 SUBA器件子地址 NUMBYTE读/写的字节数 ,位变量ACK
+1 375 ; 2、定义常量: SDA SCL 总线位 MTD 发送数据缓冲区首址 MRD 接收数据缓冲区首址
+1 376 ;
+1 377 ; (ACK为调试/测试位,ACK为0时表示无器件应答或总线出错)
+1 378 ;
+1 379 ; 在使用本软件包时,请在你的程序的未尾加入$INCLUDE (VI2C_ASM.INC)即可。VI2C_ASM.INC文件
+1 380 ;复制到IDE包含文件所要求的目录(如:工作目录或INC目录)
+1 381 ;
+1 382 ; 用户可以对"用户接口子程序"进行裁减,即把自已不使用的接口子程序删掉,以节省程序空间。
+1 383 ;******************************************************************************************
****
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 7
+1 384
+1 385
+1 386
+1 387
+1 388
+1 389
390 END
A51 MACRO ASSEMBLER EX 11/07/2006 08:35:29 PAGE 8
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
ACK. . . . . . . . B ADDR 0022H.0 A
CACK . . . . . . . C ADDR 0190H A
CEND . . . . . . . C ADDR 01A0H A
DELAY. . . . . . . C ADDR 0135H A
DELAY1 . . . . . . C ADDR 0145H A
IRDBYTE. . . . . . C ADDR 0215H A
IRDNBYTE . . . . . C ADDR 025AH A
IRDNBYTEEXT. . . . C ADDR 02BAH A
IWBLOOP. . . . . . C ADDR 01F5H A
IWRBYTE. . . . . . C ADDR 01F3H A
IWRNBYTE . . . . . C ADDR 022EH A
IWRNBYTEEXT. . . . C ADDR 0296H A
MACK . . . . . . . C ADDR 0170H A
MAIN . . . . . . . C ADDR 0100H A
MAINLOOP . . . . . C ADDR 0124H A
MIN. . . . . . . . C ADDR 0137H A
MNACK. . . . . . . C ADDR 0180H A
MRD. . . . . . . . N NUMB 0049H A
MTD. . . . . . . . N NUMB 0040H A
NUMBYTE. . . . . . D ADDR 0052H A
P1 . . . . . . . . D ADDR 0090H A
PCF8563. . . . . . N NUMB 00A2H A
RDBYTE . . . . . . C ADDR 01CCH A
RDN1 . . . . . . . C ADDR 0283H A
RDNE1. . . . . . . C ADDR 02CDH A
RETRDB . . . . . . C ADDR 022AH A
RETRDN . . . . . . C ADDR 028CH A
RETRDNE. . . . . . C ADDR 02D6H A
RETWRB . . . . . . C ADDR 020FH A
RETWRN . . . . . . C ADDR 0256H A
RETWRNE. . . . . . C ADDR 02B6H A
RLP. . . . . . . . C ADDR 01CEH A
SACK . . . . . . . C ADDR 0290H A
SACKE. . . . . . . C ADDR 02DAH A
SCL. . . . . . . . B ADDR 0090H.6 A
SDA. . . . . . . . B ADDR 0090H.7 A
SLA. . . . . . . . D ADDR 0050H A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 014AH A
STOP . . . . . . . C ADDR 015FH A
SUBA . . . . . . . D ADDR 0051H A
WLP. . . . . . . . C ADDR 01A7H A
WLP1 . . . . . . . C ADDR 01ACH A
WR0. . . . . . . . C ADDR 01BEH A
WR1. . . . . . . . C ADDR 01B0H A
WRBYTE . . . . . . C ADDR 01A5H A
WRDA . . . . . . . C ADDR 0249H A
WRDAE. . . . . . . C ADDR 02A9H A
YS500. . . . . . . C ADDR 013AH A
YS500US. . . . . . C ADDR 0140H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -