野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9836|回复: 6

看了论坛有人写的16X16直接显示汉字的程序,请问32X32的怎么改?

[复制链接]
发表于 2015-8-19 10:15:23 | 显示全部楼层 |阅读模式
/* 显示一个汉字
* 大小为 16(宽度)* 16(高度),共32个字节
* 取模顺序为:高位在前,低位在后
*/
void LCD_DispCH(uint16_t x, uint16_t y, const uint8_t buffer[], uint16_t color)
{
        uint8_t page , column;
        //uint8_t buffer[32];               
        uint16_t tmp_char=0;
       
        LCD_open_windows(x, y, CH_WIDTH, CH_HEIGHT);
       
        //GetGBKCode_from_sd(buffer,pstr);         /* 取字模数据 */
       
        for(page=0; page< CH_HEIGHT; page++)
        {
                tmp_char=buffer[page*2];
                tmp_char=(tmp_char<<8);
                tmp_char|=buffer[2*page+1];
               
                for (column=0; column< CH_WIDTH; column++)
                {                       
                        if ( tmp_char & (0x01<<15) )
                        {                               
                                LCD_WR_Data(color);
                        }
                        else
                        {                       
                                LCD_WR_Data(WHITE);
                        }
                        tmp_char <<= 1;
                }
        }
}

我把长宽都定义成32了,字节也是128了,然后
                tmp_char=buffer[page*4];    //原来是2
                tmp_char=(tmp_char<<8);
                tmp_char|=buffer[4*page+1];  //原来是2

可以写进去只显示一半。
回复

使用道具 举报

发表于 2015-8-19 10:41:45 | 显示全部楼层
CH_HEIGHT
CH_WIDTH
改成32,然后用32*32的字模
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-19 11:24:03 | 显示全部楼层
flyleaf 发表于 2015-8-19 10:41
CH_HEIGHT
CH_WIDTH
改成32,然后用32*32的字模

我确定是改成32 32了,但是就是只显示一半,左边正常,右边空白。

后来我直接把这两个数取消,直接改成32(怕自己定义有问题)但是还是不对。
回复 支持 反对

使用道具 举报

发表于 2015-8-19 16:55:02 | 显示全部楼层
这是我的32*32汉字显示程序,有点拖沓,一行需写4个字节,相似的语句调用了4次
参数n是我自己对少量汉字时的编号,没用字库,不过和调用SD卡里的字模是一样的
void LCD_Disphanzi(uint16_t x, uint16_t y,uint16_t n,uint16_t color)
{
   uint16_t page, column,temp1,temp2,temp3,temp4;
   LCD_OpenWindow(x, y,32, 32); //32 *32
LCD_ILI9341_CMD(0X2C);

for( page=0; page < 128; page+=4 ) //32 *32漢字佔128字節
{
  temp1 = hanzi3232[n];
  temp2 = hanzi3232[n][page+1];
  temp3 = hanzi3232[n][page+2];
  temp4 =hanzi3232[n][page+3];
  for( column=0; column < 8; column++ )
  {
   if( temp1 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp1>>= 1;  
  }/*寫1/4行8個點*/
     for( column=0; column < 8; column++ )
  {
   if( temp2 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp2>>= 1;  
  }/*又寫1/4行*/
    for( column=0; column < 8; column++ )
  {
   if( temp3 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp3>>= 1;  
  }/* 又寫1/4行*/
    for( column=0; column < 8; column++ )
  {
   if( temp4 & 0x01 )
   {
    LCD_WR_Data( color );
   }
   else
   {
    LCD_WR_Data( BACKGROUND );        
   }
   temp4>>= 1;  
  }/*又寫1/4行, 一行寫完*/
}/*寫128/4次即寫完32行*/
}
如果嬚程序长,参考下面的顯示64*64漢字程序,當然不會再把相似的語句段寫8次了
void LCD_Dispbighanzi(uint16_t x, uint16_t y,uint16_t n,uint16_t color)
{
   uint16_t page,byte,column,temp1;
   LCD_OpenWindow(x, y,64, 64); //64 *64  LCD_ILI9341_CMD(0X2C);

for( page=0; page < 512; page+=8 )
{
   for(byte=0;byte < 8; byte++)   
   {
    temp1 = hanzi64x64[n][page+byte];
     for( column=0; column < 8; column++ )
     {      
      if( temp1 & 0x01 )
      {
       LCD_WR_Data( color );
      }
      else
      {
       LCD_WR_Data( BACKGROUND );        
      }
      temp1>>= 1;  
     }/* 寫8 個點*/
  } /* 寫完一行*/   
}/*寫完64 行*/
}



回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-20 09:38:11 | 显示全部楼层
11kxmx 发表于 2015-8-19 16:55
这是我的32*32汉字显示程序,有点拖沓,一行需写4个字节,相似的语句调用了4次
参数n是我自己对少量汉 ...

谢谢,我想出来的办法也是想像你第一个一样多写几次。我试一试呢。
回复 支持 反对

使用道具 举报

发表于 2015-8-22 22:34:08 | 显示全部楼层
#define STR_WIDTH1                32                /* 字符宽度 */
#define STR_HEIGHT1                32                /* 字符高度 */                bsp_ili9341_lcd.h

#define STR_SIZE        ((STR_WIDTH1-1)/8+1)*STR_HEIGHT1
const unsigned char asc_zi[][STR_SIZE]={
    /*存放字符数据*/
};                                                                                                    ascii.h

void LCD_Dispzi(uint16_t x, uint16_t y, uint8_t ks, uint16_t color)
{
        uint16_t page, column, temp, i,width,j=0;
       
        LCD_OpenWindow(x, y, STR_WIDTH1, STR_HEIGHT1);
        LCD_ILI9341_CMD(0X2C);       
       
        for( page=0; page < STR_HEIGHT1; page++ )
        {
                width=STR_WIDTH1;
                while(width)
                {
                        temp = asc_zi[ks][j++];
                        if(width<=8)
                        {
                                i=width;
                                width=0;
                        }
                        else
                        {
                                width-=8;
                                i=8;
                        }
                        for( column=0; column < i; column++ )
                        {
                                if( temp & 0x80 )
                                {
                                        LCD_WR_Data( color );
                                }
                                else
                                {
                                        LCD_WR_Data( BACKGROUND );                                                               
                                }
                                temp <<= 1;               
                        }
                }/*一行写完 */
        }/* 全部写完 */
}
void LCD_DispziStr(uint16_t x, uint16_t y, uint8_t ks, uint8_t gs , uint16_t color)
{
        while( gs-- )
        {
                if( x > (COLUMN-STR_WIDTH1) )
                {
                        x = 0;
                        y += STR_HEIGHT1;
                }
                if( y > (PAGE-STR_HEIGHT1) )
                {
                        x = 0;
                        y = 0;
                }
                LCD_Dispzi(x, y, ks, color);
                x += STR_WIDTH1;
                ks++;
        }
}                                                                                    bsp_ili9341_lcd.c

int main(void)
{  
  LCD_Init();       

        LCD_Clear(0, 0, 240, 320, BACKGROUND);       
        LCD_DispziStr(0,0,0,5,RED);
        while( 1 ){}
}                                                                                   main.c
LCD_DispziStr(0,0,0,5,RED);函数前两个参数为选择液晶屏位置,第三个参数选择数组第几个字开始,第四个参数表示显示多少个字,第五个选择颜色,现在这个函数表示从液晶屏0,0位置开始显示,从数组第0个字开始显示,显示5个字。
此函数适合任何字体大小,前提是不超过液晶屏大小,想修改字体大小只需要重新取模,修改 STR_WIDTH1(字符宽度)和STR_HEIGHT1(字符高度)即可,函数不需要任何修改。


回复 支持 1 反对 0

使用道具 举报

发表于 2015-8-22 23:05:53 | 显示全部楼层
本帖最后由 yawn 于 2015-8-23 10:08 编辑

你最开始那个只显示一半是因为只有一半的数据,当然就只显示了一半。修改的话要这样修改:
uint32_t tmp_char;//要改成32位
tmp_char=(buffer[page*4]<<24)|(buffer[page*4+1]<<16)|(buffer[page*4+2]<<8)|(buffer[page*4+3]);//要或4个才行,你之前才两个,当然只显示一半汉字了,现在明白了吧?                    另外  if ( tmp_char & (0x01<<15) )也要改成 if ( tmp_char & (1<<31) ),因为是从32位最高位判断;如果是用了二维数组的话也要改,改成128,因为32*32一行有4个字节,有32行,总共4*32=128个字节。


回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-1 23:14 , Processed in 0.030767 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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