📄 ex.lst
字号:
+1 235
8201 D8DC +1 236 DJNZ R0,RLP ;未够8位,再来一次
8203 22 +1 237 RET
+1 238
+1 239
+1 240
+1 241 ;========================================================================================
+1 242 ;========================================================================================
+1 243 ; 以下是用户接口子程序
+1 244 ;
+1 245
+1 246 ;无子地址器件写字节数据
+1 247 ;入口参数: 数据为ACC、器件从地址SLA
+1 248 ;占用: A、R0、CY
8204 C0E0 +1 249 IWRBYTE: PUSH ACC
8206 12815B +1 250 IWBLOOP: LCALL START ;起动总线
8209 E550 +1 251 MOV A,SLA
820B 1281B6 +1 252 LCALL WRBYTE ;发送器件从地址
820E 1281A1 +1 253 LCALL CACK
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 5
8211 30100C +1 254 JNB ACK,RETWRB ;无应答则跳转
8214 D0E0 +1 255 POP ACC ;写数据
8216 1281B6 +1 256 LCALL WRBYTE
8219 1281A1 +1 257 LCALL CACK
821C 128170 +1 258 LCALL STOP
821F 22 +1 259 RET
8220 D0E0 +1 260 RETWRB: POP ACC
8222 128170 +1 261 LCALL STOP
8225 22 +1 262 RET
+1 263
+1 264 ;无子地址器件读字节数据
+1 265 ;入口参数: 器件从地址SLA
+1 266 ;出口参数: 数据为ACC
+1 267 ;占用: A 、R0、R2 、CY
8226 12815B +1 268 IRDBYTE: LCALL START
8229 E550 +1 269 MOV A,SLA ;发送器件从地址
822B 04 +1 270 INC A
822C 1281B6 +1 271 LCALL WRBYTE
822F 1281A1 +1 272 LCALL CACK
8232 301006 +1 273 JNB ACK,RETRDB
8235 1281DD +1 274 LCALL RDBYTE ;进行读字节操作
8238 128191 +1 275 LCALL MNACK ;发送非应信号
823B 128170 +1 276 RETRDB: LCALL STOP ;结束总线
823E 22 +1 277 RET
+1 278
+1 279 ;向器件指定子地址写N字节数据
+1 280 ;入口参数: 器件从地址SLA、器件子地址SUBA 、发送数据缓冲区MTD、发送字节数NUMBYTE
+1 281 ; 占用: A 、R0 、R1 、R3 、CY
823F E552 +1 282 IWRNBYTE: MOV A,NUMBYTE
8241 FB +1 283 MOV R3,A
8242 12815B +1 284 LCALL START ;起动总线
8245 E550 +1 285 MOV A,SLA
8247 1281B6 +1 286 LCALL WRBYTE ;发送器件从地址
824A 1281A1 +1 287 LCALL CACK
824D 301017 +1 288 JNB ACK,RETWRN ;无应答则退出
8250 E551 +1 289 MOV A,SUBA ;指定子地址
8252 1281B6 +1 290 LCALL WRBYTE
8255 1281A1 +1 291 LCALL CACK
8258 7940 +1 292 MOV R1,#MTD
825A E7 +1 293 WRDA: MOV A,@R1
825B 1281B6 +1 294 LCALL WRBYTE ;开始写入数据
825E 1281A1 +1 295 LCALL CACK
8261 3010DB +1 296 JNB ACK,IWRNBYTE
8264 09 +1 297 INC R1
8265 DBF3 +1 298 DJNZ R3,WRDA ;判断写完没有
8267 128170 +1 299 RETWRN: LCALL STOP
826A 22 +1 300 RET
+1 301
+1 302 ;向器件指定子地址读取N字节数据
+1 303 ;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
+1 304 ;出口参数: 接收数据缓冲区MTD
+1 305 ;占用:A、 R0、 R1、 R2、 R3、 CY
826B AB52 +1 306 IRDNBYTE: MOV R3,NUMBYTE
826D 12815B +1 307 LCALL START
8270 E550 +1 308 MOV A,SLA
8272 1281B6 +1 309 LCALL WRBYTE ;发送器件从地址
8275 1281A1 +1 310 LCALL CACK
8278 301022 +1 311 JNB ACK,RETRDN
827B E551 +1 312 MOV A,SUBA ;指定子地址
827D 1281B6 +1 313 LCALL WRBYTE
8280 1281A1 +1 314 LCALL CACK
8283 12815B +1 315 LCALL START ;重新起动总线
8286 E550 +1 316 MOV A,SLA
8288 04 +1 317 INC A ;准备进行读操作
8289 1281B6 +1 318 LCALL WRBYTE
828C 1281A1 +1 319 LCALL CACK
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 6
828F 3010D9 +1 320 JNB ACK,IRDNBYTE
8292 7949 +1 321 MOV R1,#MRD
8294 1281DD +1 322 RDN1: LCALL RDBYTE ;读操作开始
8297 F7 +1 323 MOV @R1,A
+1 324 ;NOP ;+1
+1 325 ;NOP ;+1
8298 DB07 +1 326 DJNZ R3,SACK
829A 128191 +1 327 LCALL MNACK ;最后一字节发非应答位
829D 128170 +1 328 RETRDN: LCALL STOP ;并结束总线
82A0 22 +1 329 RET
82A1 128181 +1 330 SACK: LCALL MACK
82A4 09 +1 331 INC R1
82A5 80ED +1 332 SJMP RDN1
+1 333
+1 334
+1 335 ;无子地址器件写N字节数据
+1 336 ;入口参数: 器件从地址SLA、发送数据缓冲区MTD、发送字节数NUMBYTE
+1 337 ; 占用: A 、R0 、R1 、R3 、CY
+1 338 ;不发送子地址SUBA,直接发送多个数据.
82A7 +1 339 IWRNBYTEEXT:
82A7 E552 +1 340 MOV A,NUMBYTE
82A9 FB +1 341 MOV R3,A
82AA 12815B +1 342 LCALL START ;起动总线
82AD E550 +1 343 MOV A,SLA
82AF 1281B6 +1 344 LCALL WRBYTE ;发送器件从地址
82B2 1281A1 +1 345 LCALL CACK
82B5 30100F +1 346 JNB ACK,RETWRNE ;无应答则退出
82B8 7940 +1 347 MOV R1,#MTD
82BA E7 +1 348 WRDAE: MOV A,@R1
82BB 1281B6 +1 349 LCALL WRBYTE ;开始写入数据
82BE 1281A1 +1 350 LCALL CACK
82C1 301003 +1 351 JNB ACK,RETWRNE
82C4 09 +1 352 INC R1
82C5 DBF3 +1 353 DJNZ R3,WRDAE ;判断写完没有
82C7 128170 +1 354 RETWRNE: LCALL STOP
82CA 22 +1 355 RET
+1 356
+1 357
+1 358 ;无子地址器件读取N字节数据
+1 359 ;入口参数: 器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
+1 360 ;出口参数: 接收数据缓冲区MTD
+1 361 ;占用:A、 R0、 R1、 R2、 R3、 CY
+1 362 ;说明:此函数不发送子址,也不重新启动总线,而是直接读取多个数据.
82CB +1 363 IRDNBYTEEXT:
82CB AB52 +1 364 MOV R3,NUMBYTE
82CD 12815B +1 365 LCALL START
82D0 E550 +1 366 MOV A,SLA
82D2 04 +1 367 INC A
82D3 1281B6 +1 368 LCALL WRBYTE ;发送器件从地址
82D6 1281A1 +1 369 LCALL CACK
82D9 30100B +1 370 JNB ACK,RETRDNE
82DC 7949 +1 371 MOV R1,#MRD
82DE 1281DD +1 372 RDNE1: LCALL RDBYTE ;读操作开始
82E1 F7 +1 373 MOV @R1,A
82E2 DB07 +1 374 DJNZ R3,SACKE
82E4 128191 +1 375 LCALL MNACK ;最后一字节发非应答位
82E7 128170 +1 376 RETRDNE: LCALL STOP ;并结束总线
82EA 22 +1 377 RET
82EB 128181 +1 378 SACKE: LCALL MACK
82EE 09 +1 379 INC R1
82EF 80ED +1 380 SJMP RDNE1
+1 381
+1 382
+1 383
+1 384 ;******************************************************************************************
***
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 PAGE 7
+1 385 ; 请注意
+1 386 ;
+1 387 ; 占用内部资源: R0,R1,R2,R3,ACC,Cy。
+1 388 ; 在你的程序里要做以下定义:
+1 389 ; 1、定义变量: SLA 器件从地址 SUBA器件子地址 NUMBYTE读/写的字节数 ,位变量ACK
+1 390 ; 2、定义常量: SDA SCL 总线位 MTD 发送数据缓冲区首址 MRD 接收数据缓冲区首址
+1 391 ;
+1 392 ; (ACK为调试/测试位,ACK为0时表示无器件应答或总线出错)
+1 393 ;
+1 394 ; 在使用本软件包时,请在你的程序的未尾加入$INCLUDE (VI2C_ASM.INC)即可。VI2C_ASM.INC文件
+1 395 ;复制到IDE包含文件所要求的目录(如:工作目录或INC目录)
+1 396 ;
+1 397 ; 用户可以对"用户接口子程序"进行裁减,即把自已不使用的接口子程序删掉,以节省程序空间。
+1 398 ;******************************************************************************************
****
+1 399
+1 400
+1 401
+1 402
+1 403
+1 404
405 END
A51 MACRO ASSEMBLER EX 03/21/2004 15:04:15 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 81A1H A
CEND . . . . . . . C ADDR 81B1H A
DELAY. . . . . . . C ADDR 8146H A
DELAY1 . . . . . . C ADDR 8156H A
HANDLELOOP . . . . C ADDR 8125H A
IRDBYTE. . . . . . C ADDR 8226H A
IRDNBYTE . . . . . C ADDR 826BH A
IRDNBYTEEXT. . . . C ADDR 82CBH A
IWBLOOP. . . . . . C ADDR 8206H A
IWRBYTE. . . . . . C ADDR 8204H A
IWRNBYTE . . . . . C ADDR 823FH A
IWRNBYTEEXT. . . . C ADDR 82A7H A
KEY_HANDLE . . . . C ADDR 8112H A
KEY_INT. . . . . . B ADDR 00B0H.2 A
MACK . . . . . . . C ADDR 8181H A
MAIN . . . . . . . C ADDR 8100H A
MAINLOOP . . . . . C ADDR 810DH A
MIN. . . . . . . . C ADDR 8148H A
MNACK. . . . . . . C ADDR 8191H A
MRD. . . . . . . . N NUMB 0049H A
MTD. . . . . . . . N NUMB 0040H A
NUMBYTE. . . . . . D ADDR 0052H A
P1 . . . . . . . . D ADDR 0090H A
P3 . . . . . . . . D ADDR 00B0H A
RDBYTE . . . . . . C ADDR 81DDH A
RDN1 . . . . . . . C ADDR 8294H A
RDNE1. . . . . . . C ADDR 82DEH A
RETRDB . . . . . . C ADDR 823BH A
RETRDN . . . . . . C ADDR 829DH A
RETRDNE. . . . . . C ADDR 82E7H A
RETWRB . . . . . . C ADDR 8220H A
RETWRN . . . . . . C ADDR 8267H A
RETWRNE. . . . . . C ADDR 82C7H A
RLP. . . . . . . . C ADDR 81DFH A
RST. . . . . . . . B ADDR 0090H.0 A
SACK . . . . . . . C ADDR 82A1H A
SACKE. . . . . . . C ADDR 82EBH 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 815BH A
STOP . . . . . . . C ADDR 8170H A
SUBA . . . . . . . D ADDR 0051H A
WLP. . . . . . . . C ADDR 81B8H A
WLP1 . . . . . . . C ADDR 81BDH A
WR0. . . . . . . . C ADDR 81CFH A
WR1. . . . . . . . C ADDR 81C1H A
WRBYTE . . . . . . C ADDR 81B6H A
WRDA . . . . . . . C ADDR 825AH A
WRDAE. . . . . . . C ADDR 82BAH A
YS500. . . . . . . C ADDR 814BH A
YS500US. . . . . . C ADDR 8151H A
ZLG7290. . . . . . N NUMB 0070H A
REGISTER BANK(S) USED: 0 2
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -