找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1325|回复: 21
打印 上一主题 下一主题
收起左侧

nrf51822移植stm32单片机 LCD程序的问题

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
单片机nrf51822,在移植stm32lcd的例程中发现程序报错,报错显示如下

.\Peripheral\inc\FONT.h(446): error:  #144: a value of type "char [4]" cannot be used to initialize an entity of type "unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,
.\Peripheral\inc\FONT.h(448): error:  #144: a value of type "char [4]" cannot be used to initialize an entity of type "unsigned char [2]"
  "???",0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0xFF,0x7F,0x00,0x00,
.\Peripheral\inc\FONT.h(450): error:  #144: a value of type "char [4]" cannot be used to initialize an entity of type "unsigned char [2]"
  "???",0x00,0x00,0xFE,0x3F,0x02,0x20,0xF2,0x27,0x02,0x20,0x02,0x20,0xFA,0x2F,0x22,0x21,
.\Peripheral\inc\FONT.h(452): error:  #144: a value of type "char [4]" cannot be used to initialize an entity of type "unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,
.\Peripheral\inc\FONT.h(454): error:  #144: a value of type "char [4]" cannot be used to initialize an entity of type "unsigned char [2]"
  "???",0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F,
Peripheral\src\LCD.c: 0 warnings, 5 errors


报错位置代码是这样的
const typFNT_GB16 tfont16[]={
"中",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,
0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,/*"中",0*/
"景",0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0xFF,0x7F,0x00,0x00,
0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,0x80,0x00,0x84,0x10,0xA2,0x20,0x40,0x00,/*"景",1*/
"园",0x00,0x00,0xFE,0x3F,0x02,0x20,0xF2,0x27,0x02,0x20,0x02,0x20,0xFA,0x2F,0x22,0x21,
0x22,0x21,0x22,0x21,0x12,0x29,0x12,0x29,0x0A,0x2E,0x02,0x20,0xFE,0x3F,0x02,0x20,/*"园",2*/
"电",0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,
0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x50,0x80,0x40,0x80,0x40,0x00,0x7F,/*"电",3*/
"子",0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"子",4*/


最开始我以为是汉字导致的问题,将“中景园电子”几个字删除以后,程序不再报错,编译程序可以通过,然后我调用
LCD_ShowChinese(40,0,"中景园电子",RED,WHITE,16,0);
发现下载以后程序不能正常显示,但是调用LCD_ShowString(0,0 ,"A",GRED,BLUE ,16,0);可以正常显示字母。
百度查找很多地方,说是关于指针的问题,只是我没看懂,想问一下大佬们怎么改
以下是LCD_ShowChinese的具体内容,望大佬们指点

/******************************************************************************
      函数说明:显示汉字串
      入口数据:x,y显示坐标
                *s 要显示的汉字串
                fc 字的颜色
                bc 字的背景色
                sizey 字号 可选 16 24 32
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        while(*s!=0)
        {
                if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
                else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
                else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
                else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
                else return;
                s+=2;
                x+=sizey;
        }
}


/******************************************************************************
      函数说明:显示单个12x12汉字
      入口数据:x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j,m=0;
        u16 k;
        u16 HZnum;//汉字数目
        u16 TypefaceNum;//一个字符所占字节大小
        u16 x0=x;
        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
                                 
        HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);        //统计汉字数目
        for(k=0;k<HZnum;k++)
        {
                if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//非叠加方式
                                        {
                                                if(tfont12[k].Msk[ i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                        m=0;
                                                        break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont12[k].Msk[ i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
        }
}


/******************************************************************************
      函数说明:显示单个16x16汉字
      入口数据:x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j,m=0;
        u16 k;
        u16 HZnum;//汉字数目
        u16 TypefaceNum;//一个字符所占字节大小
        u16 x0=x;
  TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
        HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);        //统计汉字数目
        for(k=0;k<HZnum;k++)
        {
                if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//非叠加方式
                                        {
                                                if(tfont16[k].Msk[ i]&(0x01<<j))LCD_WR_DATA(fc);[ i]
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                        m=0;
                                                        break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont16[k].Msk[ i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点[ i]
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
        }
}




/******************************************************************************
      函数说明:显示单个24x24汉字
      入口数据:x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j,m=0;
        u16 k;
        u16 HZnum;//汉字数目
        u16 TypefaceNum;//一个字符所占字节大小
        u16 x0=x;
        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
        HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);        //统计汉字数目
        for(k=0;k<HZnum;k++)
        {
                if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//非叠加方式
                                        {
                                                if(tfont24[k].Msk[ i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                        m=0;
                                                        break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont24[k].Msk[ i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
        }
}


/******************************************************************************
      函数说明:显示单个32x32汉字
      入口数据:x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值:  无
******************************************************************************/
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
        u8 i,j,m=0;
        u16 k;
        u16 HZnum;//汉字数目
        u16 TypefaceNum;//一个字符所占字节大小
        u16 x0=x;
        TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
        HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);        //统计汉字数目
        for(k=0;k<HZnum;k++)
        {
                if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
                {         
                        LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
                        for(i=0;i<TypefaceNum;i++)
                        {
                                for(j=0;j<8;j++)
                                {        
                                        if(!mode)//非叠加方式
                                        {
                                                if(tfont32[k].Msk[ i]&(0x01<<j))LCD_WR_DATA(fc);
                                                else LCD_WR_DATA(bc);
                                                m++;
                                                if(m%sizey==0)
                                                {
                                                        m=0;
                                                        break;
                                                }
                                        }
                                        else//叠加方式
                                        {
                                                if(tfont32[k].Msk[ i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
                                                x++;
                                                if((x-x0)==sizey)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }                                          
                continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
        }
}



};


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:458247 发表于 2024-1-16 08:58 | 只看该作者
你用的keil?中文编码格式用的是GB2312吗?typFNT_GB16这个结构体类型定义的可能存在问题,在这个单片机编译器上不能这么写
回复

使用道具 举报

板凳
ID:551154 发表于 2024-1-16 18:53 | 只看该作者
yzw846562238 发表于 2024-1-16 08:58
你用的keil?中文编码格式用的是GB2312吗?typFNT_GB16这个结构体类型定义的可能存在问题,在这个单片机编译 ...

是GB2312,我需要修改成UTF-8吗,大佬经验好丰富,一眼就看出来是GB2312编码格式了,麻烦大佬细说一下,我还是没明白应该怎么修改
回复

使用道具 举报

地板
ID:551154 发表于 2024-1-16 21:18 | 只看该作者
yzw846562238 发表于 2024-1-16 08:58
你用的keil?中文编码格式用的是GB2312吗?typFNT_GB16这个结构体类型定义的可能存在问题,在这个单片机编译 ...

忘了加代码了,那个结构体是这样的
typedef struct
{
        unsigned char Index[2];       
        unsigned char Msk[32];
}typFNT_GB16;


const typFNT_GB16 tfont16[]={
"中",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,
0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,/*"中",0*/
"景",0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0xFF,0x7F,0x00,0x00,
0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,0x80,0x00,0x84,0x10,0xA2,0x20,0x40,0x00,/*"景",1*/
"园",0x00,0x00,0xFE,0x3F,0x02,0x20,0xF2,0x27,0x02,0x20,0x02,0x20,0xFA,0x2F,0x22,0x21,
0x22,0x21,0x22,0x21,0x12,0x29,0x12,0x29,0x0A,0x2E,0x02,0x20,0xFE,0x3F,0x02,0x20,/*"园",2*/
"电",0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,
0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x50,0x80,0x40,0x80,0x40,0x00,0x7F,/*"电",3*/
"子",0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"子",4*/

};
回复

使用道具 举报

5#
ID:458247 发表于 2024-1-17 13:00 | 只看该作者
forcexda 发表于 2024-1-16 21:18
忘了加代码了,那个结构体是这样的
typedef struct
{

是keil么,还是其他ide,代码看着没啥问题,要不把工程打包发上来看看?
回复

使用道具 举报

6#
ID:458247 发表于 2024-1-17 13:01 | 只看该作者
forcexda 发表于 2024-1-16 21:18
忘了加代码了,那个结构体是这样的
typedef struct
{

"unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,

感觉是你的中文被解析成了4字节,其实gb2312应该是2字节的。
回复

使用道具 举报

7#
ID:551154 发表于 2024-1-17 19:36 | 只看该作者
yzw846562238 发表于 2024-1-17 13:01
"unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10 ...

代码我打包上传了,麻烦大佬帮我看看,ide用的是keil,版本5.23

BLE.7z

464.4 KB, 下载次数: 4

回复

使用道具 举报

8#
ID:551154 发表于 2024-1-17 20:22 | 只看该作者
yzw846562238 发表于 2024-1-17 13:01
"unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10 ...

大佬,我顺着你的思路,把unsigned char Index[2];        改成char Index[4];居然编译通过了,然后正常显示字符,但是我还是没明白为什么[笑哭],大佬你看一下代码,给我指点一下吧
回复

使用道具 举报

9#
ID:551154 发表于 2024-1-17 20:33 | 只看该作者
yzw846562238 发表于 2024-1-17 13:01
"unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10 ...

刚才发现,也有gb2312的锅,必须把gb2312改成utff-8,不然字符不显示,大佬这个字符编码有没有万金油的那种,就是所有的字符都可以用的那种【捂脸哭】,有点打脑阔
回复

使用道具 举报

10#
ID:551154 发表于 2024-1-17 20:56 | 只看该作者
yzw846562238 发表于 2024-1-17 13:01
"unsigned char [2]"
  "???",0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10 ...

似乎不行,虽然可以显示了,但是显示还是不算正常,无法正确显示字符间距
回复

使用道具 举报

11#
ID:384109 发表于 2024-1-18 10:55 | 只看该作者
好好参考一下原来的例程吧,感觉你把汉字显示部分自己改复杂了
回复

使用道具 举报

12#
ID:551154 发表于 2024-1-18 11:20 | 只看该作者
人中狼 发表于 2024-1-18 10:55
好好参考一下原来的例程吧,感觉你把汉字显示部分自己改复杂了

没有哦,这里只做了移植,没有改过汉字部分的代码
回复

使用道具 举报

13#
ID:458247 发表于 2024-1-18 13:57 | 只看该作者
forcexda 发表于 2024-1-17 19:36
代码我打包上传了,麻烦大佬帮我看看,ide用的是keil,版本5.23

容我看看
回复

使用道具 举报

14#
ID:458247 发表于 2024-1-18 14:14 | 只看该作者
测试中文的时候,不要刷图片、其他文字。不然你分不清是谁的问题。然后文字编码格式要改成GB2312的,因为utf-8是三个字节的,跟你这个代码没法兼容。

BLE.7z

1.72 MB, 下载次数: 2

回复

使用道具 举报

15#
ID:551154 发表于 2024-1-18 15:16 | 只看该作者
yzw846562238 发表于 2024-1-18 14:14
测试中文的时候,不要刷图片、其他文字。不然你分不清是谁的问题。然后文字编码格式要改成GB2312的,因为ut ...

不刷图片和其他文字的话,字符出来还是有问题,主要是间距问题
回复

使用道具 举报

16#
ID:458247 发表于 2024-1-18 15:31 | 只看该作者
forcexda 发表于 2024-1-18 15:16
不刷图片和其他文字的话,字符出来还是有问题,主要是间距问题

拍个效果图看看,我看代码没看出有啥问题。另外你用utf-8的话,应该是无法显示才对啊
回复

使用道具 举报

17#
ID:551154 发表于 2024-1-18 19:15 | 只看该作者
yzw846562238 发表于 2024-1-18 15:31
拍个效果图看看,我看代码没看出有啥问题。另外你用utf-8的话,应该是无法显示才对啊


上图是gb2312的运行情况,什么字符都不显示


这两个是utf-8下的运行情况,能显示字符,但是字符间距不对,且显示也不正常,应该显示中景园三个字,结果只显示中园两个字

需要注意的是,如果在gb2312下改为utf-8,字符可以正常显示后,再改回gb2312,字符又可以显示,但是显示依然不正常

应该是和unsigned char index[2]变更成unsigned char index[4]有关系,但是原来的汉字显示我还是不太清楚应该如何修改,大佬可以%探讨一下吗

回复

使用道具 举报

18#
ID:458247 发表于 2024-1-19 08:38 | 只看该作者
forcexda 发表于 2024-1-18 19:15
上图是gb2312的运行情况,什么字符都不显示

你改成GB2312,把project清空一遍,中文重新打一遍,然后重新编译下载,有stlink的话,最好是仿真看看哪一步出了问题
回复

使用道具 举报

19#
ID:384109 发表于 2024-1-19 18:51 | 只看该作者
感觉还是你选的例程的问题,你选的例程是从外部字库芯片取字体数据,并不适合你现在这种字库的调用方式
回复

使用道具 举报

20#
ID:551154 发表于 2024-1-20 22:05 | 只看该作者
人中狼 发表于 2024-1-19 18:51
感觉还是你选的例程的问题,你选的例程是从外部字库芯片取字体数据,并不适合你现在这种字库的调用方式

可是这个例程的字库是调用存在rom里的字库,不是外部字库,根本没有flash,我在stm32最小系统板上尝试过是正常的
回复

使用道具 举报

21#
ID:384109 发表于 2024-1-21 09:27 | 只看该作者
你这里不同字号用了不同的函数,那么字体的字节数就固定了,但函数里确还要计算字节数,既然调试有问题,就把函数尽量简化吧
回复

使用道具 举报

22#
ID:458247 发表于 2024-1-22 13:06 | 只看该作者
forcexda 发表于 2024-1-20 22:05
可是这个例程的字库是调用存在rom里的字库,不是外部字库,根本没有flash,我在stm32最小系统板上尝试过 ...

还没成功么
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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