程序及连线图: 89C51 ;连线图: *LCM---89C51* *LCM---89C51* *LCM------------89C51* ; *DB0---P1.0* *DB4---P1.4* *RS-------------P3.0* ; *DB1---P1.1* *DB5---P1.5* *RW-------------P3.1* ; *DB2---P1.2* *DB6---P1.6* *E--------------P3.5* (参考于说明书) ; *DB3---P1.3* *DB7---P1.7* *VLCD接10K可调电阻到GND* ;************************************************************************** RSPIN EQU P3.0 RWPIN EQU P3.1 EPIN EQU P3.5 XPOS EQU 20H ;列方向地址指针(用于LCDPOS子程序) YPOS EQU 21H ;行方向地址指针(用于LCDPOS子程序) ORG 0000H JMP START START: MOV SP,#60H CLR EPIN MAIN: MOV R7,#'0' ;测试主程序 MN_PA: ;整屏循环显示"0"到"9"及空格 CALL LCDRESET MOV A,R7 CALL LCDFILL CALL DELAY400MS INC R7 MOV A,R7 CJNE A,#'9'+1,MN_PA MOV A,#' ' CALL LCDFILL CALL DELAY400MS JMP MAIN LCDFILL: MOV B,A MOV YPOS,#0 LFL_PB: MOV XPOS,#0 ;整屏显示A中所代表字符 LFL_PA: MOV A,B CALL LCDWRITE INC XPOS MOV A,XPOS CJNE A,#20,LFL_PA INC YPOS MOV A,YPOS CJNE A,#4,LFL_PB RET LCDPOS: ;设置第(XPOS,YPOS)个字符的DDRAM地址 PUSH ACC CLR C ;X位置范围(0到19) MOV A,XPOS SUBB A,#20 JC LPS_LBX MOV XPOS,#0 LPS_LBX:ANL YPOS,#03H ;Y位置范围(0到3) MOV A,YPOS ;(XPOS,YPOS)对应DDRAM地址 CJNE A,#00,LPS_LA1 MOV A,XPOS ;(第一行)X: 第0----19个字符 JMP LPS_LAX ; DDRAM: 0----13H LPS_LA1:CJNE A,#01,LPS_LA2 MOV A,XPOS ;(第二行)X: 第0----19个字符 ADD A,#40H ; DDRAM: 40----53H JMP LPS_LAX ; LPS_LA2:CJNE A,#02,LPS_LAY MOV A,XPOS ;(第三行)X: 第0----19个字符 ADD A,#14H ; DDRAM: 14----27H JMP LPS_LAX LPS_LAY:MOV A,XPOS ;(第四行)X: 第0----19个字符 ADD A,#54H ; DDRAM: 54----67H LPS_LAX:ORL A,#80H ;设置DDRAM地址 CALL LCDWC POP ACC RET LCDWRITE: ;定位写字符子程序 CALL LCDPOS ;定位显示地址 CALL LCDWD ;写字符 RET LCDRESET: ;初始化程序 CALL DELAY5MS ;延时15MS CALL DELAY5MS CALL DELAY5MS MOV A,#38H ;显示模式设置(不检测忙信号) CALL LCDWCN ;共三次 CALL DELAY5MS MOV A,#38H CALL LCDWCN CALL DELAY5MS MOV A,#38H CALL LCDWCN MOV A,#38H ;显示模式设置(以后均检测忙信号) CALL LCDWC MOV A,#08H ;显示关闭 CALL LCDWC MOV A,#01H ;显示清屏 CALL LCDWC MOV A,#06H ;显示光标移动设置 CALL LCDWC MOV A,#0CH ;显示开及光标设置 CALL LCDWC RET LCDWC: ;送控制字子程序(检测忙信号) CALL WAITIDLE LCDWCN: ;送控制字子程序(不检测忙信号) CLR RSPIN ;RS=0 RW=0 E=高脉冲 CLR RWPIN MOV P1,A SETB EPIN NOP CLR EPIN RET LCDWD: ;写字符子程序 CALL WAITIDLE SETB RSPIN ;RS=1 RW=0 E=高脉冲 CLR RWPIN MOV P1,A SETB EPIN NOP CLR EPIN RET WAITIDLE: PUSH ACC ;正常读写操作之前必须检测LCD控制器状态 MOV P1,#0FFH CLR RSPIN ;RS=0 RW=1 E=高电平 SETB RWPIN SETB EPIN WTD_PA: NOP ;DB7: 0 LCD控制器空闲 JB P1.7,WTD_PA ; 1 LCD控制器忙 CLR EPIN POP ACC RET DELAY5MS: MOV R1,#25 ;延时子程序(5MS) DL5_PA: MOV R2,#100 DJNZ R2,$ DJNZ R1,DL5_PA RET DELAY400MS: MOV R0,#20 ;延时子程序(400MS) DL4_PA: MOV R1,#100 DL4_PB: MOV R2,#100 DJNZ R2,$ DJNZ R1,DL4_PB DJNZ R0,DL4_PA RET END
请问:这个程序是不是正确的?如果是正确的,就应该显示0-9及空格依次显示. 但经过我反复实验,都不能达到这种效果,请问是什么原因呢?
|