S

| 位置:门别网 › 卖家论坛 › 卖家圈子 › 帖子 |
肖邦德 等级: / 门别币:20 |
|
| 发表:2019-4-1 9:25:14 查看:725 回复:2 次 | |
如何编写12864液晶模块驱动程序【驰宇微】![]() |
|
编写12864液晶模块驱动程序要特别注意以下问题:1、时序,一般IC资料和12864液晶模块技术资料都会提供完整的时序图。时序不对,就会缺画或者乱显。2、注意12864液晶模块是由2个驱动IC同时控制的,所以在写驱动程序的时候,要注意片选信号的设置。
下面以CYW12864G为例,提供一个驱动程序供12864液晶模块使用和爱好者参考:
;TEST TO 12864-7 (C12864-1)
;CONTROLLER: KS0108
;SIDE: 128 X 64 DOTS
;DRAW: WHY
;DATE: 1999.5.24
;****************************************************************
;RS REG P3.0 ;DEFINE LCM DATA/INSTRUCTION PIN
;R/W REG P3.1 ;DEFINE LCM READ/WRITE PIN
;E REG P3.2 ;DEFINE LCM ENABLE PIN
;CS1 REG P3.3 ;DEFINE LCM CHIP 1 SELECT
;CS2 REG P3.4 ;DEFINE LCM CHIP 2 SELECT
;RSTB REG P3.5 ;DEFINE LCM RESET PIN
;DB0~DB7 REG P1.0~P1.7 ;DEFINE LCM DATA BUS
;****************************************************************
RS EQU P3.4 ; DEFINE LCM DATA/INSTRUCTION PIN
RW EQU P3.5 ; DEFINE LCM READ/WRITE PIN
E EQU P3.7 ; DEFINE LCM CHIP ENABLE PIN
CS1 EQU P3.3 ; DEFINE LCM CHIP 1 SELECT PIN
CS2 EQU P3.2 ; DEFINE LCM CHIP 2 SELECT PIN
RSTB EQU P3.0 ; DEFINE LCM /RESET PIN
;DB0~DB7 REG P1.0~P1.7 ;DEFINE LCM DATA BUS
;****************************************************************
ORG 0000H
AJMP MAIN
ORG 0030H ;由于其间可能有中断
MAIN: MOV R0, #020H
;****************************************************************
;* 为保证对LCM操作指令之前,电压已经稳定,增加一段KKL延时 *
;* 在 P3.0~P3.6的脚上输出方波,以显示程序开始执行 *
;****************************************************************
KKL: MOV P3, #7FH ; P3.0~P3.6=1,P3.7=E=0, DB0~DB7高阻,P3口变化不影响LCM
lcall DELAY
lcall DELAY
MOV P3, #00H
lcall DELAY
lcall DELAY
djnz R0, KKL ; KKL执行延时,在 P3.0~P3.6 输出方波
MOV R0, #020H
MOV P3, #7FH
KKL1: lcall DELAY ; KKL1执行后,在 P3.0~P3.6 短时保持高电平
lcall DELAY
lcall DELAY
djnz R0, KKL1
;****************************************************************
NOP
INIT: CLR RSTB ;DISPLAY RESET
NOP
NOP
SETB RSTB
MOV P3,#0FH ;E=RW=ES=0, CS1=CS2=RSTB, ENBALE CHIP 1 AND CHIP 2
SETB RW ;R/W=1
CLR RS ;RS=0
INIT1: ORL P1,#0FFH ;P1 INKEYT MODE
SETB E ;E=1 ,释放 DB0~DB7 数据总线,P1可以读LCM的数据
MOV A,P1 ;READ BUSY SIGNAL
CLR E ;E=0,DB0~DB7高阻
JB ACC.7,INIT1 ;BUSY END? 如 DB0~DB7 忙,一直查,直到不忙
JB ACC.4,INIT1 ;RESET END? 如在复位,一直查,直到退出复位
MOV A,#0C0H ;DISPLAY START LINE
LCALL TRS0 ;写命令字: 设置开始显示行为 0 行
MOV A,#03FH ;DISPLAY ON
LCALL TRS0 ;写命令字:显示开关为“开”
START:
LCALL CLEAR ; 满屏像素全部写入“0”,不亮
LCALL ICON ; 在右半屏第8页,第60列开始后的4列中全部写人数据“80H”
LCALL KEY ; 有按键按下,C=0,退出KEY,没有按键按下,一直等待
LCALL TEST ; 按键按下8次,满屏显示8个不同的字
;***********************************************************************
;* STR1: 程序从START开始执行到该处共按9次按键后,P3.1输出短时间的方波 *
;* 调试中,P3.1有短时间的方波输出,表明程序能正常执行。但显示屏 *
;* 没有数据输出,说明程序向DRAM写数据失败。 *
;************************************************************************
STR0: MOV R2, #080H
STR1: CPL P3.1 ; 输出短时间的方波
CALL DELAY
CALL DELAY
CPL P3.1
CALL DELAY
CALL DELAY
DJNZ R2, STR1
; ******************************************************************
LCALL KEY ; 有按键按下,->START循环
JMP START
; ########################################################################
;**************************************************
;* CLEAR: 向DRAM全部单元写“00“ *
;**************************************************
CLEAR: MOV P3,#0FH ; E=RW=ES=0, CS1=CS2=RSTB, CLEAR DISPLAY RAM
MOV R5,#0B8H
MOV A,#0C0H ; 设置显示开始行地址:Z=0
LCALL TRS0
CLEAR2: MOV A,R5
LCALL TRS0 ; 设置页地址:X=0
MOV A,#40H ; 设置列地址:Y=0
LCALL TRS0
MOV R4,#40H ; 设置列长度=64列
CLEAR1: MOV A,#00H
LCALL TRS1 ;向DRAM指定单元写“00”,然后列地址自动加一
DJNZ R4,CLEAR1 ;向DRAM全部单元(64列)写“00”
INC R5 ;X=X+1,即指向下一页
CJNE R5,#0C0H,CLEAR2 ; 同上操作,写满8页结束
RET
;********************************************************************
; ICON: 在右半屏第8页,第60列开始后的4列中全部写人数据“80H” *
;********************************************************************
ICON: CLR CS1 ;TEST ICON, CS1=0:左半屏关
SETB CS2 ; CS2=1:右半屏开
MOV A,#0BFH ; 设置页地址:X=7,第8页
LCALL TRS0
MOV A,#07CH ; 设置列地址:Y=60
LCALL TRS0
MOV R4,#04H
MOV A,#80H
ICON1: LCALL TRS1 ; 第8页,第60列开始后的4列全部写人数据“80H”
DJNZ R4,ICON1
RET
;****************************************************************
; TEST: 按键按下8次,满屏显示8个不同的字 *
;****************************************************************
TEST: MOV DPTR,#ADATA ;TEST 1
MOV 67H,DPH
MOV 68H,DPL ;#ADATA->[67H、68H]
MOV R0,#07H
TEST5: MOV R5,#0B8H
MOV P3,#0FH ; E=RW=ES=0, CS1=CS2=RSTB
TEST3: MOV A,R5
LCALL TRS0 ; 设置页地址: X=0
MOV A,#40H
LCALL TRS0 ; 设置列地址: Y=0
MOV R4,#08H ; 定义写8个字模
TEST2: MOV DPH,67H
MOV DPL,68H ; 初:DPTR ->#ADATA
MOV R3,#08H ; 定义字模宽度=8列
TEST1: MOV A,#00H
MOVC A,@A+DPTR
LCALL TRS1 ; 向DRAM指定页、列写入字模数据后,列地址自动加一
INC DPTR ; DPTR-> 下一个字模数据的地址
DJNZ R3,TEST1 ; 写入8列,一个字模数据写结束
DJNZ R4,TEST2 ; 一个字模数据写结束后,->TEST2,在后续列重写前面一个字模数据
INC R5 ; 写了8个,指向下一页
CJNE R5,#0BFH,TEST3 ; 在8页中写64个同一个字模数据的内容
SETB CS1 ; CS1=1:左半屏开
CLR CS2 ; CS2=0:右半屏关
MOV A,#0BFH
LCALL TRS0 ; 设置页地址:X=7,第8页
MOV A,#40H
LCALL TRS0 ; 设置列地址:Y=0
LCALL TESTS ; 在DRAM第8页中写入8个同一字模的内容
CLR CS1 ; CS1=0:左半屏关
SETB CS2 ; CS2=1:右半屏开
MOV A,#0BFH
LCALL TRS0 ; 设置页地址:X=7,第8页
MOV A,#40H
LCALL TRS0 ; 设置列地址:Y=0
LCALL TEST
关键词标签:
12864
| 内容违规投诉举报请联系在线客服QQ:278336453 |
| 今日最新卖家热点 |
|
更多内容>>![]() |
| 下载APP客户端,随时随地上门别,方便卖家网店交易 |
| 话题回复 |
快了年华 等级: / 门别币:123第1楼 |
编写
admin 等级: / 门别币:3322第2楼 |
||
|
||