热度 24
2012-6-7 11:56
3297 次阅读|
2 个评论
带字库的图形点阵LCD模块价格要比不带字库的贵很多,但是使用不带字库的LCD模块,往往在编程上要麻烦许多。最近我做一个PAC控制器的时候,使用不带字库的12864LCD模块,发现在程序上使用一些技巧,能使不带字库的模块用起来和带字库的一样方便。 首先要感谢下面这篇博文: http://bbs.ednchina.com/BLOG_ARTICLE_20371.HTM 但是我用其中的代码移植到飞思卡尔的编译环境下出现很多错误,不能直接使用。 下面是演示LCD显示的代码,只需要在函数disp_str()输入显示字符串的位置和字符串就可以了。这样不是和带字库的LCD模块一样方便使用吗? void LCD_Demo() { uchar i,j,len; uchar Char_Index; //字符所在的行 uchar x,y; Lcd_Init(); ClearScreen(); disp_str(16,4,"液晶显示MCR MOTOR"); //显示字符串 } 这其中的关键奥秘在于,输入到函数中的字符串会被编译成ASCII代码,其中汉字占两位uchar,其他字符占一位uchar.请看disp_str()函数内容: void disp_str(uchar x,uchar y,uchar str 0) //遍历字符串数组。 { if (str 128) //非汉字的字符被编译为小于128的数值 { /* ASCII */ disp_char(List_X,y,str ); List_X+=ASC_CHR_WIDTH; MDelay(500); } else //汉字的字符被编译为大于128的数值,并且占两位uchar { /* 中文 */ disp_hz(List_X,y,str ,str ); i++; //跳一位,因为汉字站两位数组位。 List_X+=ASC_HZ_WIDTH; MDelay(500); } i++; } } 从字符串中解析出来ASCII码后,就可以根据这个来找对应的字模。字模还是要做的,但是字模的格式与一般的不太一样。如下面的代码。 typedef struct typFNT_ASC16 /* 字符字模显示数据结构 */ { char Index ; char Msk ; }; struct typFNT_ASC16 const ASC_16 数组中去找第一位的ASCII代码与"A"相等的。找到后显示后面的字模。下面是disp_char()函数 void disp_char(uchar x, uchar y, uchar c) { uchar i,j,len; uchar Char_Index; //字符所在的行 //x = 1; //y = 3; if (x 0x40) { LCD_CS1 = 0; LCD_CS2 = 1; } else { LCD_CS1 = 1; LCD_CS2 = 0; } //先找到字符是在数据表里面的哪一行Index=? len=sizeof(ASC_16)/sizeof(ASC_16 ); //字符表的行数 for(i=0;ilen;i++) { if(c == ASC_16 .Index ) break; //找到字符是在哪一行 } Char_Index=i; if (Char_Indexlen){ //显示上半部分 Lcd_WriteCmd(PAGE_ADD|y); Lcd_WriteCmd(LIST_ADD|x); for (j = 0; j ASC_CHR_WIDTH ; j++) { Lcd_WriteData(ASC_16 .Msk ); } //显示下半部分 Lcd_WriteCmd((PAGE_ADD+1)|y); Lcd_WriteCmd(LIST_ADD|x); for (j = ASC_CHR_WIDTH ; j ASC_CHR_WIDTH+ ASC_CHR_WIDTH ; j++) { Lcd_WriteData(ASC_16 .Msk ); } } } 汉字显示的代码也与之相似,只是需要判断两个uchar变量是否与字库数组中相等。 汉字字库: #define ASC_HZ_WIDTH 12 #define ASC_HZ_HEIGHT 16 typedef struct typFNT_GB16 /*12*16 汉字字模显示数据结构 */ { char Index ; char Msk ; }; struct typFNT_GB16 const GB_16 ); //先找到汉字是在数据表里面的哪一行Index=?问题是找不到汉字 for(i=0;ilen;i++) { if(hz0 ==(256+GB_16 .Index ) hz1 ==(256+GB_16 .Index )) //发现变成了hz0+GB16=256 break; } Char_Index=i; if (Char_Indexlen){ //显示上半部分 Lcd_WriteCmd(PAGE_ADD|y); Lcd_WriteCmd(LIST_ADD|x); for (j = 0; j ASC_HZ_WIDTH; j++) { Lcd_WriteData(GB_16 .Msk ); } //显示下半部分 Lcd_WriteCmd((PAGE_ADD+1)|y); Lcd_WriteCmd(LIST_ADD|x); for (j = ASC_HZ_WIDTH; j ASC_HZ_WIDTH+ASC_HZ_WIDTH; j++) { Lcd_WriteData(GB_16 .Msk ); } } } 很奇怪的是,飞思卡尔编译器系统把字库数组中的汉字编译成ASCII码,编成了负数。所以判断条件和非汉字的不一样。if(hz0 ==(256+GB_16 .Index ) hz1 ==(256+GB_16 .Index )) 也许别的编译系统又不一样。 以上就是图形点阵编程的技巧。