OpenEdv-开源电子网

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

请问汉字显示实验,单个汉字可以,字符串为什么只显示第一个汉字,原子哥的字符串可以(探索者F4),帮我看看程序

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
发表于 2015-10-21 22:58:06 | 显示全部楼层 |阅读模式
5金钱
使用的是原子哥的程序,字库添加FONT28的字库
POINT_COLOR=RED;      
 Show_Str(30,50,200,16,"???÷??STM32F407??·?°?",16,0);         
 Show_Str(30,70,200,16,"GBK×??????????ò",16,0);         
 Show_Str(30,90,200,16,"?????­×?@ALIENTEK",16,0);         
 Show_Str(30,110,200,16,"2014?ê5??15??",16,0);
 Show_Str(30,130,200,16,"°?KEY0,?ü??×???",16,0);
  OINT_COLOR=BLUE; 
 Show_Str(30,150,200,16,"??????×???:",16,0);         
 Show_Str(30,170,200,16,"??????×???:",16,0);         
 Show_Str(30,190,200,16,"??×??????÷:",16,0);
 OINT_COLOR=RED;   
 Show_Str(30,220,200,24,"对应汉字为:",24,0);
 Show_Str(30,244,200,16,"??????×?(16*16)??:",16,0);   
 Show_Str(30,260,200,12,"??????×?(12*12)??:",12,0);  
 Show_Str(30,300,200,16,"??????×?(12*12)??:",16,0); 
 Show_Str(30,340,200,16,"abcdefg:",16,0); 
 Show_Str(30,360,200,24,“对应汉字显示为:",24,0); //显示正常
    Show_Font(30,380,"加",28,0);//单个字显示正常
 Show_Str(30,440,200,28,"!0123456aBCDEFG",28,0);//字符也显示正常
 Show_Str(30,410,200,28,"aBCDEFG",28,0);
 LCD_ShowNum(30,470,6,2,28);
 Show_Str(30,500,200,28,"显示内码:",28,0);
 while(1)
 {
  fontcnt=0;
  for(i=0x81;i<0xff;i++)
  {  
   fontx[0]=i;
   LCD_ShowNum(118,150,i,3,16);  //??????????×???   
   for(j=0x40;j<0xfe;j++)
   {
    if(j==0x7f)continue;
    fontcnt++;
    LCD_ShowNum(118,170,j,3,16); //??????????×??? 
    LCD_ShowNum(118,190,fontcnt,5,16);//??×????????? 
     fontx[1]=j;
    Show_Font(30+132,220,fontx,24,0);  
    Show_Font(30+144,244,fontx,16,0);        
    Show_Font(30+108,260,fontx,12,0);        
    t=200;
    while(t--)//???±,???±?¨?è°??ü
    {
     delay_ms(1);
     key=KEY_Scan(0);
     if(key==KEY0_PRES)goto UPD;
    }
    LED0=!LED0;
   }  
  } 
 }
Show_Font(30,380,"加",28,0);//单个字显示正常
 Show_Str(30,500,200,28,"显示内码:",28,0);//只显示一个汉字
在show_str();函数中,是调用的show_Font();函数的,
但是原子哥的 Show_Str(30,360,200,24,“对应汉字显示为:",24,0); //显示正常

不知道什么原因,搞了2天了,新手第一次发帖



这是原子哥的源程序

void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{     
 u16 x0=x;
 u16 y0=y;           
    u8 bHz=0;     //×?·??ò??????                       
    while(*str!=0)//???????á??
    {
        if(!bHz)
        {
         if(*str>0x80)bHz=1;//????
         else              //×?·?
         {     
                if(x>(x0+width-size/2))//????
    {      
     y+=size;
     x=x0;   
    }          
          if(y>(y0+height-size))break;//????·???     
          if(*str==13)//????·???
          {        
              y+=size;
     x=x0;
              str++;
          } 
          else LCD_ShowChar(x,y,*str,size,mode);//???§??·?????
    str++;
          x+=size/2; //×?·?,????×?????°?
         }
        }else//????
        {    
            bHz=0;//????×???   
            if(x>(x0+width-size))//????
      {    
        y+=size;
        x=x0;   
      }
         if(y>(y0+height-size))break;//????·???            
         Show_Font(x,y,str,size,mode); //??????????×?,????????
         str+=2;
         x+=size;//????????×?????    
        }      
    }  
}        

实验40 汉字显示实验.rar

7.55 MB, 下载次数: 170

最佳答案

查看完整内容[请看2#楼]

因为没有28*28的字体.
我是第一次发帖,请大家多关照,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-21 22:58:07 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
 楼主| 发表于 2015-10-22 13:03:00 | 显示全部楼层
求助!原子哥和各位帮帮,我是新手, 不胜感激!
我是第一次发帖,请大家多关照,
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
 楼主| 发表于 2015-10-23 23:30:01 | 显示全部楼层
谢谢原子哥,我再换种字体试一下,谢谢
我是第一次发帖,请大家多关照,
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
 楼主| 发表于 2015-10-24 18:14:03 | 显示全部楼层
原子哥,我把12,16,24三种字体全删了,把16改成32的字体,
字体也更新正常
Show_Font(80,80,"电",32,0);//显示正常
但是用
 Show_Str(30,150,200,32,"探索者STM32F407开发板",32,0); //显示还是不正常,只显示一个汉子“探”
探索者板的源程序上修改的, Show_Str()汉字不能全部显示,
不知还需要哪里修改?您的视频我也看了好多遍,找不到原因,多谢指教,不胜感激

#include "fontupd.h"
#include "text.h" 
//ALIENTEK 探索者STM32F407开发板 实验40
//汉字显示 实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//广州市星翼电子科技有限公司   
//作者:正点原子 @ALIENTEK

 
int main(void)
{       
 u32 fontcnt;   
 u8 i,j;
 u8 fontx[2];//gbk码
 u8 key,t;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
 delay_init(168);  //初始化延时函数
 uart_init(115200);  //初始化串口波特率为115200
 LED_Init();     //初始化LED 
  LCD_Init();     //LCD初始化 
  KEY_Init();     //按键初始化 
 W25QXX_Init();    //初始化W25Q128
 usmart_dev.init(168);  //初始化USMART
 my_mem_init(SRAMIN);  //初始化内部内存池
 my_mem_init(SRAMCCM);  //初始化CCM内存池
 exfuns_init();    //为fatfs相关变量申请内存 
   f_mount(fs[0],"0:",1);   //挂载SD卡
  f_mount(fs[1],"1:",1);   //挂载FLASH.
 while(font_init())    //检查字库
 {
UPD:   
  LCD_Clear(WHITE);      //清屏
   OINT_COLOR=RED;   //设置字体为红色          
  LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
  while(SD_Init())   //检测SD卡
  {
   LCD_ShowString(30,70,200,16,16,"SD Card Failed!");
   delay_ms(200);
   LCD_Fill(30,70,200+30,70+16,WHITE);
   delay_ms(200);     
  }                  
  LCD_ShowString(30,70,200,16,16,"SD Card OK");
  LCD_ShowString(30,90,200,16,16,"Font Updating...");
  key=update_font(20,110,16,"0:");//更新字库
  while(key)//更新失败  
  {       
   LCD_ShowString(30,110,200,16,16,"Font Update Failed!");
   delay_ms(200);
   LCD_Fill(20,110,200+20,110+16,WHITE);
   delay_ms(200);        
  }    
  LCD_ShowString(30,110,200,16,16,"Font Update Success!   ");
  delay_ms(1500); 
  LCD_Clear(WHITE);//清屏       
 } 
 OINT_COLOR=RED;   
 Show_Font(80,80,"电",32,0);
 
        
 Show_Str(30,150,200,32,"探索者STM32F407开发板",32,0); 
 while(1)
 {
  fontcnt=0;
  for(i=0x81;i<0xff;i++)
  {  
   fontx[0]=i;
   LCD_ShowNum(118,150,i,3,16);  //显示内码高字节   
   for(j=0x40;j<0xfe;j++)
   {
    if(j==0x7f)continue;
    fontcnt++;
    LCD_ShowNum(118,170,j,3,16); //显示内码低字节 
    LCD_ShowNum(118,190,fontcnt,5,16);//汉字计数显示 
     fontx[1]=j;

    Show_Font(30+144,324,fontx,16,0);        
   
    t=200;
    while(t--)//延时,同时扫描按键
    {
     delay_ms(1);
     key=KEY_Scan(0);
     if(key==KEY0_PRES)goto UPD;
    }
    LED0=!LED0;
   }  
  } 
 }
}
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{     
 unsigned char qh,ql;
 unsigned char i;      
 unsigned long foffset;
 u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数 
 qh=*code;
 ql=*(++code);
 if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
 {        
     for(i=0;i<csize;i++)*mat++=0x00;//填充满格
     return; //结束访问
 }         
 if(ql<0x7f)ql-=0x40;//注意!
 else ql-=0x41;
 qh-=0x81;  
 foffset=((unsigned long)190*qh+ql)*csize; //得到字库中的字节偏移量     
 switch(size)
 {
//  case 12:
//   W25QXX_Read(mat,foffset+ftinfo.f12addr,csize);
//   break;
  case 32:
   W25QXX_Read(mat,foffset+ftinfo.f32addr,csize);
   break;
//  case 32:
//   W25QXX_Read(mat,foffset+ftinfo.f32addr,csize);
//   break;
   
 }                    

//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示   
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
 u8 temp,t,t1;
 u16 y0=y;
 u8 dzk[96];  
 u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数 
 if(size!=12&&size!=16&&size!=32)return; //不支持的size
 Get_HzMat(font,dzk,size); //得到相应大小的点阵数据
 for(t=0;t<csize;t++)
 {                 
  temp=dzk[t];   //得到点阵数据                         
  for(t1=0;t1<8;t1++)
  {
   if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
   else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
   temp<<=1;
   y++;
   if((y-y0)==size)
   {
    y=y0;
    x++;
    break;
   }
  }   
 } 
}
//在指定位置开始显示一个字符串    
//支持自动换行
//(x,y):起始坐标
//width,height:区域
//str  :字符串
//size :字体大小
//mode:0,非叠加方式;1,叠加方式            
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{     
 u16 x0=x;
 u16 y0=y;           
    u8 bHz=0;     //字符或者中文                       
    while(*str!=0)//数据未结束
    {
        if(!bHz)
        {
         if(*str>0x80)bHz=1;//中文
         else              //字符
         {     
                if(x>(x0+width-size/2))//换行
    {      
     y+=size;
     x=x0;   
    }          
          if(y>(y0+height-size))break;//越界返回     
          if(*str==13)//换行符号
          {        
              y+=size;
     x=x0;
              str++;
          } 
          else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入
    str++;
          x+=size/2; //字符,为全字的一半
         }
        }else//中文
        {    
            bHz=0;//有汉字库   
            if(x>(x0+width-size))//换行
   {    
    y+=size;
    x=x0;   
   }
         if(y>(y0+height-size))break;//越界返回            
         Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示
         str+=2;
         x+=size;//下一个汉字偏移    
        }      
    }  
}       

  

实验40 汉字显示实验.rar

7.21 MB, 下载次数: 130

我是第一次发帖,请大家多关照,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-24 19:05:14 | 显示全部楼层
回复【5楼】sujwei:
---------------------------------
仿真进去看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
 楼主| 发表于 2015-10-24 20:14:54 | 显示全部楼层


仿真运行到这个地方就断掉了,原子哥,我也看不出什么问题,谢谢
我是第一次发帖,请大家多关照,
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-1-15
在线时间
14 小时
 楼主| 发表于 2015-10-24 20:24:01 | 显示全部楼层
原子哥,谢谢!,我找到原因了
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
u8 temp,t,t1;
u16 y0=y;
u8 dzk[256];   
这个dzk[];数组设置的太小了,原来dzk[96]只显示1个汉子,改成256可以全显示了,中间断估计也是数组太小了
我是第一次发帖,请大家多关照,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 12:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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