📄 lcd1602_temp_v1.1.lst
字号:
243 ;----------------------------
019A E52B 244 MOV A,2BH
019C 75F00A 245 MOV B,#10
019F 84 246 DIV AB
01A0 85F043 247 MOV 43H,B ;低温限值位个位
01A3 75F00A 248 MOV B,#10
01A6 84 249 DIV AB
01A7 85F044 250 MOV 44H,B ;十位
01AA F545 251 MOV 45H,A ;百位
252
01AC 01DB 253 AJMP KEY_IN
254
A51 MACRO ASSEMBLER LCD1602_TEMP_V1_1 09/17/2007 14:00:32 PAGE 5
255
01AE 256 KEY_CPL:
01AE B201 257 CPL 01H
01B0 01DB 258 AJMP KEY_IN
259
260
261
262
01B2 263 EXT_KEY:
01B2 758001 264 MOV P0,#00000001B ;清屏并光标复位
01B5 516B 265 CALL ENABLE;调用写入命令子程序
01B7 71CE 266 CALL DISPLAY_SAVE
267
01B9 31FA 268 CALL RESET
01BB 31E6 269 CALL SKIP_ROM
01BD 744E 270 MOV A,#4EH
01BF 511B 271 CALL WRITE
01C1 E52A 272 MOV A,2AH ;2A数据送高温限值寄存器.
01C3 511B 273 CALL WRITE
01C5 E52B 274 MOV A,2BH ;2B数据送低温限什寄存器.
01C7 511B 275 CALL WRITE
276
01C9 31FA 277 CALL RESET
01CB 31E6 278 CALL SKIP_ROM
01CD 7448 279 MOV A,#48H ;将高低温限值寄存器数据送18B20-EPROM保存.
01CF 511B 280 CALL WRITE
01D1 281 A_END:
282
01D1 22 283 RET
284
285
286
287
288
289
290
291 ;***************18b20指令子程序**********************
01D2 292 READ_TEMP: ;读1820内部温度子程序.
01D2 31FA 293 CALL RESET
01D4 20700E 294 JB 70h,EXT1
01D7 31E6 295 CALL SKIP_ROM
01D9 31F0 296 CALL TEMP_CONV ;温度AD变换
01DB 913F 297 CALL DELAY_600MS ;时........
01DD 31FA 298 CALL RESET
01DF 31E6 299 CALL SKIP_ROM
01E1 31F5 300 CALL TEMP_GET ;发取温度的命令
01E3 5134 301 CALL READ ;接收...
01E5 302 EXT1:
01E5 22 303 RET
304
01E6 305 SKIP_ROM:;跳过ROM检测
01E6 74CC 306 MOV A,#0CCH ;#0CCH为跳过rom命令
01E8 511B 307 CALL WRITE
01EA 22 308 RET
309
01EB 310 RECALL_EPROM:;重调Eprom
01EB 74B8 311 MOV A,#0B8H
01ED 511B 312 CALL WRITE
01EF 22 313 RET
314
315
01F0 316 TEMP_CONV:
01F0 7444 317 MOV A,#44H ;AD变换
01F2 511B 318 CALL WRITE
01F4 22 319 RET
320
A51 MACRO ASSEMBLER LCD1602_TEMP_V1_1 09/17/2007 14:00:32 PAGE 6
01F5 321 TEMP_GET:
01F5 74BE 322 MOV A ,#0BEH;读18b20命令
01F7 511B 323 CALL WRITE
01F9 22 324 RET
325
326
327 ;****************************18B20基本时序子程序*********************************
01FA 328 RESET: ;初始化子程序
01FA D2A7 329 SETB P2.7
01FC 00 330 NOP
01FD C2A7 331 CLR P2.7 ;拉低
01FF 7B96 332 MOV R3,#150 ; *4=600US
0201 9128 333 CALL DELAY_BY_R3
0203 D2A7 334 SETB P2.7 ;拉高
0205 7B0F 335 MOV R3,#15 ; 60US
0207 9128 336 CALL DELAY_BY_R3
0209 7B3C 337 MOV R3,#60 ;4个周期*60=240US内检测
020B 30A706 338 A1: JNB P2.7,A2 ;检测到低平信号
020E DBFB 339 DJNZ R3,A1 ;如果没有应答的低电平信号,返回A1重新检测,超时后下一行,
0210 D270 340 SETB 70h ;DS1820不存在.
0212 8006 341 JMP A3
0214 C270 342 A2: CLR 70h
0216 AB78 343 MOV R3,120;240US;等恢复时间2*120=240us
0218 DBFE 344 DJNZ R3, $
021A 345 A3:
021A 22 346 RET
347 ;------------------------
348
021B 349 WRITE:
021B 7A08 350 MOV R2,#8;一个字节为8位
021D C3 351 CLR C ;C位清0 C位用来放A的一位数据,用移位的方法放入C
021E D2A7 352 B1: SETB P2.7
0220 00 353 NOP
0221 C2A7 354 CLR P2.7
0223 7B04 355 MOV R3,#4 ;16US
0225 9128 356 CALL DELAY_BY_R3
0227 13 357 RRC A ;把A中的数送入C
0228 92A7 358 MOV P2.7,C ;把C送入总线
022A 7B0C 359 MOV R3,#12 ;48US(一位数据的发送:60us<tx<120us)
022C 9128 360 CALL DELAY_BY_R3
022E D2A7 361 SETB P2.7 ;拉高1us结束一位
0230 00 362 NOP
0231 DAEB 363 DJNZ R2,B1
0233 22 364 RET
365
0234 366 READ:
0234 7904 367 MOV R1,#4 ;接收4个字节数据依次是1.低位 2.高位. 3.高限 4.低限
0236 7828 368 MOV R0,#28H;低位放28H;高位放29h (1. 28H,2. 29H 3. 2AH 4. 2BH )
0238 7A08 369 C0: MOV R2,#8;一字节数据8位
023A C3 370 C1: CLR C ;清除C
023B D2A7 371 SETB P2.7
023D 00 372 NOP
023E 00 373 NOP
023F C2A7 374 CLR P2.7 ;拉低.
0241 00 375 NOP ;1us秒后拉高?
0242 D2A7 376 SETB P2.7
0244 7B04 377 MOV R3,#4 ;16us后采数据
0246 9128 378 CALL DELAY_BY_R3
0248 A2A7 379 MOV C,P2.7 ;读出18b20的数据
024A 13 380 RRC A ;移入A
024B 7B0C 381 MOV R3,#12;48US恢复时间
024D 9128 382 CALL DELAY_BY_R3
024F DAE9 383 DJNZ R2,C1 ;一个字节收完
0251 F6 384 MOV @R0,A ;移入存储位
0252 08 385 INC R0 ;下一位;29h
0253 D9E3 386 DJNZ R1,C0 ;全部取完吗?没有重复
A51 MACRO ASSEMBLER LCD1602_TEMP_V1_1 09/17/2007 14:00:32 PAGE 7
0255 22 387 RET
388 ;*********************************************************************************
389
390
391
392 ;*****************LCD_控制命令***************
0256 E9 393 DISPLAY: MOV A,R1
0257 93 394 MOVC A,@A+DPTR
0258 F580 395 MOV P0,A
025A 518E 396 CALL WRITE_DATA_TO_LCD
025C 09 397 INC R1
025D D8F7 398 DJNZ R0,DISPLAY
025F 22 399 RET
400
401
0260 402 WRITE_NOT_CHECK_BUSY:
0260 D2B2 403 SETB E
0262 00 404 NOP
0263 00 405 NOP
0264 C2B0 406 CLR RS ;写入控制命令的子程序
0266 C2B1 407 CLR RW
0268 C2B2 408 CLR E
026A 22 409 RET
410
411
026B 412 ENABLE:
026B D2B2 413 SETB E
026D 00 414 NOP
026E 00 415 NOP
026F C2B0 416 CLR RS ;写入控制命令的子程序
0271 C2B1 417 CLR RW
0273 C2B2 418 CLR E
0275 517A 419 ACALL TEST_BUSY
0277 D2B2 420 SETB E
0279 22 421 RET
422
423
027A 424 TEST_BUSY:
027A D2B2 425 SETB E
027C 00 426 NOP
027D 00 427 NOP
027E 7580FF 428 MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
0281 C2B0 429 CLR RS
0283 D2B1 430 SETB RW
0285 C2B2 431 CLR E
0287 00 432 NOP
0288 D2B2 433 SETB E
028A 2087ED 434 JB P0.7,TEST_BUSY ;如果P1.7为高电平表示忙就循环等待
028D 22 435 RET
436
437
028E 438 WRITE_DATA_TO_LCD:
028E D2B2 439 SETB E
0290 00 440 NOP
0291 00 441 NOP
0292 D2B0 442 SETB RS ;RS=1
0294 C2B1 443 CLR RW ;RW=0 ;准备写入数据
0296 C2B2 444 CLR E ;E=0 ;执行显示命令
0298 517A 445 ACALL TEST_BUSY ;判断液晶模块是否忙?
029A D2B2 446 SETB E ;E=1 ;显示完成,程序停车
029C 22 447 RET
448
449
450
451
452 ;***************************数据转换***************************
A51 MACRO ASSEMBLER LCD1602_TEMP_V1_1 09/17/2007 14:00:32 PAGE 8
029D 453 DATA_CONV: ;数据转换
029D E528 454 MOV A,28H ;低字节
029F 540F 455 ANL A,#0FH;去除高位
02A1 75F006 456 MOV B,#6;乘6得到实际数值的100倍.
02A4 A4 457 MUL AB
02A5 75F00A 458 MOV B,#10
02A8 84 459 DIV AB
02A9 F533 460 MOV 33H,A;小数位高
02AB 85F032 461 MOV 32H,B; 小数位低
02AE E528 462 MOV A,28H
02B0 A248 463 MOV C,29H.0 ;29h高位的低4字节
02B2 13 464 RRC A
02B3 A249 465 MOV C,29H.1
02B5 13 466 RRC A
02B6 A24A 467 MOV C,29H.2
02B8 13 468 RRC A
02B9 A24B 469 MOV C,29H.3
02BB 13 470 RRC A
02BC F528 471 MOV 28H,A ;重新合成.结果存在28H.
02BE E528 472 MOV A,28H
02C0 75F00A 473 MOV B,#10
02C3 84 474 DIV AB
02C4 F526 475 MOV 26H,A ;整数位高
02C6 85F025 476 MOV 25H,B ;整数位低
477 ;-------------------------
02C9 E52A 478 MOV A,2AH
02CB 75F00A 479 MOV B,#10
02CE 84 480 DIV AB
02CF 85F040 481 MOV 40H,B ;高温限值个位
02D2 75F00A 482 MOV B,#10
02D5 84 483 DIV AB
02D6 85F041 484 MOV 41H,B;十位
02D9 F542 485 MOV 42H,A;百位
486 ;----------------------------
02DB E52B 487 MOV A,2BH
02DD 75F00A 488 MOV B,#10
02E0 84 489 DIV AB
02E1 85F043 490 MOV 43H,B ;低温限值位个位
02E4 75F00A 491 MOV B,#10
02E7 84 492 DIV AB
02E8 85F044 493 MOV 44H,B ;十位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -