;SMC2004A标准字符点阵型液晶显示模块的演示程序[ASM51编程语言][MCS51总线接口方式] ;应用产品: SMC2004A标准字符点阵型液晶显示模块 ; 本演示程序适用于SMC2004A液晶显示模块与MCS51系列单片机采用MCS51总线接口的 ;硬件连线方式。 ; 本演示程序包括HD44780兼容芯片的MCS51总线接口方式子程序集,SMC2004系列标准字符 ;点阵型液晶显示模块的接口子程序集,HD44780兼容芯片的液晶显示控制器的通用子程序集, ;以及SMC2004系列标准字符点阵型液晶显示的演示子程序. ; 本演示的内容为,在20列ASCII字符X4行的液晶显示屏上显示"SMC2004A", ;"WWW.SUNMAN.CN","TEL:073184167806","FAX:073184167807"所有数字0..9依次全屏显示 ;一遍,显示清屏,所有英文字母依次显示,依次读字符并加1后送回LCD显示. ;------------------------------------------------------------------------------- ;创建日期: 2009.08.12 ;软件环境: 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/SMC2004A.html ;------------------------------------------------------------------------------- ;SMC2004A产品引脚说明及演示连线 ;PIN1: VSS [电源地]-------------------VSS ;PIN2: VDD [电源正极]-----------------VDD ;PIN3: Vo [LCD 偏压输入]-------------接10K的可调电阻到VSS,0为显示最深 ;PIN4: RS [数据/命令选择端输入]------P2.0 ;PIN5: RW [读写控制信号输入]---------P2.1 ;PIN6: E [使能信号输入]-------------接门电路到P2.7,RD,WR ;PIN7: D0 [Data I/O]-----------------P0.0 ;PIN8: D1 [Data I/O]-----------------P0.1 ;PIN9: D2 [Data I/O]-----------------P0.2 ;PIN10:D3 [Data I/O]-----------------P0.3 ;PIN11:D4 [Data I/O]-----------------P0.4 ;PIN12:D5 [Data I/O]-----------------P0.5 ;PIN13:D6 [Data I/O]-----------------P0.6 ;PIN14:D7 [Data I/O]-----------------P0.7 ;PIN15:BLA [背光源正极]---------------接10欧电阻到+5V. ;PIN16:BLK [背光源负极]---------------VSS ;请参见http://download.sunman.cn/lcm/product/1/SMC2004A.pdf ;字符表参见http://download.sunman.cn/lcm/reference/HD44780_CHARACTER_TABLE.pdf ;------------------------------------------------------------------------------- ;以下为产品接口引脚在演示程序中的预定义 ;用户在编写应用程序时,需按自己的实际硬件连线来重新定义 LCDCRADDR EQU 8200H ;状态读地址CS(P2.7)=1,RW(P2.1)=1,RS(P2.0)=0 LCDCWADDR EQU 8000H ;指令写地址CS(P2.7)=1,RW(P2.1)=0,RS(P2.0)=0 LCDDRADDR EQU 8300H ;数据读地址CS(P2.7)=1,RW(P2.1)=1,RS(P2.0)=1 LCDDWADDR EQU 8100H ;指令写地址CS(P2.7)=1,RW(P2.1)=0,RS(P2.0)=1 ;------------------------------------------------------------------------------- ;以下CXPOS,CYPOS变量用于指示当前操作字符的位置的预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 CXPOS EQU 20H ;列方向地址指针(用于CHARLCDPOS子程序) CYPOS EQU 21H ;行方向地址指针(用于CHARLCDPOS子程序) ;------------------------------------------------------------------------------- ORG 0000H ; JMP START START: MOV SP,#60H MAIN: CALL EXSAMPLE ;调用演示程序 JMP MAIN STR1: DB "SMC2004A",0 STR2: DB "WWW.SUNMAN.CN",0 STR3: DB "TEL:073184167806",0 STR4: DB "FAX:073184167807",0 EXSAMPLE: ;演示程序 ;0.演示前的准备,LCD液晶显示控制器初始化,所有显示全清零 CALL LCDRESET ;液晶显示控制器初始化 MOV A,#' ' CALL CHARFILL ;显示清屏 ;1.字符串演示: 在(6,0)字符位置显示"SMC2004A" MOV CXPOS,#6 ;设置当前显示位置为第7列 MOV CYPOS,#0 ;设置当前显示位置为第1行 MOV DPTR,#STR1 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;2.字符串演示: 在(4,1)字符位置显示"WWW.SUNMAN.CN" MOV CXPOS,#4 ;设置当前显示位置为第5列 MOV CYPOS,#1 ;设置当前显示位置为第2行 MOV DPTR,#STR2 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;3.字符串演示: 在(2,2)字符位置显示"TEL:073184167806" MOV CXPOS,#2 ;设置当前显示位置为第3列 MOV CYPOS,#2 ;设置当前显示位置为第3行 MOV DPTR,#STR3 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;4.字符串演示: 在(2,3)字符位置显示"TEL:073184167807" MOV CXPOS,#2 ;设置当前显示位置为第3列 MOV CYPOS,#3 ;设置当前显示位置为第4行 MOV DPTR,#STR4 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;5.字符填充演示: 整屏显示0..9 空格一遍 MOV R7,#'0' ;初始数字为0 ESP_PA: ; MOV A,R7 ; CALL CHARFILL ;整屏显示为A的值 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#'9'+1,ESP_PA ; MOV A,#' ' ; CALL CHARFILL ;显示清屏 CALL EXDELAY ;延时300mS ;6.字符演示: 依次显示A..Z 一遍 MOV R7,#'A' ;依次显示A..Z一遍 ESP_PB: ; MOV A,R7 ; CALL PUTCHAR ;当前位置显示为A的值 CALL CHARCURSORNEXT ;置字符位置为下一个有效位置 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#'Z'+1,ESP_PB ; ;7.字符演示: 依次读字符并加1后送回LCD显示. MOV CXPOS,#0 ;设置起始列为第1列 MOV CYPOS,#0 ;设置起始行为第1行 MOV R7,#0 ; ESP_PC: ; CALL GETCHAR ;读当前位置字符的ASCII码 ADD A,#1 ;将读出的ASCII码加1后送回LCD显示 CALL PUTCHAR ; CALL CHARCURSORNEXT ;置字符位置为下一个有效位置 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#32,ESP_PC ;依次读32个字符 RET EXDELAY: ;演示延时子程序 MOV R2,#30 ;延时约300mS EDY_PA: MOV R1,#100 EDY_PB: MOV R0,#49 DJNZ R0,$ DJNZ R1,EDY_PB DJNZ R2,EDY_PA RET ;------------------------------------------------------------------------------- ;以下为CHARFILL,PUTSTR,PUTCHAR为HD44780兼容芯片的液晶显示控制器的通用子程序 ;------------------------------------------------------------------------------- ;子程序名称:CHARFILL(A). ;功能:整屏显示A代表的ASCII字符. ;输入:A. ;输出:无. ;影响:R0,ACC. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- CHARFILL: ;整屏显示A代表的ASCII字符子程序 MOV CXPOS,#0 ;第1列字符位置 MOV CYPOS,#0 ;第1行字符位置 LFL_PA: CALL PUTCHAR ;定位写字符 CALL CHARCURSORNEXT ;置字符位置为下一个有效位置 MOV R0,CXPOS CJNE R0,#0,LFL_PA ;字符位置没有回到第1列字符位置,则重复写字符 MOV R0,CYPOS CJNE R0,#0,LFL_PA ;字符位置没有回到第1行字符位置,则重复写字符 RET ;------------------------------------------------------------------------------- ;子程序名称:PUTSTR(DPTR). ;功能:在(CXPOS,CYPOS)字符位置写字符串. ;输入:DPTR. ;输出:无. ;影响:R0,ACC,DPTR. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTSTR: ;定位写字符串子程序 CLR A MOVC A,@A+DPTR JZ PSR_LAX ;为零表示字符串结束,退出 CALL PUTCHAR ;写1个字符 CALL CHARCURSORNEXT ;字符位置移到下一个 INC DPTR ;字符串指针移到下一个 JMP PUTSTR ;重新读字符串 PSR_LAX: RET ;------------------------------------------------------------------------------- ;子程序名称:PUTCHAR(A). ;功能:在(CXPOS,CYPOS)字符位置写字符. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTCHAR: ;在(CXPOS,CYPOS)字符位置写字符子程序 CALL CHARLCDPOS ;设置(CXPOS,CYPOS)字符位置的DDRAM地址 CALL LCDWD ;写字符 RET ;------------------------------------------------------------------------------- ;子程序名称:GETCHAR(A). ;功能:在(CXPOS,CYPOS)字符位置读字符. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- GETCHAR: ;在(CXPOS,CYPOS)字符位置读字符子程序 CALL CHARLCDPOS ;设置(CXPOS,CYPOS)字符位置的DDRAM地址 CALL LCDRD ;读字符 RET ;------------------------------------------------------------------------------- ;以下为CHARLCDPOS,CHARCURSORNEXT,LCDRESET为HD44780兼容芯片的液晶显示控制器的 ;20字符X4行的SMC2004系列标准字符点阵型液晶显示模块的接口程序. ;------------------------------------------------------------------------------- ;子程序名称:CHARLCDPOS(). ;功能:设置(CXPOS,CYPOS)字符位置的DDRAM地址. ;输入:无. ;输出:无. ;影响:无. ;修改日期:2009.08.13 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- CHARLCDPOS: ;设置(CXPOS,CYPOS)字符位置的DDRAM地址 PUSH ACC CLR C ;X位置范围(0到19) MOV A,CXPOS SUBB A,#20 JC LPS_LBX MOV CXPOS,#00H LPS_LBX:ANL CYPOS,#03H ;Y位置范围(0到3) MOV A,CYPOS ;(XPOS,YPOS)对应DDRAM地址 CJNE A,#00,LPS_LA1 ;(第一行)X: 第0----19个字符 MOV A,CXPOS ; DDRAM: 0----13H JMP LPS_LAX LPS_LA1:CJNE A,#01,LPS_LA2 MOV A,CXPOS ;(第二行)X: 第0----19个字符 ADD A,#40H ; DDRAM: 40----53H JMP LPS_LAX LPS_LA2:CJNE A,#02,LPS_LA3 MOV A,CXPOS ;(第三行)X: 第0----19个字符 ADD A,#14H ; DDRAM: 14----27H JMP LPS_LAX LPS_LA3:MOV A, CXPOS ;(第四行)X: 第0----19个字符 ADD A,#54H ; DDRAM: 54----67H LPS_LAX:ORL A,#80H ;设置DDRAM地址 CALL LCDWC POP ACC RET ;------------------------------------------------------------------------------- ;子程序名称:CHARCURSORNEXT(). ;功能:置字符位置为下一个有效位置. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.08.13 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- CHARCURSORNEXT: ;置字符位置为下一个有效位置子程序 INC CXPOS ;字符位置加1 MOV R0,CXPOS ;字符位置XPOS的有效范围为(0到19) CJNE R0,#20,CSN_LAX ;XPOS为20表示要换行 MOV CXPOS,#0 ;字符列位置设置为第1列 INC CYPOS ANL CYPOS,#03H ;字符位置YPOS的有效范围为(0到3) CSN_LAX: RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRESET(). ;功能:液晶显示控制器初始化. ;输入:无. ;输出:无. ;影响:R0,ACC. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRESET: ;SMC2004系列液晶显示控制器初始化子程序 MOV A,#38H ;2004的显示模式字为38H CALL LCDWC ;显示模式设置第一次 CALL DELAY3MS ;延时3MS CALL LCDWC ;显示模式设置第二次 CALL DELAY3MS ;延时3MS CALL LCDWC ;显示模式设置第三次 CALL DELAY3MS ;延时3MS CALL LCDWC ;显示模式设置第四次 CALL DELAY3MS ;延时3MS MOV A,#08H ;显示关闭 CALL LCDWC MOV A,#01H ;清屏 CALL LCDWC CALL DELAY3MS ;延时3MS MOV A,#06H ;显示光标移动设置 CALL LCDWC MOV A,#0CH ;显示开及光标设置 CALL LCDWC RET RET DELAY3MS: ;延时3MS子程序 MOV R1,#15 DL3_PA: MOV R2,#100 DJNZ R2,$ DJNZ R1,DL3_PA RET ;------------------------------------------------------------------------------- ;以下LCDWC,LCDWD,LCDRD为HD44780兼容芯片的MCS51总线接口方式的基本子程序, ;LCDWAITIDLE为内部子程序. ;------------------------------------------------------------------------------- ;子程序名称:LCDWC(A). ;功能:送控制字到液晶显示控制器. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC: ;送控制字子程序 PUSH DPL PUSH DPH CALL LCDWAITIDLE ;HD44780液晶显示控制器忙检测 MOV DPTR,#LCDCWADDR MOVX @DPTR,A POP DPH POP DPL RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWD(A). ;功能:送数据到液晶显示控制器. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.08.13 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWD: ;送数据子程序 PUSH DPL PUSH DPH CALL LCDWAITIDLE ;HD44780液晶显示控制器忙检测 MOV DPTR,#LCDDWADDR MOVX @DPTR,A POP DPH POP DPL RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRD(). ;功能:读数据到液晶显示控制器. ;输入:无. ;输出:A. ;影响:R0. ;修改日期:2009.08.12 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRD: ;读数据子程序 PUSH DPL PUSH DPH CALL LCDWAITIDLE ;HD44780液晶显示控制器忙检测 MOV DPTR,#LCDDRADDR MOVX A,@DPTR POP DPH POP DPL RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWAITIDLE(). ;功能:忙检测. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.08.13 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWAITIDLE: ;忙检测子程序 PUSH ACC ;正常读写操作之前必须检测LCD控制器状态 MOV DPTR,#LCDCRADDR MOV R0,#20 WTD_PA: MOVX A,@DPTR JNB ACC.7,WTD_LAX ;D7=0 表示LCD控制器空闲,则退出检测 DJNZ R0,WTD_PA ;D7=1 表示LCD控制器忙,则继续检测 ;若忙时间超过100uS,则表示LCD控制器硬件 ;出错,退出检测 NOP ;用户可在此设置错误代码,或仿真时设置断点 WTD_LAX: POP ACC RET