OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5694|回复: 2

TFT屏显示汉字32*32

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-21
在线时间
0 小时
发表于 2014-4-21 15:09:50 | 显示全部楼层 |阅读模式
程序本来是显示16*16汉字的,但自己改成32*32却显示有问题,显示乱码,一直查不出原因,就改动了DrawSingleHz()函数。
所以麻烦各位帮忙看看哪里写错。谢谢!

[mw_shl_code=c,true]#define HZ_COLUMN  32 //汉字字体大小 #define HZ_CNT 20     //字库汉字个数 [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]typedef struct typFNT_GB32 /*32*32 汉字字模显示数据结构 */ {  char Index[2];  char Msk[128]; }typFNT_GB32;[/mw_shl_code] [mw_shl_code=c,true]const struct typFNT_GB32  HzLib[] = { [/mw_shl_code] [mw_shl_code=c,true]"正", 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x38,0x07,0xFF,0xFF,0xFC,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x60,0x00,0xC0,0xFF,0xF0, 0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00, 0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00, 0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0x10,0x00,0xC0,0xC0,0x38, 0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//正0 } [/mw_shl_code] [mw_shl_code=c,true]void DrawSingleHz(u16 x, u16 y, u8 *pHz, u16 LineColor,u16 FillColor, u8 Mod) { u16 j=0,i=0,k=0,l=0; u16 str,len; //---------------------------统计是否在字库中出现 len=HZ_CNT; for(j=0;j<len;j++) if((u8)HzLib[j].Index[0]==pHz[0]&&(u8)HzLib[j].Index[1]==pHz[1])break; //-------------------------- if(j<len) { for (i=0;i<HZ_COLUMN;i++)//(HZ_COLUMN)行处理 { Set_Ramaddr(x,y+i); //定位x,y+i) Send_Command(0x22); //     for(l=0;l<2;l++) //     { str = (u8)HzLib[j].Msk[(i+l)*2]<<8|(u8)HzLib[j].Msk[(i+l)*2+1]; //-----------列扫描------------- [/mw_shl_code] [mw_shl_code=c,true]                    for(k=0;k<16;k++) { if(str & (0x8000>>k))//写第(0x8000>>k)点进行处理 :1000 0000 0000 0000 { Send_Data((u16)(LineColor&0xffff)); } else { if (NORMAL == Mod) Send_Data((u16)(FillColor&0xffff)); else { Set_Ramaddr(x+k+1,y+i); Send_Command(0x22); } } }         } } } }[/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]void main()[/mw_shl_code] [mw_shl_code=c,true]{[/mw_shl_code] [mw_shl_code=c,true]    LCD32_Init(); DrawSingleHz(80 ,80 ,"正",BLUE,YELLOW,NORMAL);[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-21 19:21:19 | 显示全部楼层
参考下我们迷你版的自定义汉字显示实验,虽然是24*24的,但是很容易改成32*32的了。

ALIENTEK MINISTM32 扩展实验1 自定义汉字显示实验.zip

206.96 KB, 下载次数: 233

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-21
在线时间
0 小时
 楼主| 发表于 2014-4-21 20:53:50 | 显示全部楼层
谢谢原子哥回复!原子哥写的程序简单明了,很适合参考。自己也找到了问题所在。
对比了一下,感觉自己改的这个程序有个好处,不用每次指定汉字在库中的位置,也不用每次逐点定位直接让地址计数器自增。
下面是修改好的程序,有写的不好的望指出
[mw_shl_code=c,true]/************************************************************************************** * Function Name : DrawSingleHz * Description : Display a chinese char at specify position. * Input : x - x position * y - y position * pHz - the ascii point * LineColor - the ascii color * FillColor - the background color * Mod - mode of normal or specitial * Output : None * Return : None **************************************************************************************/ void DrawSingleHz(u16 x, u16 y, u8 *pHz, u16 LineColor,u16 FillColor, u8 Mod) { u16 j=0,i=0,k=0; u16 len; u32 str; //---------------------------统计是否在字库中出现 len=HZ_CNT; for(j=0;j<len;j++) if((u8)HzLib[j].Index[0]==pHz[0]&&(u8)HzLib[j].Index[1]==pHz[1])break; //--------------------------若字库有出现汉字 if(j<len) { for (i=0;i<HZ_COLUMN;i++)//32行处理 { Set_Ramaddr(x,y+i); //定位x,y+i) Send_Command(0x22); //地址计数器自增 { str =(u32)HzLib[j].Msk[i*4+0]<<24 | (u32)HzLib[j].Msk[i*4+1]<<16 | (u32)HzLib[j].Msk[i*4+2]<<8 | (u32)HzLib[j].Msk[i*4+3] ; //-----------列逐点扫描------------- for(k=0;k<32;k++) { if(str & (0x80000000>>k))//逐点判断,若真写点 { Send_Data((u16)(LineColor)); } else { if (NORMAL == Mod) //字体显示的时候有背景颜色 Send_Data((u16)(FillColor)); else //字体显示的时候不带背景颜色 { Set_Ramaddr(x+k+1,y+i);//跳过该点不写 Send_Command(0x22); } } } } } } }[/mw_shl_code]


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-9 19:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表