//SMG12864SL标准图形点阵型液晶显示模块的演示程序[C51编程语言][四线式串行接口] //应用产品: SMG12864SL标准图形点阵型液晶显示模块 // 本演示程序适用于SMG12864SL液晶显示模块与MCS51系列单片机采用四线式串行接口的 //硬件连线方式。相对于SMG12864L的并行连接方式,这种串行连接方式的优点是连接简单, //可靠性强.但缺点是由于这种串行连接方式只有写操作,没有读操作,所以对于NT7532芯片在行 //方向的变量只能取8的倍数,图片及字符的行方向大小也只能取8的倍数,另外由于没有读操作 //所以不能实现绘图操作.如果在行方向上的图片及字符的大小是8的倍数,且不需要绘图操作, //建议采用本模块,否则应采用SMG12864L液晶显示模块. // 本演示程序包括NT7532兼容芯片的四线式串行接口子程序集,NT7532兼容芯片的12864SL //液晶显示模块的基本子程序,12864系列图形子程序集,12864系列精简中英文字库子程序集, //以及SMG12864SL系列标准图形点阵型液晶显示的扩展演示子程序. // 本演示的内容为,在128列X64行的点阵液晶显示屏上清屏,图片演示,英文字符串演示, //中文字符串演示,反白显示字符串,全屏显示. //------------------------------------------------------------------------------- //创建日期: 2009.10.10 //软件环境: 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/SMG12864SL.html //------------------------------------------------------------------------------- #include #include //以下为演示程序的函数定义 void exsample(void); //演示程序 void exdelay(void); //演示延时子程序 void putchar(unsigned int c); //定位写字符子程序 void putstr(unsigned char code *s); //显示字符串子程序,字符码为0时退出 unsigned char code *getchinesecodepos(unsigned int ac); unsigned char code *getenglishcodepos(unsigned char ac); void putimage(unsigned char code *s); //显示图形子程序 void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s); //显示指定大小的图形子程序 void lcdfill(unsigned char d); //整屏显示d代表的字节数据子程序 void lcdpos(void); //设置坐标点(XPOS,YPOS)内部RAM地址的子程序 void lcdreset(void); //液晶显示控制器初始化子程序 void setlcdvoltage(unsigned char vol); //LCD电压设置 void lcdwd(unsigned char d); //送图形数据子程序 void lcdwc(unsigned char c); //送指令子程序 void transbyte(unsigned char d); //送1字节数据到液晶显示控制器子程序 void transbit(bit d); //送1位数据到液晶显示控制器子程序 //------------------------------------------------------------------------------- //SMG12864SL产品引脚说明及演示连线 //PIN1: VSS [电源地]----------------------VSS //PIN2: VDD [电源正极]--------------------VDD //PIN3: CS [片选信号 低有效]-------------P1.0 //PIN4: A0 [数据命令选择 1:数据,0:命令]--P1.1 //PIN5: SCL [串行移位脉冲输入]------------P1.2 //PIN6: SI [串行数据输入]----------------P1.3 //PIN7: BLA [背光源正极]------------------VSS //PIN8: BLK [背光源负极]------------------VDD //注:8031的晶振频率为12MHz. //请参见http://download.sunman.cn/lcm/product/1/SMG12864SL.pdf //------------------------------------------------------------------------------- //以下为产品接口引脚在演示程序中的预定义 //用户在编写应用程序时,需按自己的实际硬件连线来重新定义 sbit CSPIN = P1^0; // CS对应单片机引脚 sbit A0PIN = P1^1; // A0对应单片机引脚 sbit SCLPIN = P1^2; // SCL对应单片机引脚 sbit SIPIN = P1^3; // SI对应单片机引脚 //------------------------------------------------------------------------------- //以下XPOS,YPOS变量用于指示当前操作点的位置的预定义 //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义 unsigned char XPOS; //列方向LCD点阵位置指针 unsigned char YPOS; //行方向LCD点阵位置指针 //对于SMG12864SL,YPOS只能取8的倍数 bit CharImageReverse; //字符及图形的反显控制,0(正常显示),1(反显) #define XDOTS 128 //图形空间X方向大小 #define YDOTS 64 //图形空间X方向大小 //------------------------------------------------------------------------------- //以下为精简版中英文字库 //实际使用时请包含由Sunman精简版中英文字符库代码生成器.exe自动生成的charlib.c文 //文件来替换该部分 #define ENGLISHCHARNUMBER 5 //精简版英文字符库中的英文字符的个数 #define CHINESECHARNUMBER 5 //精简版中文字符库中的中文字符的个数 #define ENGLISHCHARSIZE 8 //英文字符X方向显示点的个数 #define CHINESECHARSIZE 16 //中文字符X方向及中英文字符Y方向显示点的个数 #define ENGLISHCHARDOTSIZE 16 //单个英文字符点阵的字节数 #define CHINESECHARDOTSIZE 32 //单个中文字符点阵的字节数 unsigned int code EnglishCode[]={ 0x41, //字符001:[A] 0x4d, //字符002:[M] 0x4e, //字符003:[N] 0x53, //字符004:[S] 0x55 //字符005:[U] }; unsigned int code ChineseCode[]={ 0xb5e7, //字符001:[电] 0xc8cb, //字符002:[人] 0xccab, //字符003:[太] 0xd1f4, //字符004:[阳] 0xd7d3 //字符005:[子] }; unsigned char code EnglishCharDot[]={ 0x00,0x20,0x00,0x3c,0xc0,0x23,0x38,0x02, //字符001:[A] 0xe0,0x02,0x00,0x27,0x00,0x38,0x00,0x00, 0x08,0x20,0xf8,0x3f,0xf8,0x00,0x00,0x3f, //字符002:[M] 0xf8,0x00,0xf8,0x3f,0x08,0x20,0x00,0x00, 0x08,0x20,0xf8,0x3f,0x30,0x20,0xc0,0x00, //字符003:[N] 0x00,0x07,0x08,0x18,0xf8,0x3f,0x00,0x00, 0x00,0x00,0x70,0x38,0x88,0x20,0x08,0x21, //字符004:[S] 0x08,0x21,0x08,0x22,0x38,0x1c,0x00,0x00, 0x08,0x00,0xf8,0x1f,0x08,0x20,0x00,0x20, //字符005:[U] 0x00,0x20,0x08,0x20,0xf8,0x1f,0x00,0x00 }; unsigned char code ChineseCharDot[]={ 0x00,0x00,0x00,0x00,0xf8,0x0f,0x48,0x04, //字符001:[电] 0x48,0x04,0x48,0x04,0x48,0x04,0xff,0x3f, 0x48,0x44,0x48,0x44,0x48,0x44,0x48,0x44, 0xf8,0x4f,0x00,0x40,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10, //字符002:[人] 0x00,0x0c,0x00,0x03,0xc0,0x00,0x3f,0x00, 0xc2,0x01,0x00,0x06,0x00,0x0c,0x00,0x18, 0x00,0x30,0x00,0x60,0x00,0x20,0x00,0x00, 0x00,0x00,0x10,0x80,0x10,0x40,0x10,0x20, //字符003:[太] 0x10,0x10,0x10,0x0c,0x10,0x03,0xff,0x08, 0x10,0x71,0x10,0x22,0x10,0x04,0x10,0x18, 0x10,0x30,0x10,0xe0,0x10,0x40,0x00,0x00, 0x00,0x00,0xfe,0xff,0x02,0x04,0x22,0x08, //字符004:[阳] 0x5a,0x04,0x86,0x03,0x00,0x00,0xfe,0x3f, 0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10, 0x42,0x10,0xfe,0x3f,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x01,0x02,0x01,0x02,0x01, //字符005:[子] 0x02,0x01,0x02,0x41,0x02,0x81,0xe2,0x7f, 0x12,0x01,0x0a,0x01,0x06,0x01,0x02,0x01, 0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x00 }; //------------------------------------------------------------------------------- //以下为图片库点阵代码 //实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的imagelib.c文件来替换该 //部分 unsigned char code Img_sunman_32[]={32,32, 0x00,0xf0,0x0f,0x00, 0x00,0xfe,0x7f,0x00, 0x80,0x0f,0xf6,0x01, 0xc0,0x03,0xc6,0x03, 0xe0,0x70,0x0e,0x07, 0x70,0x7c,0x3e,0x0e, 0x38,0x7f,0xfe,0x1c, 0x9c,0x7f,0xfe,0x39, 0xcc,0x7f,0xfe,0x33, 0xce,0x7f,0xfe,0x73, 0xe6,0x7f,0xfe,0x67, 0xe6,0x07,0xe0,0x67, 0xf3,0x07,0xe0,0xcf, 0xf3,0xcf,0xff,0xcf, 0x73,0x9e,0xff,0xcf, 0x33,0x3c,0xff,0xcf, 0x33,0x3c,0xff,0xcf, 0x73,0x9e,0xff,0xcf, 0xf3,0xcf,0xff,0xcf, 0xf3,0x07,0xe0,0xcf, 0xe6,0x07,0xe0,0x67, 0xe6,0x7f,0xfe,0x67, 0xce,0x7f,0xfe,0x73, 0xcc,0x7f,0xfe,0x33, 0x9c,0x7f,0xfe,0x39, 0x38,0x7f,0xfe,0x1c, 0x70,0x7c,0x3e,0x0e, 0xe0,0x70,0x0e,0x07, 0xc0,0x63,0xc0,0x03, 0x80,0x6f,0xf0,0x01, 0x00,0xfe,0x7f,0x00, 0x00,0xf0,0x0f,0x00 }; //------------------------------------------------------------------------------- void main(void) { while(1) { lcdreset(); //初始化液晶显示控制器 exsample(); //演示程序 } } void exsample(void) //演示程序 { //0.演示前的准备,将LCD液晶显示全部清空 CharImageReverse=0; //反显关闭 lcdfill(0); //清屏 //1.图片测试: 在(8,16)位置显示32点阵SUNMAN图标 XPOS=8; YPOS=16; putimage(Img_sunman_32); //写数据到当前LCDRAM地址中 exdelay(); //延时约600mS //2.字符串测试: 在(56,16)位置显示"SUNMAN"字符串. XPOS=56; YPOS=16; putstr("SUNMAN"); exdelay(); //延时约600mS //3.字符串测试: 在(40,32)位置显示"太阳人电子"字符串. XPOS=40; YPOS=32; putstr("太阳人电子"); exdelay(); //延时约600mS //4.反显测试: 在(40,32)位置反显"太阳人电子"字符串. XPOS=40; YPOS=32; CharImageReverse=1; putstr("太阳人电子"); CharImageReverse=0; exdelay(); //延时约600mS //5.液晶电压测试: 液晶显示变淡. setlcdvoltage(28); exdelay(); //延时约600mS //6.液晶电压测试: 液晶显示变深. setlcdvoltage(36); exdelay(); //延时约600mS //7.液晶电压测试: 液晶显示正常. setlcdvoltage(32); exdelay(); //延时约600mS //8.全屏测试: 所有坐标点全部显示. 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++); } //------------------------------------------------------------------------------- //以下putchar为字符对象的基本子程序,putstr为字符对象的扩充子程序,getchinesecodepos, //getenglishcodepos为字符对象的辅助子程序. //------------------------------------------------------------------------------- //子程序名称:void putchar(unsigned int c). //功能:在(XPOS,YPOS)位置写单个字符点阵,若c>128 表示为中文字符,否则为西文字符 //修改日期:2009.8.18 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putchar(unsigned int c) //定位写字符子程序 { if(c>128) putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,getchinesecodepos(c)); else putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,getenglishcodepos(c)); } //------------------------------------------------------------------------------- //子程序名称:void putstr(unsigned char code *s). //功能:写字符串点阵,若*s=0 表示字符串结束. //修改日期:2009.8.18 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putstr(unsigned char code *s) //显示字符串子程序,字符码为0时退出 { unsigned int c; while(1) { c=*s; s++; if(c==0) break; if(c<128) putchar(c); else { putchar(c*256+*s); s++; } } } //------------------------------------------------------------------------------- //子程序名称:unsigned char code *getchinesecodepos(unsigned char ac). //功能:根据当前中文字符码查表后计算得到当前中文字符码的字库点阵位置. //修改日期:2009.8.18 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char code *getchinesecodepos(unsigned int ac) { unsigned int min,max,mid,midc; min=0; max=CHINESECHARNUMBER-1; while(1) { if(max-min<2) { if(ChineseCode[min]==ac) mid=min; else if(ChineseCode[max]==ac) mid=max; else mid=0; break; } mid=(max+min)/2; midc=ChineseCode[mid]; if(midc==ac) break; else if(midc>ac) max=mid-1; else min=mid+1; } return ChineseCharDot+mid*CHINESECHARDOTSIZE; } //------------------------------------------------------------------------------- //子程序名称:unsigned char code *getenglishcodepos(unsigned char ac). //功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置. //修改日期:2009.8.18 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- unsigned char code *getenglishcodepos(unsigned char ac) { unsigned char min,max,mid,midc; min=0; max=ENGLISHCHARNUMBER-1; while(1) { if(max-min<2) { if(EnglishCode[min]==ac) mid=min; else if(EnglishCode[max]==ac) mid=max; else mid=0; break; } mid=(max+min)/2; midc=EnglishCode[mid]; if(midc==ac) break; else if(midc>ac) max=mid-1; else min=mid+1; } return EnglishCharDot+mid*ENGLISHCHARDOTSIZE; } //------------------------------------------------------------------------------- //以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序 //------------------------------------------------------------------------------- //子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE, // unsigned char code *s) //功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(YSIZE及YPOS仅取8的倍数) //修改日期:2009.10.10 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s) { unsigned char lx,ly,a2,y; y=YPOS; for(lx=0;lx>4)); //列的高四位设置 lcdwc(Column&0x0F); //列的低四位设置 } //------------------------------------------------------------------------------- //子程序名称:void lcdreset(void) //功能:液晶显示控制器初始化 //修改日期:2009.08.31 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdreset(void) //液晶显示控制器初始化子程序 { lcdwc(0xA2); //设置LCD bias lcdwc(0xA1); //设置ADC select lcdwc(0xC0); //设置COM反向 lcdwc(0x2F); //设置电源控制模式 lcdwc(0x40); //设置显示初始行 lcdwc(0xAF); //开显示 } //------------------------------------------------------------------------------- //子程序名称:void setlcdvoltage(unsigned char vol) //功能:设置LCD电压用来调节显示的对比度 //修改日期:2009.08.31 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void setlcdvoltage(unsigned char vol) //LCD电压设置 { lcdwc(0x81); lcdwc(vol&0x3F); //范围为0-63,上电默认值为32 } //------------------------------------------------------------------------------- //以下lcdwc,lcdwd为四线式串行接口的NT7532液晶显示控制器的基本子程序, //transbyte,transbit为内部子程序. //------------------------------------------------------------------------------- //子程序名称:void lcdwd(unsigned char d). //功能:向液晶显示控制器写图形数据. //修改日期:2009.10.10 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwd(unsigned char d) { A0PIN=1; CSPIN=1; CSPIN=0; transbyte(d); CSPIN=1; } //------------------------------------------------------------------------------- //子程序名称:lcdwc(unsigned char c). //功能:向液晶显示控制器送指令. //修改日期:2009.10.10 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void lcdwc(unsigned char c) { A0PIN=0; CSPIN=1; CSPIN=0; transbyte(c); CSPIN=1; } //------------------------------------------------------------------------------- //子程序名称:void transbyte(unsigned char d). //功能:送1字节数据到液晶显示控制器. //修改日期:2009.10.10 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void transbyte(unsigned char d) //送1字节数据到液晶显示控制器子程序 { unsigned char i; for(i=0;i<8;i++) { if((d&0x80) == 0x80) transbit(1); else transbit(0); d<<=1; //从高到低位送字节位数据到液晶显示控制器 } } //------------------------------------------------------------------------------- //子程序名称:void transbit(bit d). //功能:送1位数据到液晶显示控制器. //修改日期:2009.10.10 //修改人:chujianjun@sunman.cn,tanchao@sunman.cn //------------------------------------------------------------------------------- void transbit(bit d) //送1位数据到液晶显示控制器子程序 { SIPIN = d; //先送数据到数据口线DI _nop_(); SCLPIN = 1; //再使时钟口线发一个负脉冲 _nop_(); SCLPIN = 0; _nop_(); SCLPIN = 1; }