;========================================================================== ;本程序用于测试72段LCD驱动器SD0418 ;系统配置:系统时钟=6MHz ;MCU:8051 晶振频率:6MHz ;管脚连接:P3.4(MCU)->DATA(SD0418),P3.3->WR(SD0418),P3.2(MCU)->CS(SD0418) ;功能:1.全显--->每一段依此显示--->全显循环 ; 2.按KEY键则进入省电模式,功耗5uA左右 ; Last updated:2006/10/19 ; 本程序仅供参考,如有问题请联系:陈工0755-83246178 fax:83225561 ; 13922865036 chendw@whwave.com.cn http://www.whwave.com.cn ;========================================================================== ;define general register COM_REG EQU 20H ;指令寄存器 ADD_REG EQU 21H ;数据地址寄存器 DATA_REG EQU 22H ;数据寄存器 COM_DATA EQU 23H ;指令数据寄存器 ;define port bit SDATA EQU P3.4 SWR EQU P3.3 CS EQU P3.2 KEY EQU P3.1 ;define the constant value WR_MODE EQU 05H ;写数据模式 COM_MODE EQU 04H ;发送指令模式 ;================================================================== ORG 0000H LJMP START ORG 0100H START: ;程序初始化 MOV SP,#60H ;堆栈栈顶设置 MOV COM_REG,#COM_MODE ;启动SD0418 MOV COM_DATA,#01H LCALL SD0418 MOV COM_REG,#COM_MODE ;LCD ON MOV COM_DATA,#03H LCALL SD0418 MOV COM_REG,#COM_MODE ;LCD 1/3偏置方式,4公共端 MOV COM_DATA,#29H LCALL SD0418 ;------------------------------------------------------------------ ;;测试SD0418显示 DISPLAY:MOV R1,#00H ;所有字段不显示 LCALL ALLDP ;调用所有段显示子程序 MOV R1,#0FH ;所有字段显示 LCALL ALLDP ;调用所有段显示子程序 MOV R1,#00H ;所有字段不显示 LCALL ALLDP ;调用所有段显示子程序 DISPLAY1:MOV R0,#00H ;依次显示SEG0-SEG5段 MOV R3,#06H LCALL SEGDP ;调用段显示子程序 DISPLAY2:MOV R0,#0DH ;依次显示SEG13-SEG19段 MOV R3,#07H LCALL SEGDP ;调用段显示子程序 DISPLAY3: MOV R0,#1AH ;依次显示SEG26-SEG30段 MOV R3,#05H LCALL SEGDP ;调用段显示子程序 JMP DISPLAY ;循环显示 ;================================================================ ;所有段显示子程序 ;功能:所有字段均显示储存在R1中的内容 ;入口:显示内容储存在R1 出口:NONE ;================================================================ ALLDP: MOV R0,#20H ;显示数据首地址+1 ALLDP1: MOV COM_REG,#WR_MODE ;写数据模式 MOV A,R0 DEC A MOV ADD_REG,A ;数据地址 MOV A,R1 MOV DATA_REG,A ;数据 LCALL SD0418 DJNZ R0,ALLDP1 ;R0不为0则继续 LCALL DELAY ;延时 RET ;================================================================ ;段显示子程序 ;功能:显示各独立字段 ;入口:连续段首地址储存在R0中,连续个数在R3中 ;出口:NONE ;================================================================ SEGDP: MOV R1,#01H ;显示数据内容 SEGDP1: MOV COM_REG,#WR_MODE ;写数据模式 MOV A,R0 MOV ADD_REG,A ;数据地址 MOV A,R1 MOV DATA_REG,A ;数据 LCALL SD0418 LCALL DELAY CLR C MOV A,R1 RLC A MOV R1,A ;依次显示字段中的每个笔划 JNB ACC.5,SEGDP1 ;未显示完字段中的每个笔划则继续 INC R0 ;显示完字段中的每个笔划则继续到下一字段 DJNZ R3,SEGDP ;未显示完连续段则继续 RET ;显示完连续段则返回 ;================================================================ ;SD0418通信子程序 ;功能:实现MCU与SD0418之间的通信和传输指令与数据 ;入口:指令模式存放在COM_REG中,指令数据存放在COM_DATA中,数据地址存放 ; 在ADD_REG中,数据存放在DATA_REG中 ;出口:NONE ;================================================================ SD0418: CLR CS ;启动SD0418 MOV R2,#03H ;发送显示模式(3位) MOV A,COM_REG SENDMODE:NOP MOV C,ACC.2 MOV SDATA,C LCALL CLK RLC A DJNZ R2,SENDMODE JNB ACC.3,SENDCOM MOV R2,#06H ;发送数据地址(6位) MOV A,ADD_REG SENDADD:NOP MOV C,ACC.5 MOV SDATA,C LCALL CLK RLC A DJNZ R2,SENDADD MOV R2,#04H ;发送数据(4位) MOV A,DATA_REG SENDDATA:NOP MOV C,ACC.0 MOV SDATA,C LCALL CLK RRC A DJNZ R2,SENDDATA JMP SENDEND SENDCOM: MOV R2,#08H MOV A,COM_DATA SENDCOM1:NOP MOV C,ACC.7 MOV SDATA,C LCALL CLK RLC A DJNZ R2,SENDCOM1 CLR SDATA ;发送第九位 LCALL CLK SENDEND:SETB CS ;关闭SD0418 SETB SDATA SETB SWR ;置端口至高电平以省电!!!!! RET ;===================================================================== ;时钟子程序 ;功能:发送时钟信号,使数据传送到SD0418 ;入口:NONE 出口:NONE ;===================================================================== CLK: NOP ;发送时钟 CLR SWR NOP SETB SWR NOP RET ;===================================================================== ;延时子程序 ;功能:延时,有按键则进入sleep mode ;入口:NONE 出口:NONE ;===================================================================== DELAY: MOV R4,#02H ;延时子程序 DELAY1: MOV R5,#0C0H DELAY2: MOV R6,#0FFH DELAY3: NOP DJNZ R6,DELAY3 SETB KEY NOP JNB KEY,ENTER_SLEEP ;检测按键 DJNZ R5,DELAY2 NOP DJNZ R4,DELAY1 RET ENTER_SLEEP: MOV COM_REG,#COM_MODE ;关闭SD0418 MOV COM_DATA,#0H LCALL SD0418 SETB CS SETB SDATA SETB SWR ;置端口至高电平以省电!!!!! JMP $ ; END