📄 pcf8591-lcd1602-4ch-xianshi.lst
字号:
0166 22 227 RET
0167 228 DELAY0:
0167 7FFA 229 MOV R7,#250 ;延时500微秒
0169 DFFE 230 DJNZ R7,$
016B 22 231 RET
232
233 ;==========================================================
234
235 ;ASCII 转换并在第二行显示数字子程序
236
237 ;==========================================================
016C 238 LCD_CONV1:
016C E547 239 MOV A,DISSTART+2 ;加载数据
A51 MACRO ASSEMBLER PCF8591_LCD1602_4CH_XIANSHI 12/20/2006 22:59:54 PAGE 5
016E 31A8 240 CALL SHOW_DIG1 ;显示数据
0170 054F 241 INC LCD_X ;设置位置
0172 742E 242 MOV A,#'.'
0174 854FF0 243 MOV B,LCD_X
0177 31B0 244 CALL LCDP1 ;显示小数点
0179 E546 245 MOV A,DISSTART+1 ;加载数据
017B 054F 246 INC LCD_X ;设置位置
017D 31A8 247 CALL SHOW_DIG1 ;显示数据
017F E545 248 MOV A,DISSTART ;加载数据
0181 054F 249 INC LCD_X ;设置位置
0183 31A8 250 CALL SHOW_DIG1 ;显示数据
0185 22 251 RET
0186 252 LCD_CONV2:
0186 E547 253 MOV A,DISSTART+2 ;加载数据
254 ; MOV LCD_X,#10 ;设置位置
0188 31A0 255 CALL SHOW_DIG2 ;显示数据
018A 054F 256 INC LCD_X ;设置位置
018C 742E 257 MOV A,#'.'
018E 854FF0 258 MOV B,LCD_X
0191 31BD 259 CALL LCDP2 ;显示小数点
0193 E546 260 MOV A,DISSTART+1 ;加载数据
0195 054F 261 INC LCD_X ;设置位置
0197 31A0 262 CALL SHOW_DIG2 ;显示数据
0199 E545 263 MOV A,DISSTART ;加载数据
019B 054F 264 INC LCD_X ;设置位置
019D 31A0 265 CALL SHOW_DIG2 ;显示数据
019F 22 266 RET
267 ;==========================================================
268
269 ;数据转换为ASCII码,送显示
270
271 ;==========================================================
01A0 272 SHOW_DIG2:
01A0 2430 273 ADD A,#30H ;转换为ASCII码
01A2 854FF0 274 MOV B,LCD_X ;地址变量送B
01A5 31BD 275 CALL LCDP2 ;送显示
01A7 22 276 RET
277
01A8 278 SHOW_DIG1:
01A8 2430 279 ADD A,#30H ;转换为ASCII码
01AA 854FF0 280 MOV B,LCD_X ;地址变量送B
01AD 31B0 281 CALL LCDP1 ;送显示
01AF 22 282 RET
283 ;==========================================================
284
285 ;在 LCD 第一行指定位置显示字符
286 ;(A)=ASCII 数据, (B)=位置变量
287
288 ;==========================================================
01B0 289 LCDP1:
01B0 C0E0 290 PUSH ACC ;入栈保护A
01B2 E5F0 291 MOV A,B ;设置显示地址
01B4 2480 292 ADD A,#80H ;设置LCD的第一行地址
01B6 314D 293 CALL WCOM ;写入命令
01B8 D0E0 294 POP ACC ;由堆栈取出A
01BA 315A 295 CALL WDATA ;写入数据
01BC 22 296 RET
297 ;==========================================================
298
299 ;在 LCD 第二行指定位置显示字符
300 ;(A)=ASCII 数据, (B)=位置变量
301
302 ;==========================================================
01BD 303 LCDP2:
01BD C0E0 304 PUSH ACC ;入栈保护A
01BF E5F0 305 MOV A,B ;设置显示地址
A51 MACRO ASSEMBLER PCF8591_LCD1602_4CH_XIANSHI 12/20/2006 22:59:54 PAGE 6
01C1 24C0 306 ADD A,#0C0H ;设置LCD的第二行地址
01C3 314D 307 CALL WCOM ;写入命令
01C5 D0E0 308 POP ACC ;由堆栈取出A
01C7 315A 309 CALL WDATA ;写入数据
01C9 22 310 RET
311
312 ;====================================================================
313 ;显示数据转为三位BCD码子程序
314 ;显示数据转为三位BCD码存入DISSTART+2、
315 ;DISSTART+1、DISSTART(最大值5.00V)
316 ;显示数据初址在AD_TEMP中
317 ;255/51=5.00V 运算
318 ;====================================================================
01CA 319 TUNBCD:
01CA E549 320 MOV A,AD_TEMP
01CC 75F033 321 MOV B,#51
01CF 84 322 DIV AB
01D0 F547 323 MOV DISSTART+2,A ;整数个位数放入DISSTART+2
01D2 E5F0 324 MOV A,B ;余数大于1AH,F0为0,乘法溢出,结果加5
01D4 C2D5 325 CLR F0
01D6 941A 326 SUBB A,#1AH ;相减不够,C=1 表示余数小于1AH(26)
01D8 92D5 327 MOV F0,C
01DA 740A 328 MOV A,#10
01DC A4 329 MUL AB ;余数乘以10,相当于补0,继续除。
01DD 75F033 330 MOV B,#51
01E0 84 331 DIV AB ;再除以51
01E1 20D502 332 JB F0,T_BCD1
01E4 2405 333 ADD A,#5
01E6 334 T_BCD1:
01E6 F546 335 MOV DISSTART+1,A ;小数后第一位放入DISSTART+1
01E8 E5F0 336 MOV A,B
01EA C2D5 337 CLR F0
01EC 941A 338 SUBB A,#1AH
01EE 92D5 339 MOV F0,C
01F0 740A 340 MOV A,#10
01F2 A4 341 MUL AB
01F3 75F033 342 MOV B,#51
01F6 84 343 DIV AB
01F7 20D502 344 JB F0,T_BCD2
01FA 2405 345 ADD A,#5
01FC 346 T_BCD2:
01FC F545 347 MOV DISSTART,A ;小数后第二位放入DISSTART
01FE 22 348 RET
349 ;====================================================================
350 ;蜂鸣器响一声子程序
351 ;====================================================================
01FF 352 BEEP_BL:
01FF 7E64 353 MOV R6,#100
0201 354 DEL1:
0201 5108 355 CALL DEL2
0203 B2B7 356 CPL BEEP
0205 DEFA 357 DJNZ R6,DEL1
0207 22 358 RET
0208 359 DEL2:
0208 7FB4 360 MOV R7,#180
020A 361 DEL3:
020A 00 362 NOP
020B DFFD 363 DJNZ R7,DEL3
020D 22 364 RET
365 ;====================================================================
020E 366 DELAY: ;延时100MS
020E 7EC8 367 MOV R6,#200
0210 368 DEL4:
0210 7FFA 369 MOV R7,#250
0212 DFFE 370 DJNZ R7,$
0214 DEFA 371 DJNZ R6,DEL4
A51 MACRO ASSEMBLER PCF8591_LCD1602_4CH_XIANSHI 12/20/2006 22:59:54 PAGE 7
0216 22 372 RET
373
374 ;=====================================================
375 ;PCF8591演示程序
376 ;=====================================================
377
378 ;=======================================================
379 ;D/A 转换子程序
380
381 ;R1 D/A转换数据指针,初值为50H。
382 ;R2 存放D/A转换数据个数。
383 ;========================================================
0217 384 PCF_DA:
0217 00 385 NOP
0218 120279 386 LCALL STR
021B 7490 387 MOV A,#90H ;写PCF8591 A/D 寻址字
021D 12028F 388 LCALL WR0
0220 12030F 389 LCALL CHEK
0223 20D5F1 390 JB F0,PCF_DA
0226 391 WRD1:
0226 7440 392 MOV A,#40H
0228 7950 393 MOV R1,#50H
022A 394 WRD2:
022A 12028F 395 LCALL WR0
022D 12030F 396 LCALL CHEK
0230 20D5E4 397 JB F0,PCF_DA
0233 E7 398 MOV A,@R1
0234 09 399 INC R1
0235 DAF3 400 DJNZ R2,WRD2
0237 120325 401 LCALL STOP
023A 22 402 RET
403 ;=======================================================
404 ;A/D 转换子程序
405
406 ;R1 A/D转换数据指针,初值为60H。
407 ;60H-63H 存放4路A/D转换值
408 ;R2 存放A/D转换数据个数。
409 ;=======================================================
023B 410 PCF_AD:
023B 00 411 NOP
023C 120279 412 LCALL STR
023F 7490 413 MOV A,#90H ;写PCF8591 A/D 寻址字
0241 12028F 414 LCALL WR0
0244 12030F 415 LCALL CHEK
0247 20D5F1 416 JB F0,PCF_AD ;错误,重发。
024A 7404 417 MOV A,#04H ;A/D控制字
024C 12028F 418 LCALL WR0
024F 12030F 419 LCALL CHEK
0252 20D5E6 420 JB F0,PCF_AD ;错误,重发。
0255 421 PCF_AD1:
0255 120279 422 LCALL STR
0258 7491 423 MOV A,#91H ;读PCF8591 A/D 寻址字
025A 12028F 424 LCALL WR0
025D 12030F 425 LCALL CHEK
0260 20D5F2 426 JB F0,PCF_AD1
427
0263 7940 428 MOV R1,#AD_DATA ;数据存储区首地址
429 ; lcall rd0 ;空读一次,调整读顺序
430 ;lcall yida
0265 431 WRD3:
0265 1202E1 432 LCALL RD0
0268 F7 433 MOV @R1,A
0269 DA07 434 DJNZ R2,WRD4
026B 1202CF 435 LCALL YIDAF
026E 120325 436 LCALL STOP
0271 22 437 RET
A51 MACRO ASSEMBLER PCF8591_LCD1602_4CH_XIANSHI 12/20/2006 22:59:54 PAGE 8
0272 438 WRD4:
0272 1202BF 439 LCALL YIDA
0275 09 440 INC R1
0276 020265 441 LJMP WRD3
442
443 ;**************************************************
444 ;* IIC 总线驱动程序 *
445 ;**************************************************
446
447 ;==================================================
448 ;总线启动子程序
449 ;==================================================
0279 450 STR:
0279 00 451 NOP
027A D293 452 SETB SDA
027C 00 453 NOP
027D D290 454 SETB SCL ;起始条件建立时间大于4.7us
027F 00 455 NOP
0280 00 456 NOP
0281 00 457 NOP
0282 00 458 NOP
0283 00 459 NOP
0284 C293 460 CLR SDA
0286 00 461 NOP ;起始条件锁定时间大于4.7us
0287 00 462 NOP
0288 00 463 NOP
0289 00 464 NOP
028A 00 465 NOP
028B C290 466 CLR SCL ;钳住总线,准备发数据
028D 00 467 NOP
028E 22 468 RET
469 ;==================================================
470 ;发送一个字节子程序
471 ;字节数据放入ACC
472 ;==================================================
028F 473 WR0:
028F 00 474 NOP
0290 7B08 475 MOV R3,#08H
0292 C290 476 CLR SCL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -