//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.13 //软件环境: 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 //------------------------------------------------------------------------------- #include #include //以下为演示程序的函数定义 void exsample(void); //演示程序 void exdelay(void); //演示延时子程序 void charfill(unsigned char c); //整屏显示A代表的ASCII字符子程序 void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s); //在(cx,cy)字符位置写字符串子程序 void putstr(unsigned char code *s); //定位写字符串子程序 void putchar(unsigned char c); //在(CXPOS,CYPOS)字符位置写字符子程序 unsigned char getchar(void); //在(CXPOS,CYPOS)字符位置读字符子程序 void charlcdpos(void); //设置(CXPOS,CYPOS)字符位置的DDRAM地址 void charcursornext(void); //置字符位置为下一个有效位置子程序 void lcdreset(void); //SMC2004系列液晶显示控制器初始化子程序 void delay3ms(void); //延时3MS子程序 void lcdwc(unsigned char c); //送控制字到液晶显示控制器子程序 void lcdwd(unsigned char d); //送控制字到液晶显示控制器子程序 unsigned char lcdrd(void); //读数据子程序 void lcdwaitidle(void); //忙检测子程序 //------------------------------------------------------------------------------- //SMC2004A产品引脚说明及演示连线 //PIN1: VSS [电源地]-------------------VSS //PIN2: VDD [电源正极]-----------------VDD //PIN3: Vo [LCD 偏压输入]-------------接10K的可调电阻到VSS,0为显示最深 //PIN4: RS [数据/命令选择端输入]------P3.0 //PIN5: RW [读写控制信号输入]---------P3.1 //PIN6: E [使能信号输入]-------------P3.2 //PIN7: D0 [Data I/O]-----------------P1.0 //PIN8: D1 [Data I/O]-----------------P1.1 //PIN9: D2 [Data I/O]-----------------P1.2 //PIN10:D3 [Data I/O]-----------------P1.3 //PIN11:D4 [Data I/O]-----------------P1.4 //PIN12:D5 [Data I/O]-----------------P1.5 //PIN13:D6 [Data I/O]-----------------P1.6 //PIN14:D7 [Data I/O]-----------------P1.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 //------------------------------------------------------------------------------- //以下为产品接口引脚在演示程序中的预定义 //用户在编写应用程序时,需按自己的实际硬件连线来重新定义 sbit RSPIN = P3^0; //RS对应单片机引脚 sbit RWPIN = P3^1; //RW对应单片机引脚 sbit EPIN = P3^2; //E对应单片机引脚 //------------------------------------------------------------------------------- //以下CXPOS,CYPOS变量用于指示当前操作字符的位置的预定义 unsigned char data CXPOS; //列方向地址指针(用于CHARLCDPOS子程序) unsigned char data CYPOS; //行方向地址指针(用于CHARLCDPOS子程序) //------------------------------------------------------------------------------- void main(void) //主程序 { while(1) { exsample(); //调用演示程序 } } void exsample(void) //演示程序 { unsigned char i; //0.演示前的准备,LCD液晶显示控制器初始化,所有显示全清零 lcdreset(); //液晶显示控制器初始化 charfill(' '); //显示清屏 //1.字符串演示: 在(6,0)字符位置显示"SMC2004A" putstrxy(6,0,"SMC2004A"); //在(6,0)位置开始显示字符串 exdelay(); //延时约300mS exdelay(); //延时约300mS //2.字符串演示: 在(4,1)字符位置显示"WWW.SUNMAN.CN" putstrxy(4,1,"WWW.SUNMAN.CN"); //在(4,1)位置开始显示字符串 exdelay(); //延时约300mS exdelay(); //延时约300mS //3.字符串演示: 在(2,2)字符位置显示"TEL:073184167806" putstrxy(2,2,"TEL:073184167806"); //在(2,2)位置开始显示字符串 exdelay(); //延时约300mS exdelay(); //延时约300mS //4.字符串演示: 在(2,3)字符位置显示"FAX:073184167807" putstrxy(2,3,"FAX:073184167807"); //在(2,3)位置开始显示字符串 exdelay(); //延时约300mS exdelay(); //延时约300mS //5.字符填充演示: 整屏显示0..9 空格一遍 for(i='0';i<'9'+1;i++) { charfill(i); //整屏显示为i的值 exdelay(); //延时约300mS } charfill(' '); //显示清屏 exdelay(); //延时约300mS //6.字符演示: 依次显示A..Z 一遍 for(i='A';i<'Z'+1;i++) //依次显示A..Z一遍 { putchar(i); //当前位置显示为i的值 charcursornext(); //置字符位置为下一个有效位置 exdelay(); //延时约300mS } //7.字符演示: 依次读字符并加1后送回LCD显示. for(CXPOS=0,CYPOS=0,i=0;i<32;i++) //初始位置(0,0) { putchar(getchar()+1); //当前位置读字符并加1后送回LCD显示 charcursornext(); //置字符位置为下一个有效位置 exdelay(); //延时约300mS } } void exdelay(void) //演示延时子程序 { unsigned char i,j,k; //延时约300mS for(i=0;i<30;i++) for(j=0;j<64;j++) for(k=0;k<51;k++); } //------------------------------------------------------------------------------- //以下charfill,putstr,putchar,getchar为HD44780兼容芯片的液晶显示控制器的通用子程序 //------------------------------------------------------------------------------- //子程序名称:void charfill(unsigned char c). //功能:整屏显示A代表的ASCII字符. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void charfill(unsigned char c) //整屏显示A代表的ASCII字符子程序 { for(CXPOS=CYPOS=0;1;) { putchar(c); //定位写字符 charcursornext(); //置字符位置为下一个有效位置 if((CXPOS==0) && (CYPOS==0)) break; } } //------------------------------------------------------------------------------- //子程序名称:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s). //功能:在(cx,cy)字符位置写字符串. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s) { //在(cx,cy)字符位置写字符串子程序 CXPOS=cx; //置当前X位置为cx CYPOS=cy; //置当前Y位置为cy for(;*s!=0;s++) //为零表示字符串结束,退出 { putchar(*s); //写1个字符 charcursornext(); //字符位置移到下一个 } } //------------------------------------------------------------------------------- //子程序名称:void putstr(unsigned char *s). //功能:在(CXPOS,CYPOS)字符位置写字符串. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putstr(unsigned char code *s) //定位写字符串子程序 { for(;*s!=0;s++) //为零表示字符串结束,退出 { putchar(*s); //写1个字符 charcursornext(); //字符位置移到下一个 } } //------------------------------------------------------------------------------- //子程序名称:void putchar(unsigned char c). //功能:在(CXPOS,CYPOS)字符位置写字符. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putchar(unsigned char c) //在(CXPOS,CYPOS)字符位置写字符子程序 { charlcdpos(); //设置(CXPOS,CYPOS)字符位置的DDRAM地址 lcdwd(c); //写字符 } //------------------------------------------------------------------------------- //子程序名称:unsigned char getchar(void). //功能:在(CXPOS,CYPOS)字符位置读字符. //修改日期:2009.08.12 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char getchar(void) //在(CXPOS,CYPOS)字符位置读字符子程序 { charlcdpos(); //设置(CXPOS,CYPOS)字符位置的DDRAM地址 return lcdrd(); //读字符 } //------------------------------------------------------------------------------- //以下charlcdpos,charcursornext,lcdreset为HD44780兼容芯片的液晶显示控制器的 //20字符X4行的SMC2004系列标准字符点阵型液晶显示模块的接口程序. //------------------------------------------------------------------------------- //子程序名称:void charlcdpos(void). //功能:设置(CXPOS,CYPOS)字符位置的DDRAM地址. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void charlcdpos(void) //设置(CXPOS,CYPOS)字符位置的DDRAM地址 { if(CXPOS>=20) CXPOS=0; //X位置范围(0到15) CYPOS&=0X03; //Y位置范围(0到3) if(CYPOS==0) //(第一行)X: 第0----19个字符 lcdwc(CXPOS|0x80); // DDRAM: 0----13H else if(CYPOS==1) //(第二行)X: 第0----19个字符 lcdwc(CXPOS|0xC0); // DDRAM: 40----53H else if(CYPOS==2) //(第三行)X: 第0----19个字符 lcdwc((CXPOS+20)|0x80); // DDRAM: 14----27H else //(第四行)X: 第0----19个字符 lcdwc((CXPOS+20)|0xC0); // DDRAM: 54----67H } //------------------------------------------------------------------------------- //子程序名称:void charcursornext(void). //功能:置字符位置为下一个有效位置. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void charcursornext(void) //置字符位置为下一个有效位置子程序 { CXPOS++; //字符位置加1 if(CXPOS>19) //字符位置CXPOS>19表示要换行 { CXPOS=0; //置列位置为最左边 CYPOS++; //行位置加1 CYPOS&=0X3; //字符位置CYPOS的有效范围为(0到3) } } //------------------------------------------------------------------------------- //子程序名称:void lcdreset(void). //功能:液晶显示控制器初始化. //修改日期:2009.08.11 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdreset(void) //SMC2004系列液晶显示控制器初始化子程序 { //2004的显示模式字为0x38 lcdwc(0x38); //显示模式设置第一次 delay3ms(); //延时3MS lcdwc(0x38); //显示模式设置第二次 delay3ms(); //延时3MS lcdwc(0x38); //显示模式设置第三次 delay3ms(); //延时3MS lcdwc(0x38); //显示模式设置第四次 delay3ms(); //延时3MS lcdwc(0x08); //显示关闭 lcdwc(0x01); //清屏 delay3ms(); //延时3MS lcdwc(0x06); //显示光标移动设置 lcdwc(0x0C); //显示开及光标设置 } void delay3ms(void) //延时3MS子程序 { unsigned char i,j,k; for(i=0;i<3;i++) for(j=0;j<64;j++) for(k=0;k<51;k++); } //------------------------------------------------------------------------------- //以下lcdwc,lcdwd,lcdrd为HD44780兼容芯片的MCS51模拟口线方式的基本子程序, //lcdwaitidle为内部子程序. //------------------------------------------------------------------------------- //子程序名称:void lcdwc(unsigned char c). //功能:送控制字到液晶显示控制器. //修改日期:2009.08.08 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwc(unsigned char c) //送控制字到液晶显示控制器子程序 { lcdwaitidle(); //HD44780液晶显示控制器忙检测 RSPIN=0; //RS=0 RW=0 E=高电平 RWPIN=0; P1=c; EPIN=1; _nop_(); EPIN=0; } //------------------------------------------------------------------------------- //子程序名称:void lcdwd(unsigned char d). //功能:送数据到液晶显示控制器. //修改日期:2009.08.12 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwd(unsigned char d) //送控制字到液晶显示控制器子程序 { lcdwaitidle(); //HD44780液晶显示控制器忙检测 RSPIN=1; //RS=1 RW=0 E=高电平 RWPIN=0; P1=d; EPIN=1; _nop_(); EPIN=0; } //------------------------------------------------------------------------------- //子程序名称:unsigned char lcdrd(void). //功能:读数据到液晶显示控制器. //修改日期:2009.08.12 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char lcdrd(void) //读数据子程序 { unsigned char d; lcdwaitidle(); //HD44780液晶显示控制器忙检测 P1=0xff; RSPIN=1; //RS=1 RW=1 E=高电平 RWPIN=1; EPIN=1; _nop_(); d=P1; EPIN=0; return d; } //------------------------------------------------------------------------------- //子程序名称:void lcdwaitidle(void). //功能:忙检测. //修改日期:2009.08.12 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwaitidle(void) //忙检测子程序 { unsigned char i; P1=0xff; RSPIN=0; //RS=0 RW=1 E=高电平 RWPIN=1; EPIN=1; for(i=0;i<20;i++) if((P1&0x80) == 0) break; //D7=0 表示LCD控制器空闲,则退出检测 EPIN=0; }