;SMG240128A标准图形点阵型液晶显示模块的基本演示程序[ASM51编程语言][MCS51总线接口方式] ;应用产品: SMG240128A标准图形点阵型液晶显示模块 ; 本演示程序适用于SMG240128A液晶显示模块与MCS51系列单片机采用MCS51总线接口的 ;硬件连线方式。 ; 本演示程序包括T6963C兼容芯片的MCS51总线接口方式子程序集,T6963C兼容芯片的240128 ;液晶显示模块的基本子程序,以及SMG240128系列标准图形点阵型液晶显示的基本演示子程序. ; 本演示的内容为,在240列X128行的点阵液晶显示屏上清屏,写数据,读写数据,全屏显示. ;------------------------------------------------------------------------------- ;创建日期: 2009.08.14 ;软件环境: VW For Windows ;硬件环境: AT89C52 MCU,MCS-51系列 MCU,etc. ;创建人: 褚建军(chujianjun@sunman.cn),谭超(tanchao@sunman.cn). ;技术支持: 电话(0731-84167806,84167807),传真(0731-84167807),网址(www.sunman.cn) ;版权信息: 长沙太阳人电子有限公司版权所有,转载请指明出处. ;参考网页: http:/www.sunman.cn/lcm/product/SMG240128A.html ;------------------------------------------------------------------------------- ;SMG240128A产品引脚说明及演示连线 ;PIN1: FG [构造地]-------------------VSS ;PIN2: VSS [电源地]-------------------VSS ;PIN3: VDD [电源正极]-----------------VDD(+5V) ;PIN4: Vo [LCD 偏压输入]-------------接10K的可调电阻2K电阻到VSS及VEE ; Vo=VEE时为显示最深 ;PIN5: WR [写信号 低有效]------------P3.6 ;PIN6: RD [读信号 低有效]------------P3.7 ;PIN7: CE [使能信号 低有效]----------P2.1 ;PIN8: CD [数据/命令选择端(H/L)]---P2.0 ;PIN9: NC [空脚]---------------------不连线 ;PIN10:RST [复位端 低有效]------------VDD ;PIN11:D0 [Data I/O]-----------------P0.0 ;PIN12:D1 [Data I/O]-----------------P0.1 ;PIN13:D2 [Data I/O]-----------------P0.2 ;PIN14:D3 [Data I/O]-----------------P0.3 ;PIN15:D4 [Data I/O]-----------------P0.4 ;PIN16:D5 [Data I/O]-----------------P0.5 ;PIN17:D6 [Data I/O]-----------------P0.6 ;PIN18:D7 [Data I/O]-----------------P0.7 ;PIN19:FS [字体点阵]-----------------VSS ;PIN20:VEE [LCD负压输出]--------------提供液晶负电压. ;PIN21:BLA [背光源正极]---------------见使用说明书. ;PIN22:BLK [背光源负极]---------------VSS ;注:8031的晶振频率为12MHz. ;请参见http://download.sunman.cn/lcm/product/1/SMG240128A.pdf ;------------------------------------------------------------------------------- ;以下为外部地址在演示程序中的预定义 ;用户在编写应用程序时,需按自己的实际硬件连线来重新定义 LCDCADDR EQU 0100H ;CE=0 C/D=1 LCDDADDR EQU 0000H ;CE=0 C/D=0 ;------------------------------------------------------------------------------- ;以下XPOS,YPOS变量用于指示当前操作点的位置的预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 XPOS EQU 20H ;列方向LCD点阵位置指针 YPOS EQU 21H ;行方向LCD点阵位置指针 ;------------------------------------------------------------------------------- ORG 0000H ; JMP START START: MOV SP,#60H MAIN: CALL LCDRESET ;LCD显示初始化子程序 CALL EXSAMPLE ;演示程序 JMP MAIN EXSAMPLE: ;演示程序 ;0.演示前的准备,将LCD液晶显示全部清空 MOV A,#0 ;清屏 CALL LCDFILL ;1.写入测试: 坐标点(8,8)(9,8)(10,8)(11,8)显示 ; 坐标点(12,8)(13,8),(14,8),(15,8)不显示 MOV XPOS,#8 ;定位LCDRAM地址起始位为坐标(8,8) MOV YPOS,#8 ; CALL LCDPOS ;定位LCDRAM地址 MOV A,#11110000B ;将字节数据写入当前LCDRAM地址 CALL LCDWD ;影响为当前坐标行方向8点显示 CALL EXDELAY ;延时约600mS ;2.读写测试: 读入坐标(8,8)开始的数据,将数据取反回写到坐标(8,8)开始的字节中. ; 坐标点(8,8)(9,8)(10,8)(11,8)不显示 ; 坐标点(12,8)(13,8),(14,8),(15,8)显示 CALL LCDPOS ;定位LCDRAM地址 CALL LCDRD ;读当前LCDRAM地址中的数据到A XRL A,#0FFH ;A中的数据取反 CALL LCDPOS ;定位LCDRAM地址 CALL LCDWD ;写A的数据到当前LCDRAM地址中 CALL EXDELAY ;延时约600mS ;3.全屏测试: 所有坐标点全部显示. MOV A,#0FFH ;全显 CALL LCDFILL CALL EXDELAY ;延时约600mS RET EXDELAY: ;示例延时子程序 MOV R2,#60 ;延时约1S EDY_PA: MOV R1,#100 EDY_PB: MOV R0,#49 DJNZ R0,$ DJNZ R1,EDY_PB DJNZ R2,EDY_PA RET ;------------------------------------------------------------------------------- ;以下LCDRESET,LCDPOS,LCDFILL为T6963型硬件接口的240128液晶显示模块的基本子程序 ;------------------------------------------------------------------------------- ;子程序名称:LCDRESET() ;功能:液晶显示控制器初始化 ;输入:无 ;输出:无 ;影响:R0,R2,R3,A ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRESET: ;液晶显示控制器初始化子程序 MOV A,#80H ;OR MODE CALL LCDWC ; MOV A,#98H ;图形模式 CALL LCDWC ; MOV R2,#00H ;设置图形空间首地址 MOV R3,#00H ;图形空间从RAM=0开始 MOV A,#42H CALL LCDWC3 ; MOV R2,#30 ;设置每行字节数 MOV R3,#00H ;每行字节数30个共240点 MOV A,#43H CALL LCDWC3 ; RET ;------------------------------------------------------------------------------- ;子程序名称:LCDPOS(XPOS,YPOS). ;功能:设置(XPOS,YPOS)位置对应的内部RAM地址. ;输入:位置XPOS,YPOS. ;输出:无 ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDPOS: ;设置(XPOS,YPOS)内部RAM地址的子程序 PUSH ACC ;保护现场ACC,B,R2,R3 PUSH B MOV A,R2 PUSH ACC MOV A,R3 PUSH ACC ; MOV A,XPOS ;R0=XPOS/8 ANL A,#0F8H RR A RR A RR A MOV R0,A ; MOV A,YPOS ;R2R3=30*YPOS+(XPOS/8) MOV B,#30 MUL AB ADD A,R0 MOV R2,A MOV A,B ADDC A,#0 MOV R3,A ; MOV A,#24H CALL LCDWC3 ;写内部RAM地址 POP ACC ;恢复现场ACC,B,R2,R3 MOV R3,A POP ACC MOV R2,A POP B POP ACC ; RET ;------------------------------------------------------------------------------- ;子程序名称:LCDFILL(A). ;功能:整屏显示A表示的字节数据. ;输入:A. ;输出:B=A. ;影响:R0,R2,R3,R4,R5,A,B. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDFILL: ;整屏显示A代表的字节数据子程序 MOV B,A MOV XPOS,#0 ;第1列位置 MOV YPOS,#0 ;第1行位置 MOV R2,#0 ;设置内部RAM地址为0 MOV R3,#0 MOV A,#24H CALL LCDWC3 MOV R4,#128 ;128行 LFL_PA: MOV R5,#30 ;30个字节数据共240列 LFL_PB: MOV A,B CALL LCDWD DJNZ R5,LFL_PB ; DJNZ R4,LFL_PA ; RET ;------------------------------------------------------------------------------- ;以下LCDWD,LCDRD,LCDWC,LCDWC2,LCDWC3为T6963C型硬件接口[MCS51总线接口方式]的 ; 基本子程序;LCDWDATA,LCDRDATA,LCDWAITIDLE为内部子程序. ;------------------------------------------------------------------------------- ;子程序名称:LCDWD(A). ;功能:向液晶显示控制器写图形数据. ;输入:A=图形数据. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWD: ;送图形数据子程序 PUSH ACC XCH A,R2 PUSH ACC MOV A,#0C0H CALL LCDWC2 POP ACC MOV R2,A POP ACC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRD(). ;功能:从液晶显示控制器中读图形数据. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRD: ;读图形数据子程序 MOV A,#0C1H CALL LCDWC CALL LCDRDATA RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC3(R2,R3,A). ;功能:向液晶显示控制器送带二个参数的指令. ;输入:A=指令码,R2=指令参数1,R2=指令参数2. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC3: ;送3字节指令子程序 PUSH ACC ;指令参数R2,R3,指令码A MOV A,R2 CALL LCDWDATA MOV A,R3 CALL LCDWDATA POP ACC CALL LCDWC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC2(R2,A). ;功能:向液晶显示控制器送带一个参数的指令. ;输入:A=指令码,R2=指令参数. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC2: ;送2字节指令子程序 PUSH ACC ;指令参数R2,指令码A MOV A,R2 CALL LCDWDATA POP ACC CALL LCDWC RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWC(A). ;功能:向液晶显示控制器送指令. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC: ;送指令子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDCADDR MOVX @DPTR,A POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWDATA(A). ;功能:向液晶显示控制器送数据. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWDATA: ;送数据子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDDADDR MOVX @DPTR,A POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRDATA(). ;功能:从液晶显示控制器中读数据. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.7.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRDATA: ;读数据子程序 PUSH DPH PUSH DPL CALL LCDWAITIDLE MOV DPTR,#LCDDADDR MOVX A,@DPTR POP DPL POP DPH RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWAITIDLE(). ;功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.8.17 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWAITIDLE: ;忙检测子程序 PUSH ACC MOV R0,#200 WTI_PA: MOV DPTR,#LCDCADDR ;读当前控制器状态 MOVX A,@DPTR ANL A,#03H ;D0D1=11 空闲退出 XRL A,#03H JZ WTI_LAX DJNZ R0,WTI_PA ;D0D1<>00 表示LCD控制器忙,则继续检测 ;若忙时间超过1000uS,则表示LCD控制器硬件 ;出错,退出检测 NOP ;用户可在此设置错误代码,或仿真时设置断点 JMP WTI_PA WTI_LAX: POP ACC RET