;SMC1601SA标准字符点阵型液晶显示模块的演示程序[ASM51编程语言][三线式串行接口] ;应用产品: SMC1601SA标准字符点阵型液晶显示模块 ; 本演示程序适用于SMC1601SA液晶显示模块与MCS51系列单片机采用三线式串行接口的 ;硬件连线方式。 ; 本演示程序包括三线式串行硬件接口子程序集,SMC1601系列标准字符点阵型液晶显示 ;模块的接口子程序集,HD44780兼容芯片的液晶显示控制器的通用子程序集,以及SMC1601 ;系列标准字符点阵型液晶显示的演示子程序. ; 本演示的内容为,在16列ASCII字符X1行的液晶显示屏上显示"SMC1601SA", ;" WWW.SUNMAN.CN ",所有数字0..9依次全屏显示一遍,显示清屏,所有英文字母依次显示. ;------------------------------------------------------------------------------- ;创建日期: 2009.08.11 ;软件环境: 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/SMC1601SA.html ;------------------------------------------------------------------------------- ;SMC1601SA产品引脚说明 ;PIN1: VSS [电源地] ;PIN2: VDD [电源正极] ;PIN3: Vo [液晶显示的操作电压] ;PIN4: DI [串行数据输入] ;PIN5: CLK [串行移位脉冲输入] ;PIN6: E [使能信号输入] ;PIN7: BLA [背光源正极] ;PIN8: BLK [背光源负极] ;请参见http://download.sunman.cn/lcm/product/1/SMC1601SA.pdf ;字符表参见http://download.sunman.cn/lcm/reference/HD44780_CHARACTER_TABLE.pdf ;------------------------------------------------------------------------------- ;以下为产品接口引脚在演示程序中的预定义 ;用户在编写应用程序时,需按自己的实际硬件连线来重新定义 DIPIN BIT P3.0 ;DI对应单片机引脚 CLKPIN BIT P3.1 ;CLK对应单片机引脚 EPIN BIT P3.2 ;E对应单片机引脚 ;------------------------------------------------------------------------------- ;以下CXPOS变量用于指示当前操作字符的位置的预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 CXPOS EQU 20H ;列方向地址指针(用于CHARLCDPOS子程序) ;------------------------------------------------------------------------------- ORG 0000H ; JMP START START: MOV SP,#60H MAIN: CALL EXSAMPLE ;调用演示程序 JMP MAIN STR1: DB "SMC1601SA",0 STR2: DB "WWW.SUNMAN.CN",0 EXSAMPLE: ;演示程序 ;0.演示前的准备,LCD液晶显示控制器初始化,所有显示全清零 CALL LCDRESET ;液晶显示控制器初始化 MOV A,#' ' CALL CHARFILL ;显示清屏 ;1.字符串演示: 在(4,0)字符位置显示"SMC1601SA" MOV CXPOS,#4 ;设置当前显示位置为第5列 MOV DPTR,#STR1 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;2.字符串演示: 在(2,1)字符位置显示"WWW.SUNMAN.CN" MOV CXPOS,#2 ;设置当前显示位置为第3列 MOV DPTR,#STR2 CALL PUTSTR ;显示字符串 CALL EXDELAY ;延时约300mS CALL EXDELAY ;延时约300mS ;3.字符填充演示: 整屏显示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 ;4.字符演示: 依次显示A..P 一遍 MOV R7,#'A' ;依次显示A..Z一遍 ESP_PB: ; MOV A,R7 ; CALL PUTCHAR ;当前位置显示为A的值 CALL CHARCURSORNEXT ;置字符位置为下一个有效位置 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#'P'+1,ESP_PB ; 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列字符位置 LFL_PA: CALL PUTCHAR ;定位写字符 CALL CHARCURSORNEXT ;置字符位置为下一个有效位置 MOV R0,CXPOS 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)字符位置写字符. ;输入:无. ;输出:无. ;影响:无. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- PUTCHAR: ;在(CXPOS,CYPOS)字符位置写字符子程序 CALL CHARLCDPOS ;设置(CXPOS,CYPOS)字符位置的DDRAM地址 CALL LCDWD ;写字符 RET ;------------------------------------------------------------------------------- ;以下CHARLCDPOS,CHARCURSORNEXT,LCDRESET为HD44780兼容芯片的液晶显示控制器的 ;16字符X1行的SMC1601系列标准字符点阵型液晶显示模块的接口程序. ;------------------------------------------------------------------------------- ;子程序名称:CHARLCDPOS(). ;功能:设置CXPOS字符位置的DDRAM地址. ;输入:无. ;输出:无. ;影响:无. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- CHARLCDPOS: ;设置CXPOS字符位置的DDRAM地址 PUSH ACC ANL CXPOS,#0FH ;X位置范围(0到15) MOV A,CXPOS ;CXPOS对应DDRAM地址 JB ACC.3,LPS_LAY ; X: 第0----7个字符 MOV A,CXPOS ; DDRAM: 0----07H JMP LPS_LAX LPS_LAY:MOV A,CXPOS ; X: 第8----15个字符 ANL A,#07H ADD A,#40H ; DDRAM: 40----47H LPS_LAX:ORL A,#80H ;设置DDRAM地址 CALL LCDWC POP ACC RET ;------------------------------------------------------------------------------- ;子程序名称:CHARCURSORNEXT(). ;功能:置字符位置为下一个有效位置. ;输入:无. ;输出:无. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- CHARCURSORNEXT: ;置字符位置为下一个有效位置子程序 INC CXPOS ;字符位置加1 ANL CXPOS,#0FH ;字符位置CXPOS的有效范围为(0到15) RET ;------------------------------------------------------------------------------- ;子程序名称:LCDRESET(). ;功能:液晶显示控制器初始化. ;输入:无. ;输出:无. ;影响:R0,ACC. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDRESET: ;SMC1601系列液晶显示控制器初始化子程序 MOV A,#38H ;1601的显示模式字为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为三线式串行硬件接口(C型)的基本子程序,TRANSBYTE,TRANSBIT为内部 ;子程序. ;------------------------------------------------------------------------------- ;子程序名称:LCDWC(A). ;功能:送控制字到液晶显示控制器. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWC: ;送控制字到液晶显示控制器子程序 CLR C ;先送0表示下一个送的是控制字 CALL TRANSBIT CALL TRANSBYTE ;再送控制字到LCD液晶显示控制器 SETB EPIN ;EPIN执行一个下降沿 NOP CLR EPIN RET ;------------------------------------------------------------------------------- ;子程序名称:LCDWD(A). ;功能:送数据到液晶显示控制器. ;输入:A. ;输出:无. ;影响:R0. ;修改日期:2009.08.11 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- LCDWD: ;送数据到液晶显示控制器子程序 SETB C ;先送1表示下一个送的是数据 CALL TRANSBIT CALL TRANSBYTE ;再送数据到LCD液晶显示控制器 SETB EPIN ;EPIN执行一个下降沿 NOP CLR EPIN RET ;------------------------------------------------------------------------------- ;子程序名称:TRANSBYTE(). ;功能:送1字节数据到液晶显示控制器. ;输入:ACC. ;输出:无. ;影响:R0. ;修改日期:2009.08.07 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- TRANSBYTE: ;送1字节数据到液晶显示控制器子程序 MOV R0,#8 TSB_PA: RRC A CALL TRANSBIT DJNZ R0,TSB_PA RRC A RET ;------------------------------------------------------------------------------- ;子程序名称:TRANSBIT(). ;功能:送1位数据到液晶显示控制器. ;输入:C. ;输出:无. ;影响:无. ;修改日期:2009.08.13 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- TRANSBIT: ;送1位数据到液晶显示控制器子程序 MOV DIPIN,C ;先送数据到数据口线DI NOP SETB CLKPIN ;再使时钟口线发一个负脉冲 NOP CLR CLKPIN NOP SETB CLKPIN RET