液晶模块是AMPIRE12864,控制器是KS0108.电路图如下图所示。 使用查询“忙状态”指令结果BUSY位总为1,陷入死循环,如果用延时,那么整个程序的结果就是正确的,所以问题出在查询忙上,在KEIL里一步一步执行也可以看出这一点. 程序如下:
;TEST 12864 ;CONTROLLER: KS0108 ;SIDE: 128 X 64 DOTS ;DRAW: WHY ;**************************************************************** CS1 EQU P3.2 ;定义左半屏 CS2 EQU P3.3 ;定义右半屏 RS EQU P3.4 ;定义数据指令线 RW EQU P3.5 ;定义读写线 E EQU P3.6 ;使能端
ORG 00H AJMP MAIN ORG 50H MAIN: LCALL BUSY CLR CS1 ;开左半屏显示 SETB E CLR RS CLR RW MOV P1,#3FH ;开显示 CLR E LCALL CLEAR ;调用清屏子程序
LCALL BUSY CLR CS2 ;开右半屏显示 SETB E CLR RS CLR RW MOV P1,#3FH ;开显示 CLR E LCALL CLEAR ;清右半屏
AJMP $
;BUSY: MOV R5,#0FH ;延时以避开忙状态 ;LOOP: MOV R6,#0FH ; DJNZ R6,$ ; DJNZ R5,LOOP ; RET
BUSY: ; MOV P1,#0ffH ;看到别人的程序有的有这一句,照抄了试验还是不对 CLR RS SETB RW SETB E MOV A,P1 CLR E JB ACC.7,BUSY RET
CLEAR: MOV R0,#8H ;清屏子程序 MOV R1,#0B8H TEST: LCALL BUSY SETB E CLR RS CLR RW MOV P1,R1 ;从第一页开始 CLR E
MOV R2,#40H MOV R3,#40H TRY: LCALL BUSY SETB E CLR RS CLR RW MOV P1,R3 ;从第一列开始 CLR E
LCALL BUSY SETB E SETB RS CLR RW MOV P1,#00H ;往每个显示地址送0,即清屏 CLR E INC R3 DJNZ R2,TRY
INC R1 DJNZ R0,TEST RET
END |