;SMS0525B数码笔段型液晶显示模块的演示程序[ASM51] ;应用产品: SMS0525B SMS0525D 数码笔段型液晶显示模块 ; 本演示程序是在SMS0525B软件接口子程序集基础上开发出来的.通过简单设置SMS0525B中 ;显示对象NUM1..NUM5数字及Z1..Z5标志,调用TRANRAM程序,就可以将要显示的数字及相应的 ;标志在SMS0525B数码笔段型液晶显示模块上显示出来.通过使用本程序,加深理解SMS0525B ;软件接口子程序的使用方法,以及使用的的简洁性,用户上层程序的可移植性. ; 本演示的内容为,在SMS0525B液晶显示屏中所有数字显示0..9 空格一遍,所有数字依次显 ;示8,所有标志依次显示,LCD所有数字重复显示0..9 空格一遍,所有数字依次显示8,所有标 ;志依次隐藏. ;------------------------------------------------------------------------------- ;创建日期: 2009.08.08 ;软件环境: 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/SMS0525B.html ;------------------------------------------------------------------------------- ;SMS0525B产品引脚说明 ;PIN1: VDD [电源正极] ;PIN2: DI [串行数据输入] ;PIN3: VSS [电源地] ;PIN4: CLK [串行移位脉冲输入] ;------------------------------------------------------------------------------- ;以下为产品接口引脚在演示程序中的预定义 ;用户在编写应用程序时,需按自己的实际硬件连线来重新定义 DIPIN BIT P1.1 ;DI对应单片机引脚 CLKPIN BIT P1.3 ;CLK对应单片机引脚 ;------------------------------------------------------------------------------- ;以下NUM1_RAM至NUM5_RAM为数字1至5在演示程序中的RAM地址预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 NUMBERS EQU 5 ;显示数字的个数 NUM1_RAM EQU 20H ;数字1 NUM2_RAM EQU 21H ;数字2 NUM3_RAM EQU 22H ;数字3 NUM4_RAM EQU 23H ;数字4 NUM5_RAM EQU 24H ;数字5 ;------------------------------------------------------------------------------- ;以下Z1_RAM至Z5_RAM,Z1_BMASK至Z5_BMASK为Z标志1至5在演示程序中的RAM及BIT的预定义 ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 ZNUMBERS EQU 5 ;显示标志的个数 Z1_RAM EQU 25H ;Z1[拔卡] Z1_BMASK EQU 00000001B ;[Z1_RAM].0 Z2_RAM EQU 25H ;Z2[请购水] Z2_BMASK EQU 00000010B ;[Z2_RAM].1 Z3_RAM EQU 25H ;Z3[换电池] Z3_BMASK EQU 00000100B ;[Z3_RAM].2 Z4_RAM EQU 25H ;Z4[错误操作] Z4_BMASK EQU 00001000B ;[Z4_RAM].3 Z5_RAM EQU 25H ;Z5[H4] Z5_BMASK EQU 00010000B ;[Z5_RAM].4 ;------------------------------------------------------------------------------- ORG 0000H ; JMP START START: MOV SP,#60H MAIN: CALL EXSAMPLE ;调用演示程序 JMP MAIN EXSAMPLE: ;演示程序 ;0.演示前的准备,将LCD液晶显示所有标志及数字全清零 MOV A,#0 CALL ZFILL ;所有Z标志清零 CALL NUMFILL ;所有数字清零 ;1.数字演示: 所有数字显示0..9 空格一遍 MOV R7,#0 ;初始数字为0 ESP_PA: ; MOV A,R7 ; CALL NUMFILL ;数字缓冲区全部填充为A的值 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#11,ESP_PA ; ;2.数字演示: 所有数字依次显示8 MOV NUM1_RAM,#08H ;数字1显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM2_RAM,#08H ;数字2显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM3_RAM,#08H ;数字3显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM4_RAM,#08H ;数字4显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM5_RAM,#08H ;数字5显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ;3.标志演示: 所有标志依次显示 ORL Z1_RAM,#Z1_BMASK ;Z1:拔卡 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ORL Z2_RAM,#Z2_BMASK ;Z2:请购水 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ORL Z3_RAM,#Z3_BMASK ;Z3:换电池 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ORL Z4_RAM,#Z4_BMASK ;Z4:错误操作 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ORL Z5_RAM,#Z5_BMASK ;Z5:H4 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ;4.数字演示: 所有数字重复显示0..9 空格一遍 MOV R7,#0 ;初始数字为0 ESP_PB: ; MOV A,R7 ; CALL NUMFILL ;数字缓冲区全部填充为A的值 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS INC R7 CJNE R7,#11,ESP_PB ; ;5.数字演示: 所有数字依次显示8 MOV NUM1_RAM,#08H ;数字1显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM2_RAM,#08H ;数字2显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM3_RAM,#08H ;数字3显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM4_RAM,#08H ;数字4显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS MOV NUM5_RAM,#08H ;数字5显示8 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ;6.标志演示: 所有标志依次隐藏 ANL Z1_RAM,#0FFH-Z1_BMASK ;Z1:拔卡 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ANL Z2_RAM,#0FFH-Z2_BMASK ;Z2:请购水 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ANL Z3_RAM,#0FFH-Z3_BMASK ;Z3:换电池 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ANL Z4_RAM,#0FFH-Z4_BMASK ;Z4:错误操作 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS ANL Z5_RAM,#0FFH-Z5_BMASK ;Z5:H4 CALL TRANSRAM ;LCD显示刷新 CALL EXDELAY ;延时300mS 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 ;------------------------------------------------------------------------------- ;以下为SMS0525B软件接口子程序集[ASM51] ;应用产品: SMS0525B SMS0525D ;本软件接口子程序集将显示定义成NUM1..NUM5数字对象及Z1..Z5标志对象,用户只需要在应 ;用时将NUM1..NUM5数字赋值及Z1..Z5标志置1,调用TRANRAM程序,就可以将要显示的数字及 ;相应的标志在SMS0525B数码笔段型液晶显示模块上显示出来. ;用户在编写应用程序时,需按自己的实际软件程序需要来重新定义NUM1..NUM5,Z1..Z5 ;例: ; 第1个数字的RAM地址为40H,则 NUM1_RAM EQU 40H ; 第1个数字显示用户自定义变量MODE的值 则 NUM1_RAM EQU MODE ; 第1个标志的RAM地址为50H的第D2位 则 Z1_RAM EQU 50H ; Z1_BMASK EQU 00000100B ; 第1个标志显示用户自定义标志LABELBUF的第D6为 则 Z1_RAM EQU LABELBUF ; Z1_BMASK EQU 01000000B ;------------------------------------------------------------------------------- ;以下NUMFILL,ZFILL,DECODETOLCD为二线式串行硬件接口的SMS0525B液晶显示模块的基本子 ;程序,NUMCODETAB为SMS0525B液晶显示模块的数字七段译码表 ;用户可根据实际使用的标志及数字情况进行程序的删减或合并,地址映射表请参见 ;http://www.sunman.cn/document/product/chinese/usermanual/SMS0525B.pdf ;------------------------------------------------------------------------------- ;子程序名称:NUMFILL(A). ;功能:将数字缓冲区填充为A代表的数字. ;输入:A. ;输出:无. ;影响:无. ;修改日期:2009.08.08 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- NUMFILL: ;所有数字填充子程序 MOV NUM1_RAM,A ;1 MOV NUM2_RAM,A ;2 MOV NUM3_RAM,A ;3 MOV NUM4_RAM,A ;4 MOV NUM5_RAM,A ;5 RET ;------------------------------------------------------------------------------- ;子程序名称:ZFILL(A). ;功能:将标志缓冲区中所有标志填充为A代表的内容(A为0时,标志不显示). ;输入:A. ;输出:无. ;影响:无. ;修改日期:2009.08.08 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- ZFILL: ;所有Z标志填充子程序 JNZ ZFL_LAY ;检测A的内容 ;A为零,则所有标志清零 ANL Z1_RAM,#0FFH-Z1_BMASK ;1 ANL Z2_RAM,#0FFH-Z2_BMASK ;2 ANL Z3_RAM,#0FFH-Z3_BMASK ;3 ANL Z4_RAM,#0FFH-Z4_BMASK ;4 ANL Z5_RAM,#0FFH-Z5_BMASK ;5 JMP ZFL_LAX ZFL_LAY: ;A不为零,则所有标志置位 ORL Z1_RAM,#Z1_BMASK ;1 ORL Z2_RAM,#Z2_BMASK ;2 ORL Z3_RAM,#Z3_BMASK ;3 ORL Z4_RAM,#Z4_BMASK ;4 ORL Z5_RAM,#Z5_BMASK ;5 ZFL_LAX: RET ;------------------------------------------------------------------------------- ;数据表名称:NUMCODETAB. ;功能:将数字转换为七段码. ;修改日期:2009.08.08 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- ;数码笔段定义: 8字的最上面一笔段为A笔段,顺时针方向依次为BCDEF笔段,中间的是G笔段 NUMCODETAB: ;CXDEBAFG ;数字七段译码表 DB 01000001B ;0:数字0 DB 01110111B ;1:数字1 DB 11000010B ;2:数字2 DB 01010010B ;3:数字3 DB 01110100B ;4:数字4 DB 01011000B ;5:数字5 DB 01001000B ;6:数字6 DB 01110011B ;7:数字7 DB 01000000B ;8:数字8 DB 01010000B ;9:数字9 DB 11111111B ;10:字符空格 DB 11111110B ;11:字符- DB 11001001B ;12:字符C DB 11100000B ;13:字符P DB 11001000B ;14:字符E DB 11101000B ;15:字符F ;------------------------------------------------------------------------------- ;子程序名称:DECODETOLCD(). ;功能:按地址映射表字节顺序,所有数据译码后送LCD液晶显示控制器. ;输入:无. ;输出:无. ;影响:R0,R1,R2,R3,ACC,B,DPTR. ;修改日期:2009.08.08 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- ;地址映射表请参见 ;http://www.sunman.cn/document/product/chinese/usermanual/SMS0525B.pdf DECODETOLCD: ;按地址映射表字节顺序,所有数据译码后送 ;LCD液晶显示控制器子程序 ;临时LCD缓冲区字节为R3 ;LCDBUF+0 缓冲区第1个字节译码 MOV R3,#00000000B ;当前临时LCD缓冲区字节数据初始值 ;需译码的BIT为CZDEBAFG位 ;第1个8字的CDEBAFG笔段送缓冲区 MOV B,#10111111B ;置当前8字的屏蔽码为CXDEBAFG MOV R1,#NUM1_RAM ;置R1为第1个8字的字节地址 MOV DPTR,#NUMCODETAB ;表格段码为CXDEBAFG CALL MASKGETNUMCODE ;查表得到8字段码屏蔽后的值,并送到R3 ;第1个标志[拔卡]送缓冲区 MOV B,#01000000B ;置当前标志的屏蔽码为01000000B MOV R1,#Z1_RAM ;第1个标志在标志缓冲区的字节位置 MOV R2,#Z1_BMASK ;置当前标志在当前标志缓冲区字节的位屏蔽码 CALL MASKGETZ ;得到第1个标志的值,并送到R3 MOV A,R3 ;将当前临时LCD缓冲区字节数据 CALL TRANSBYTE ;送LCD液晶显示控制器中 ;LCDBUF+1 缓冲区第2个字节译码 MOV R3,#00000000B ;当前临时LCD缓冲区字节数据初始值 ;需译码的BIT为CZDEBAFG位 ;第2个8字的CDEBAFG笔段送缓冲区 MOV B,#10111111B ;置当前8字的屏蔽码为CXDEBAFG MOV R1,#NUM2_RAM ;置R1为第2个8字的字节地址 MOV DPTR,#NUMCODETAB ;表格段码为CXDEBAFG CALL MASKGETNUMCODE ;查表得到8字段码屏蔽后的值,并送到R3 ;第2个标志[请购水]送缓冲区 MOV B,#01000000B ;置当前标志的屏蔽码为01000000B MOV R1,#Z2_RAM ;第2个标志在标志缓冲区的字节位置 MOV R2,#Z2_BMASK ;置当前标志在当前标志缓冲区字节的位屏蔽码 CALL MASKGETZ ;得到第2个标志的值,并送到R3 MOV A,R3 ;将当前临时LCD缓冲区字节数据 CALL TRANSBYTE ;送LCD液晶显示控制器中 ;LCDBUF+2 缓冲区第3个字节译码 MOV R3,#00000000B ;当前临时LCD缓冲区字节数据初始值 ;需译码的BIT为CZDEBAFG位 ;第3个8字的CDEBAFG笔段送缓冲区 MOV B,#10111111B ;置当前8字的屏蔽码为CXDEBAFG MOV R1,#NUM3_RAM ;置R1为第3个8字的字节地址 MOV DPTR,#NUMCODETAB ;表格段码为CXDEBAFG CALL MASKGETNUMCODE ;查表得到8字段码屏蔽后的值,并送到R3 ;第3个标志[换电池]送缓冲区 MOV B,#01000000B ;置当前标志的屏蔽码为01000000B MOV R1,#Z3_RAM ;第3个标志在标志缓冲区的字节位置 MOV R2,#Z3_BMASK ;置当前标志在当前标志缓冲区字节的位屏蔽码 CALL MASKGETZ ;得到第3个标志的值,并送到R3 MOV A,R3 ;将当前临时LCD缓冲区字节数据 CALL TRANSBYTE ;送LCD液晶显示控制器中 ;LCDBUF+3 缓冲区第4个字节译码 MOV R3,#00000000B ;当前临时LCD缓冲区字节数据初始值 ;需译码的BIT为CZDEBAFG位 ;第4个8字的CDEBAFG笔段送缓冲区 MOV B,#10111111B ;置当前8字的屏蔽码为CXDEBAFG MOV R1,#NUM4_RAM ;置R1为第4个8字的字节地址 MOV DPTR,#NUMCODETAB ;表格段码为CXDEBAFG CALL MASKGETNUMCODE ;查表得到8字段码屏蔽后的值,并送到R3 ;第5个标志[H4]送缓冲区 MOV B,#01000000B ;置当前标志的屏蔽码为01000000B MOV R1,#Z5_RAM ;第5个标志在标志缓冲区的字节位置 MOV R2,#Z5_BMASK ;置当前标志在当前标志缓冲区字节的位屏蔽码 CALL MASKGETZ ;得到第5个标志的值,并送到R3 MOV A,R3 ;将当前临时LCD缓冲区字节数据 CALL TRANSBYTE ;送LCD液晶显示控制器中 ;LCDBUF+4 缓冲区第5个字节译码 MOV R3,#00000000B ;当前临时LCD缓冲区字节数据初始值 ;需译码的BIT为CZDEBAFG位 ;第5个8字的CDEBAFG笔段送缓冲区 MOV B,#10111111B ;置当前8字的屏蔽码为CXDEBAFG MOV R1,#NUM5_RAM ;置R1为第5个8字的字节地址 MOV DPTR,#NUMCODETAB ;表格段码为CXDEBAFG CALL MASKGETNUMCODE ;查表得到8字段码屏蔽后的值,并送到R3 ;第4个标志[错误操作]送缓冲区 MOV B,#01000000B ;置当前标志的屏蔽码为01000000B MOV R1,#Z4_RAM ;第4个标志在标志缓冲区的字节位置 MOV R2,#Z4_BMASK ;置当前标志在当前标志缓冲区字节的位屏蔽码 CALL MASKGETZ ;得到第4个标志的值,并送到R3 MOV A,R3 ;将当前临时LCD缓冲区字节数据 CALL TRANSBYTE ;送LCD液晶显示控制器中 RET ;------------------------------------------------------------------------------- ;以下MASKGETNUMCODE,MASKGETNUMSEG,MASKGETZ三个子程序,专供程序DECODETOLCD调用 ;------------------------------------------------------------------------------- MASKGETNUMCODE: ;数字查表并按LCDBUF屏蔽码相与得到结果的 ;子程序 MOV A,@R1 ;NUM_RAM内容译码 MOVC A,@A+DPTR ANL A,B ;和数字屏蔽码B相与 ORL A,R3 ;送到LCD临时缓冲字节中 MOV R3,A RET MASKGETNUMSEG: ;数字查表并按数字字段屏蔽码相与后,再得到 ;是否为LCDBIT屏蔽码的子程序 MOV A,@R1 ;NUM内容译码 MOVC A,@A+DPTR ANL A,R2 ;和数字字段屏蔽码相与 JZ MGS_LAX MOV A,B ;SEG为1则置A为LCDBIT屏蔽码的值 ORL A,R3 ;送到LCD临时缓冲字节中 MOV R3,A MGS_LAX: RET MASKGETZ: ;标志字节按数字字段屏蔽码相与后,再得到 ;是否为LCDBIT屏蔽码的子程序 MOV A,@R1 ;读当前标志的Z_RAM字节内容 ANL A,R2 ;R2为当前标志Z_BMASK的位屏蔽码 JZ MGZ_LAX MOV A,B ;标志为1则置A为LCDBIT屏蔽码的值 MGZ_LAX: ORL A,R3 ;送到LCD临时缓冲字节中 XRL A,B ;SMS0525B液晶显示控制器中0表示显示, ;所以需将位数据取反来做到Z=1时表示显示 MOV R3,A RET ;------------------------------------------------------------------------------- ;以下TRANSRAM,TRANSRAM为二线式串行硬件接口的基本子程序,TRANSBIT为内部子程序. ;------------------------------------------------------------------------------- ;子程序名称:TRANSRAM(). ;功能:LCD显示刷新. ;输入:无. ;输出:无. ;影响:R0,ACC. ;修改日期:2009.08.07 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- TRANSRAM: ;LCD显示刷新子程序 CALL DECODETOLCD ;按地址映射表字节顺序,所有数据译码后送 RET ;LCD液晶显示控制器 ;------------------------------------------------------------------------------- ;子程序名称: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.07 ;修改人:chujianjun@sunman.cn,tanchao@sunman.cn ;------------------------------------------------------------------------------- TRANSBIT: ;送1位数据到液晶显示控制器子程序 MOV DIPIN,C ;先送数据到数据口线DI NOP NOP SETB CLKPIN ;再使时钟口线发一个负脉冲 NOP NOP CLR CLKPIN NOP NOP SETB CLKPIN RET