OpenEdv-开源电子网

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

7寸屏幕在指定位置显示一个字问题

[复制链接]

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-4-17
在线时间
0 小时
发表于 2013-6-24 13:19:55 | 显示全部楼层 |阅读模式

初学者,真心请教。
                                       

  7寸屏在指定位置显示一个汉字时,我知道的有两种方法。

一种是flash做的,暂时没学,想用下边的方法解决。
另一种是像 LCD_ShowString(X,Y,"Mini STM32",16);
LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)里边有个

num=num-' ';//得到偏移后的值
但是我建立一个汉字的字体库时(自己所用的字),调用的时候就得

LCD_ShowHanziString(u16 x,u16 y,u8 num,u8 size)
就得用u8 num(具体的数字)去调用const unsigned char Hanzi_1212[10][24]={};的汉字。

问题:就是我能不能像 num=num-' ';得到一个偏移量,这样我调用

LCD_ShowHanziString(u16 x,u16 y,u8 num,u8 size)时num就能换成“具体的汉字”来用。
就像LCD_ShowString(X,Y,"Mini STM32",16);中的"Mini STM32"???直接写出自己想用的这几个字。
初学者,我试了不行,是不是因为num=num-' ';是计算机固定的ASCII码的原因。

求教。最终目的LCD_ShowHanziString(u16 x,u16 y,“具体的汉字直接调用”,u8 size)????

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

使用道具 举报

1

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-5-31
在线时间
1 小时
发表于 2013-6-24 13:40:11 | 显示全部楼层
可以做一个索引,在用查表的方法
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-6-24 14:02:32 | 显示全部楼层
当然不行啊....
汉字内码是有两个字元组成,  而且还不连续.    不可能用计算方式 .
事实上, 大多汉字显示程序它是采用先比对汉字内码的方式(2个字元), 
如找到就载入字模再显示出来.
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-6-24 14:05:35 | 显示全部楼层
void Gui_DrawFont_GBK16(u16 x, u16 y, u16 fc, u16 bc, u8 *s)
{
unsigned char i,j;
unsigned short k,x0;
x0=x;

while(*s) 
{
if( *s < 0x80 ) {
k=*s;
if (k>32) k-=32; else k=0;

            Lcd_SetRegion(x,y,x+7,y+15);    // 設定顯示視窗框對應
        SPILCD_WriteRAM_Prepare();        // 寫入GRAM命令  
for(i=0;i<16;i++)
{
    for (j=0;j<8;j++)
{
     if(asc16[k*16+i]&(0x80>>j)) SPILCD_WriteRAM(fc);   // 寫入前景顏色值
else 
{
if (fc!=bc) SPILCD_WriteRAM(bc);    // 寫入背景顏色值
}
}
}

s++;x+=8;
}
else 
{

for (k=0;k<hz16_num;k++) 
{
  if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
  { 
    for(i=0;i<16;i++)
    {
    Lcd_SetRegion(x+i,y,x+i,y+8);    // 設定顯示視窗框對應
                  SPILCD_WriteRAM_Prepare();        // 寫入GRAM命令  
for(j=0;j<8;j++) 
{
     if(hz16[k].Msk[i*2]&(0x80>>j)) SPILCD_WriteRAM(fc);   // 寫入前景顏色值
else {
if (fc!=bc) SPILCD_WriteRAM(bc);    // 寫入背景顏色值
}
}

    Lcd_SetRegion(x+i,y+8,x+i,y+16);    // 設定顯示視窗框對應
                  SPILCD_WriteRAM_Prepare();        // 寫入GRAM命令
for(j=0;j<8;j++) 
{  
     if(hz16[k].Msk[i*2+1]&(0x80>>j)) SPILCD_WriteRAM(fc);   // 寫入前景顏色值
else 
{
if (fc!=bc) SPILCD_WriteRAM(bc);    // 寫入背景顏色值
}
}
    }
}
  }
s+=2;x+=16;



}

.....
Gui_DrawFont_GBK16(10,50,RED,WHITE,"Mini STM32現在溫度"); 
.......




struct typFNT_GB162
{
       unsigned char Index[2];
       char Msk[32];
};
//細明體5號
#define hz16_num   6

const struct typFNT_GB162 hz16[] = {
#if USE_ONCHIP_FLASH_FONT
"現",0x44,0x20,0x44,0x20,0x7F,0xE0,0x44,0x44,0x44,0x44,0x00,0x04,0x7F,0xC8,0x54,0x90,0x54,0xE0,0x54,0x80,0x54,0xF8,0x54,0x84,0x7F,0xC4,0x00,0x1C,0x00,0x00,0x00,0x00,
"在",0x20,0x40,0x20,0x80,0x21,0xFC,0x26,0x00,0x38,0x04,0xE1,0x04,0x21,0x04,0x21,0x04,0x2F,0xFC,0x21,0x04,0x21,0x04,0x21,0x04,0x61,0x0C,0x20,0x04,0x00,0x00,0x00,0x00,
"溫",0x08,0x0C,0x86,0x30,0x60,0x40,0x00,0x04,0x00,0xFC,0x7E,0x84,0x42,0x84,0x4E,0xFC,0x72,0x84,0x4E,0xFC,0x42,0x84,0xFE,0x84,0x40,0xFC,0x00,0x04,0x00,0x00,0x00,0x00,
"度",0x00,0x0C,0x7F,0xF0,0x48,0x04,0x48,0x84,0x48,0x84,0x5E,0xC8,0x4A,0xA8,0xCA,0x90,0x4A,0x90,0x5E,0xA8,0x48,0xC8,0x48,0x84,0x48,0x04,0x48,0x04,0x00,0x00,0x00,0x00,
"濕",0x08,0x0C,0x86,0x30,0x60,0x40,0x00,0x04,0x02,0x58,0xFD,0xC0,0xA9,0x50,0xAA,0xCC,0xA8,0x00,0xAA,0x50,0xAD,0xCC,0xA9,0x40,0xFA,0x50,0x00,0xCC,0x00,0x00,0x00,0x00,
"度",0x00,0x0C,0x7F,0xF0,0x48,0x04,0x48,0x84,0x48,0x84,0x5E,0xC8,0x4A,0xA8,0xCA,0x90,0x4A,0x90,0x5E,0xA8,0x48,0xC8,0x48,0x84,0x48,0x04,0x48,0x04,0x00,0x00,0x00,0x00,

#endif
0x00,
};
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-6-24 14:10:32 | 显示全部楼层
以上程序是经过小优化过的,   每一列8个点进行LCD窗口对应设置,  速度会比每个点都定位一次要快上好几倍.

如果取模方式是逐一 "行" (横向) ..   全部取完,  再取第2行...  直到纵向全部取完....         

则这样的字模显示更快,  一次对应出 16X16这个的LCD窗体,  然后只要连续写入 16X16个点..  就能显示出一个汉字.

速度又比我上面这个  又快了好多倍 .        所以,  取模方式将决定你的显示程序怎么写...
回复 支持 反对

使用道具 举报

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-4-17
在线时间
0 小时
 楼主| 发表于 2013-6-24 20:10:09 | 显示全部楼层
回复【5楼】liuje:
---------------------------------
非常感谢!大致明白你要说的意思了。谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 10:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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