📄 pcf8591-da-lcd1602-asm.lst
字号:
0190 494E4520
0194 20574156
0198 45202020
019C 00
224
019D 20205351 225 INFOA: DB " SQUARE WAVE ",0 ;LCD 第二行显示信息 方波
01A1 55415245
01A5 20205741
01A9 56452020
01AD 00
226
01AE 20545249 227 INFOB: DB " TRIANGLE WAVE ",0 ;LCD 第二行显示信息
01B2 414E474C
A51 MACRO ASSEMBLER PCF8591_DA_LCD1602_ASM 12/20/2006 22:57:40 PAGE 5
01B6 45202057
01BA 41564520
01BE 00
228
01BF 20204543 229 INFOC: DB " ECHELON WAVE ",0 ;LCD 第二行显示信息
01C3 48454C4F
01C7 4E205741
01CB 56452020
01CF 00
230
01D0 20534157 231 INFOD: DB " SAWTOOTH WAVE ",0 ;LCD 第二行显示信息
01D4 544F4F54
01D8 48202057
01DC 41564520
01E0 00
232
233 ;==========================================================
234
235 ; LCD 接口初始化
236
237 ;==========================================================
01E1 238 INIT_LCD:
01E1 5106 239 CALL DELAY1 ;延时15ms,等待LCD供电稳定
01E3 5106 240 CALL DELAY1
01E5 5106 241 CALL DELAY1
242
01E7 7438 243 MOV A,#38H ;双列显示,字形5*7点阵
01E9 513D 244 CALL WCOM
01EB 5106 245 CALL DELAY1
01ED 7438 246 MOV A,#38H ;双列显示,字形5*7点阵
01EF 513D 247 CALL WCOM
01F1 5106 248 CALL DELAY1
01F3 7438 249 MOV A,#38H ;双列显示,字形5*7点阵
01F5 513D 250 CALL WCOM
01F7 5106 251 CALL DELAY1
01F9 740C 252 MOV A,#0CH ;开显示,关光标,
01FB 513D 253 CALL WCOM
01FD 5106 254 CALL DELAY1
01FF 7401 255 MOV A,#01H ;清除 LCD 显示屏
0201 513D 256 CALL WCOM
0203 5106 257 CALL DELAY1
0205 22 258 RET
259 ;==========================================================
260 ;延时5MS =
261 ;==========================================================
0206 262 DELAY1:
0206 7E19 263 MOV R6,#25
0208 264 DEL:
0208 7F64 265 MOV R7,#100
020A DFFE 266 DJNZ R7,$
020C DEFA 267 DJNZ R6,DEL
020E 22 268 RET
269 ;==========================================================
270 ; =
271 ;在LCD的第一行或第二行显示信息字符 =
272 ; =
273 ;==========================================================
020F 274 LCD_SHOW:
275
020F B4010C 276 CJNE A,#1,LINE2 ;判断是否为第一行
0212 277 LINE1:
0212 7480 278 MOV A,#80H ;设置 LCD 的第一行地址
0214 513D 279 CALL WCOM ;写入命令
0216 5134 280 CALL CLR_LINE ;清除该行字符数据
0218 7480 281 MOV A,#80H ;设置 LCD 的第一行地址
021A 513D 282 CALL WCOM ;写入命令
A51 MACRO ASSEMBLER PCF8591_DA_LCD1602_ASM 12/20/2006 22:57:40 PAGE 6
021C 800A 283 JMP FILL
021E 284 LINE2:
021E 74C0 285 MOV A,#0C0H ;设置 LCD 的第二行地址
0220 513D 286 CALL WCOM ;写入命令
0222 5134 287 CALL CLR_LINE ;清除该行字符数据
0224 74C0 288 MOV A,#0C0H ;设置 LCD 的第二行地址
0226 513D 289 CALL WCOM
0228 290 FILL:
0228 E4 291 CLR A ;填入字符
0229 93 292 MOVC A,@A+DPTR ;由消息区取出字符
022A B40001 293 CJNE A,#0,LC1 ;判断是否为结束码
022D 22 294 RET
022E 295 LC1:
022E 514A 296 CALL WDATA ;写入数据
0230 A3 297 INC DPTR ;指针加1
0231 80F5 298 JMP FILL ;继续填入字符
0233 22 299 RET
300 ;---------------------------------------------------------
0234 301 CLR_LINE: ;清除该行 LCD 的字符
0234 7818 302 MOV R0,#24
0236 303 CL1:
0236 7420 304 MOV A,#' '
0238 514A 305 CALL WDATA
023A D8FA 306 DJNZ R0,CL1
023C 22 307 RET
308 ;==========================================================
309
310 ;写指令使能子程序
311 ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
312
313 ;==========================================================
023D 314 WCOM:
023D F580 315 MOV P0,A
023F C2A0 316 CLR LCD_RS
0241 C2A1 317 CLR LCD_RW
0243 D2A2 318 SETB LCD_EN
0245 5157 319 CALL DELAY0
0247 C2A2 320 CLR LCD_EN
0249 22 321 RET
322 ;==========================================================
323
324 ;写数据使能子程序
325 ;RS=H,RW=L,D0-D7=数据,E=高脉冲
326
327 ;==========================================================
024A 328 WDATA:
024A F580 329 MOV P0,A
024C D2A0 330 SETB LCD_RS
024E C2A1 331 CLR LCD_RW
0250 D2A2 332 SETB LCD_EN
0252 5157 333 CALL DELAY0
0254 C2A2 334 CLR LCD_EN
0256 22 335 RET
0257 336 DELAY0:
0257 7FFA 337 MOV R7,#250 ;延时500微秒
0259 DFFE 338 DJNZ R7,$
025B 22 339 RET
340
341 ;==========================================================
342
343 ;在 LCD 第一行指定位置显示字符
344 ;(A)=ASCII 数据, (B)=位置变量
345
346 ;==========================================================
025C 347 LCDP1:
025C C0E0 348 PUSH ACC ;入栈保护A
A51 MACRO ASSEMBLER PCF8591_DA_LCD1602_ASM 12/20/2006 22:57:40 PAGE 7
025E E5F0 349 MOV A,B ;设置显示地址
0260 2480 350 ADD A,#80H ;设置LCD的第一行地址
0262 513D 351 CALL WCOM ;写入命令
0264 D0E0 352 POP ACC ;由堆栈取出A
0266 514A 353 CALL WDATA ;写入数据
0268 22 354 RET
355 ;==========================================================
356
357 ;在 LCD 第二行指定位置显示字符
358 ;(A)=ASCII 数据, (B)=位置变量
359
360 ;==========================================================
0269 361 LCDP2:
0269 C0E0 362 PUSH ACC ;入栈保护A
026B E5F0 363 MOV A,B ;设置显示地址
026D 24C0 364 ADD A,#0C0H ;设置LCD的第二行地址
026F 513D 365 CALL WCOM ;写入命令
0271 D0E0 366 POP ACC ;由堆栈取出A
0273 514A 367 CALL WDATA ;写入数据
0275 22 368 RET
369
370 ;====================================================================
371 ;蜂鸣器响一声子程序
372 ;====================================================================
0276 373 BEEP_BL:
0276 7E64 374 MOV R6,#100
0278 375 DEL1:
0278 120283 376 LCALL DEL2
027B B2B7 377 CPL BEEP
027D DEF9 378 DJNZ R6,DEL1
027F 120289 379 LCALL DEL4
0282 22 380 RET
0283 381 DEL2:
0283 7FB4 382 MOV R7,#180
0285 383 DEL3:
0285 00 384 NOP
0286 DFFD 385 DJNZ R7,DEL3
0288 22 386 RET
0289 387 DEL4:
0289 7EC8 388 MOV R6,#200
028B 389 DEL5:
028B 7FFA 390 MOV R7,#250
028D DFFE 391 DJNZ R7,$
028F DEFA 392 DJNZ R6,DEL5
0291 22 393 RET
394 ;==========================================================
395 ;延时100MS =
396 ;==========================================================
0292 397 DELAY:
0292 7EC8 398 MOV R6,#200
0294 399 DEL6:
0294 7FFA 400 MOV R7,#250
0296 DFFE 401 DJNZ R7,$
0298 DEFA 402 DJNZ R6,DEL6
029A 22 403 RET
404
405 ;==========================================================
406 ;D/A 转换子程序
407
408 ;R1 D/A转换数据指针,初值为DA_DATA。
409 ;R2 存放D/A转换数据个数。
410 ;==========================================================
029B 411 PCF_DA:
029B 00 412 NOP
029C 120482 413 LCALL STR ;启动I2C总线
029F 7490 414 MOV A,#90H ;写PCF8591 A/D 寻址字
A51 MACRO ASSEMBLER PCF8591_DA_LCD1602_ASM 12/20/2006 22:57:40 PAGE 8
02A1 120498 415 LCALL WR0
02A4 120519 416 LCALL CHEK
02A7 20D5F1 417 JB F0,PCF_DA
418
02AA 7440 419 MOV A,#DACOM ;PCF8591 D/A的控制命令(40H)
02AC 120498 420 LCALL WR0
02AF 120519 421 LCALL CHEK
02B2 20D5E6 422 JB F0,PCF_DA
02B5 22 423 RET
02B6 424 PCF_DA1:
02B6 E7 425 MOV A,@R1
02B7 120498 426 LCALL WR0
02BA 120519 427 LCALL CHEK
02BD 20D5F6 428 JB F0,PCF_DA1
429 ;LCALL STOP
02C0 22 430 RET
431
432 ;=========================================================
433 ;程序功能:正弦信号发生
434
435 ;出口:从D/A通道输出正弦电压信号
436 ;=========================================================
02C1 437 SINE:
02C1 75F000 438 MOV B,#00H
02C4 519B 439 ACALL PCF_DA
02C6 440 SIN1:
02C6 30970D 441 JNB K4,SIN_END ;退出
02C9 E5F0 442 MOV A,B
02CB 9002DF 443 MOV DPTR,#SIN_TAB
02CE 93 444 MOVC A,@A+DPTR
02CF F7 445 MOV @R1,A
02D0 51B6 446 ACALL PCF_DA1 ;DA转换
02D2 05F0 447 INC B
02D4 41C6 448 AJMP SIN1
02D6 449 SIN_END:
02D6 12052E 450 LCALL STOP
02D9 D201 451 SETB 20H.1
02DB 120276 452 LCALL BEEP_BL
02DE 22 453 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -