//SMG240128A标准图形点阵型液晶显示模块的基本演示程序[C51编程语言][MCS51模拟口线方式] //应用产品: SMG240128A标准图形点阵型液晶显示模块 // 本演示程序适用于SMG240128A液晶显示模块与MCS51系列单片机采用MCS51模拟口线的 //硬件连线方式。 // 本演示程序包括T6963C兼容芯片的MCS51模拟口线方式子程序集,T6963C兼容芯片的240128 //液晶显示模块的基本子程序,以及SMG240128系列标准图形点阵型液晶显示的基本演示子程序. // 本演示的内容为,在240列X128行的点阵液晶显示屏上清屏,写数据,读写数据,全屏显示. //------------------------------------------------------------------------------- //创建日期: 2009.08.17 //软件环境: 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 //------------------------------------------------------------------------------- #include #include //以下为演示程序的函数定义 void exsample(void); //演示程序 void exdelay(void); //演示延时子程序 void lcdfill(unsigned char d); //整屏显示d代表的字节数据子程序 void lcdpos(void); //设置坐标点(XPOS,YPOS)内部RAM地址的子程序 void lcdreset(void); //液晶显示控制器初始化子程序 void lcdwd(unsigned char d); //送图形数据子程序 unsigned char lcdrd(void); //读图形数据子程序 void lcdwc(unsigned char c); //送指令子程序 void lcdwc2(unsigned char c,unsigned char d);//送2字节指令子程序 void lcdwc3(unsigned char c,unsigned char d1,unsigned char d2);//送3字节指令子程序 unsigned char lcdrdata(void); //读数据子程序 void lcdwdata(unsigned char d); //送数据子程序 void lcdwaitidle(void); //忙检测子程序 //------------------------------------------------------------------------------- //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 //------------------------------------------------------------------------------- //以下为外部地址在演示程序中的预定义 //用户在编写应用程序时,需按自己的实际硬件连线来重新定义 unsigned char xdata LCDCREG _at_ 0x0100;//指令地址CE(P2.1)=0,C/D(P2.0)=1 unsigned char xdata LCDDREG _at_ 0x0000;//数据地址CE(P2.1)=0,C/D(P2.0)=0 //------------------------------------------------------------------------------- //以下XPOS,YPOS变量用于指示当前操作点的位置的预定义 //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 unsigned char data XPOS; // 列方向LCD点阵位置指针 unsigned char data YPOS; // 行方向LCD点阵位置指针 void main(void) { while(1) { lcdreset(); //初始化液晶显示控制器 exsample(); //演示程序 } } void exsample(void) //演示程序 { unsigned char d; //0.演示前的准备,将LCD液晶显示全部清空 lcdfill(0); //清屏 //1.写入测试: 坐标点(8,8)(9,8)(10,8)(11,8)显示 // 坐标点(12,8)(13,8),(14,8),(15,8)不显示 XPOS=8; YPOS=8; lcdpos(); //定位LCDRAM地址 lcdwd(0xf0); //将字节数据写入当前LCDRAM地址 //影响为当前坐标行方向8点显示 exdelay(); //延时约600mS //2.读写测试: 读入坐标(8,8)开始的数据,将数据取反回写到坐标(8,8)开始的字节中. // 坐标点(8,8)(9,8)(10,8)(11,8)不显示 // 坐标点(12,8)(13,8),(14,8),(15,8)显示 lcdpos(); //定位LCDRAM地址 d=lcdrd(); //读当前LCDRAM地址中的数据到d d=~d; //数据取反 lcdpos(); //定位LCDRAM地址 lcdwd(d); //写数据到当前LCDRAM地址中 exdelay(); //延时约600mS //3.全屏测试: 所有坐标点全部显示. lcdfill(0xff); //全屏显示 exdelay(); //延时约600mS } void exdelay(void) //演示延时子程序 { unsigned char i,j,k; //延时约600mS for(i=0;i<60;i++) for(j=0;j<64;j++) for(k=0;k<51;k++); } //------------------------------------------------------------------------------- //以下lcdfill,lcdpos,lcdreset为T6963型硬件接口的240128液晶显示模块的基本子程序 //------------------------------------------------------------------------------- //子程序名称:void lcdfill(unsigned char d). //功能:整屏显示d表示的字节数据. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdfill(unsigned char d) //整屏显示d代表的字节数据子程序 { unsigned char i,j; lcdwc3(0x24,0,0); //设置内部RAM地址为0 for(i=0;i<128;i++) //128行 for(j=0;j<30;j++) //30个字节数据共240列 lcdwd(d); //送图形数据 } //------------------------------------------------------------------------------- //子程序名称:void lcdpos(void). //功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdpos(void) //设置坐标点(XPOS,YPOS)内部RAM地址的子程序 { unsigned int CurrentAddress; CurrentAddress=YPOS*30; //LCDRAM地址=30*YPOS+(XPOS/8) CurrentAddress+=XPOS/8; lcdwc3(0x24,CurrentAddress&0xff,CurrentAddress/256); } //------------------------------------------------------------------------------- //子程序名称:void lcdreset(void) //功能:液晶显示控制器初始化 //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdreset(void) //液晶显示控制器初始化子程序 { lcdwc(0x80); //OR MODE lcdwc(0x98); //图形模式开 lcdwc3(0x42,0,0); //设置图形显示区首地址为0 lcdwc3(0x43,30,0); //设置图形显示区宽度为30字节共240点 } //------------------------------------------------------------------------------- //以下lcdwd,lcdrd,lcdwc,lcdwc2,lcdwc3为T6963C型硬件接口[MCS51模拟口线接口方式]的 // 基本子程序;lcdwdata,lcdrdata,lcdwaitidle为内部子程序. //------------------------------------------------------------------------------- //子程序名称:void lcdwd(unsigned char d). //功能:向液晶显示控制器写图形数据. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwd(unsigned char d) //送图形数据子程序 { lcdwc2(0xc0,d); } //------------------------------------------------------------------------------- //子程序名称:unsigned char lcdrd(void). //功能:从液晶显示控制器中读图形数据. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char lcdrd(void) //读图形数据子程序 { lcdwc(0xc1); //送读图形数据指令 return lcdrdata(); //读数据 } //------------------------------------------------------------------------------- //子程序名称:lcdwc(unsigned char c). //功能:向液晶显示控制器送指令. //修改日期:2009.08.17 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwc(unsigned char c) //送指令子程序 { lcdwaitidle(); //检测液晶显示控制器是否空闲 LCDCREG=c; } //------------------------------------------------------------------------------- //子程序名称:lcdwc2(unsigned char c,unsigned char d). //功能:向液晶显示控制器送2字节指令. //修改日期:2009.08.17 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwc2(unsigned char c,unsigned char d) //送2字节指令子程序 { lcdwdata(d); //送指令参数 lcdwc(c); //送指令码 } //------------------------------------------------------------------------------- //子程序名称:lcdwc3(unsigned char c,unsigned char d1,unsigned char d2). //功能:向液晶显示控制器送3字节指令. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwc3(unsigned char c,unsigned char d1,unsigned char d2) //送3字节指令子程序 { lcdwdata(d1); //送指令参数1 lcdwdata(d2); //送指令参数2 lcdwc(c); //送指令码 } //------------------------------------------------------------------------------- //子程序名称:unsigned char lcdrdata(void). //功能:从液晶显示控制器中读数据. //修改日期:2009.08.07 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char lcdrdata(void) //读数据子程序 { lcdwaitidle(); //检测液晶显示控制器是否空闲 return LCDDREG; } //------------------------------------------------------------------------------- //子程序名称:void lcdwdata(unsigned char d). //功能:向液晶显示控制器送数据. //修改日期:2009.08.17 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwdata(unsigned char d) //送数据子程序 { lcdwaitidle(); //检测液晶显示控制器是否空闲 LCDDREG=d; } //------------------------------------------------------------------------------- //子程序名称:voidlcdwaitidle(void). //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲. //修改日期:2009.08.17 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwaitidle(void) //忙检测子程序 { unsigned char i; for(i=0;i<200;i++) // if( (LCDCREG&03) == 0x3 ) break;//D0D1=11 空闲退出 }