所有读取指令的 SETB E 位置不对 读忙标志的时不能在那瞎等而是重新读 LCD不同,你的LCD初始化我不知道对不对 楼主应该根据自己的LCD资料上的时序严格控制好每个LCD显示控制位 下面的程序在我的LCD上可以(晶振:11.059MH) COMMAND EQU 30H ;存指令 D_DATA EQU 31H ;存数据 DI EQU P1.2 RW EQU P1.1 E EQU P1.0 ;连线方式 ORG 0000H AJMP START ORG 0100H START: ; MOV SP,#60H SETB P1.3 CLR P1.4 ;片选信号 MOV COMMAND,#00110000B ACALL W_COMMAND ;function set--8bit operation and 2 lines MOV COMMAND,#0x0c ACALL W_COMMAND ;display on:The whole ALL_ON MOV COMMAND,#0x01 ACALL W_COMMAND ;Clear LCD MOV A,#250 ACALL DELAY_A ;≈5ms
MOV COMMAND,#0x06 ACALL W_COMMAND ;Entry Mode Set:DDRAM Sddress COUNTER(ac)+1 MOV COMMAND,#0x81 ACALL W_COMMAND ;设置第一行显示起始位置
MOV DPTR,#FAN1 MOV R0,#00H NEXT1: MOV A,R0 MOVC A,@A+DPTR MOV D_DATA,A ACALL W_DATA INC R0 CJNE R0,#10H,NEXT1 MOV COMMAND,#0x91 ACALL W_COMMAND ;设置第二行显示起始位置 MOV DPTR,#FAN2 MOV R0,#00H NEXT2: MOV A,R0 MOVC A,@A+DPTR MOV D_DATA,A ACALL W_DATA INC R0 CJNE R0,#10H,NEXT2 AJMP $ BUSY: MOV P0,#0FFH ;读忙标志位 SETB RW CLR DI CLR E NOP NOP SETB E NOP NOP JB P0.7,BUSY NOP NOP CLR E NOP NOP RET W_COMMAND:ACALL BUSY ;写指令 CLR RW CLR DI CLR E NOP NOP MOV P0,COMMAND NOP NOP SETB E NOP NOP CLR E MOV A,#4 ;有读取忙标志指令时可以不用 LCALL DELAY_A ;≈80us RET W_DATA: ACALL BUSY ;写数据 CLR RW SETB DI CLR E NOP NOP MOV P0,D_DATA NOP NOP SETB E NOP NOP CLR E MOV A,#4 ;有读取忙标志指令时可以不用 LCALL DELAY_A ;≈80us RET FAN1: DB 0X54,0X52,0X49,0X42,0X4C,0X45,0XC6,0XB5
DB 0X54,0X52,0X49,0X42,0X4C,0X45,0XC6,0XB5
FAN2: DB 0XD4,0XF5,0X49,0X42,0X4C,0X45,0XC6,0XB5
DB 0X54,0X52,0X49,0X42,0X4C,0X45,0XC6,0XB5 RET ;========================A*20us延时程序================== DELAY_A: MOV R3,A DELAY20us: MOV R2,#9 ;≈20us DJNZ R2,$ DJNZ R3,DELAY20us RET ;======================================================= END
|