请教点阵液晶上要如何实现:DpyHanZi("你好中国\r")

[复制链接]
 楼主| Wxy8030 发表于 2024-8-22 21:48 | 显示全部楼层 |阅读模式
点阵液晶,不自带字库,程序里用 PcToLcd 工具shi实现点阵字库,现在我要显示汉字时,能否一条语句直接实现,比如:
    DpyHanZi("你好中国\r")    //子程序显示汉字、直到 \r 结束

貌似C语言里不能直接定义汉字,比如:
#define  你   0x02     //会报错

哪位大侠直到?
LcwSwust 发表于 2024-8-23 08:40 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-8-23 08:48 编辑

一些关键的代码,调用 GUI_PutStr("设置"); 即可:
  1. //两字节合并16位
  2. #define MAKE16(hi,lo) (((U16)(hi)<<8)|(U8)(lo))
  3. //求数组元素个数
  4. #define ARRLEN(arr) (sizeof(arr)/sizeof(arr[0]))
  5. //--------------------------------------------------
  6. //                显示一个汉字或英文
  7. //--------------------------------------------------
  8. void GUI_PutChar(U16 asc)
  9. {
  10.         U8 w,h,i;
  11.         U16 id;
  12.         U8* p;
  13.         if(asc>0xA0A0)//汉字,16*16
  14.         {
  15.                 for(i=0;i<ARRLEN(CH16x16_tab);i++)//搜索汉字
  16.                 {
  17.                         id=MAKE16(CH16x16_tab[i].id[0],CH16x16_tab[i].id[1]);
  18.                         if(asc==id)
  19.                         {
  20.                                 w=16;//pGUIFont->Width*2;//两个字符宽
  21.                                 h=16;//pGUIFont->Height;       
  22.                                 p=(U8*)CH16x16_tab[i].buf;//字库
  23.                                 GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//指定位置显示图片
  24.                                 break;
  25.                         }
  26.                 }
  27.                 GUI_Px+=16;
  28.         }
  29.         else//英文
  30.         {
  31.                 if(asc < pGUIFont->AscFirst)return;
  32.                 if(asc > pGUIFont->AscLast)return;
  33.                 w=pGUIFont->Width;
  34.                 h=pGUIFont->Height;       
  35.                 p=pGUIFont->lib;
  36.                 p+=(asc-pGUIFont->AscFirst)* pGUIFont->BPC * pGUIFont->Width;//找到字母所在的地址
  37.                 GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//指定位置显示图片
  38.                 GUI_Px+=pGUIFont->Width;
  39.         }
  40. }
  41. //--------------------------------------------------
  42. //                输出字符串
  43. //--------------------------------------------------
  44. void GUI_PutStr(U8* s)
  45. {
  46.         static U8 c0=0;
  47.         while(*s)
  48.         {
  49.                 if(*s<0xa0)
  50.                 {
  51.                         GUI_PutChar(*s);//GAL_TextInRect(hdc, dst, *c, x, y);
  52.                         c0=0;
  53.                 }
  54.                 else
  55.                 {
  56.                         if(c0>=0xa0)//上一字节是中文
  57.                         {
  58.                                 GUI_PutChar(MAKE16(c0,*s));//取两个字符
  59.                                 c0=0;
  60.                         }
  61.                         else
  62.                         {
  63.                                 c0=*s;
  64.                         }
  65.                 }
  66.                 s++;
  67.         }
  68. }
  69. //定义结构体类型
  70. #define CLASS(name_)  typedef struct name_ name_;struct name_
  71. //汉字库
  72. CLASS(CH16x16)
  73. {
  74.         U8 id[2];
  75.         U8 buf[16*16/8];
  76. };
  77. //汉字点阵
  78. const CH16x16 CH16x16_tab[]={
  79. "设",
  80. 0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
  81. 0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,//"设",0
  82. "置",
  83. 0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,
  84. 0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,//"置",1
  85. };
复制代码


咕咕呱呱孤寡 发表于 2024-8-23 08:50 | 显示全部楼层
用点阵位置对应的数组不知道行不行呢
王栋春 发表于 2024-8-23 09:12 | 显示全部楼层
这个问题不妨借鉴一下相关字符显示的程序,有针对性的改一下即可。
xionghaoyun 发表于 2024-8-23 11:48 | 显示全部楼层
是不是要汉字转点阵
ayb_ice 发表于 2024-8-23 16:48 | 显示全部楼层
做一个小的字库,需要显示什么汉字,添加库里面,然后显示字符串就可以了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
飞思啦 发表于 2024-8-23 17:20 | 显示全部楼层
点阵显示,类似数码管点亮不同的二极管来实现显示不同的数字,汉字、英文字母,甚至是图片(二维的),都可以用点阵显示的方式显示出来
 楼主| Wxy8030 发表于 2024-8-23 20:52 | 显示全部楼层
LcwSwust 发表于 2024-8-23 08:40
一些关键的代码,调用 GUI_PutStr("设置"); 即可:

这种方法确实可以,但我不喜欢用搜索的方法、效率低(按说现在的单片机速度很快不用在乎这点效率,纯强迫症)
 楼主| Wxy8030 发表于 2024-8-23 20:57 | 显示全部楼层
ayb_ice 发表于 2024-8-23 16:48
做一个小的字库,需要显示什么汉字,添加库里面,然后显示字符串就可以了

能细说吗?

我要达到的目的就很简单,应用层要显示汉字时,直接一条语句:DpyHanZi("你好中国\r"); 简单直接清晰明了而且不会出错!

之前连续显示多个汉字时,都是:
v_Buf[0]=0x01;  //“你”字的点阵编码
v_Buf[1]=0x02;  //“好”字的点阵编码
v_Buf[2]=0x03;  //“中”字的点阵编码
v_Buf[3]=0x04;  //“国”字的点阵编码
DpyHanZ(v_Buf,4);

这种方法啰嗦又不直观!
xcodes 发表于 2024-8-24 11:17 | 显示全部楼层
第一步定义字库
const uint8_t  HANZI_TAB16[][16]=
{       
  {0x00,0x00,0x20,0x13,0x0A,0x02,0x42,0x23,0x0A,0x0A,0x12,0x12,0x24,0x24,0x0B,0x00},
  {0x00,0x20,0x20,0xFC,0x24,0x24,0x20,0xF8,0x88,0x88,0x48,0x50,0x20,0xD0,0x0C,0x00},/*"波",0*/
  {0x00,0x00,0x27,0x14,0x05,0x45,0x25,0x05,0x15,0x15,0x21,0x22,0x42,0x44,0x08,0x00},
  {0x00,0x04,0xC4,0x44,0x54,0x54,0x54,0x54,0x54,0x54,0x14,0x84,0x44,0x44,0x1C,0x00},/*"测",0*/
  {0x00,0x01,0x01,0x7F,0x05,0x09,0x11,0x60,0x1F,0x10,0x1F,0x10,0x1F,0x00,0x7F,0x00},
  {0x00,0x00,0x00,0xFC,0x40,0x20,0x10,0x0C,0xF0,0x10,0xF0,0x10,0xF0,0x00,0xFC,0x00},/*"查",0*/
  {0x00,0x00,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00},
  {0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"厂",0*/
  {0x00,0x01,0x21,0x21,0x21,0x21,0x3F,0x01,0x01,0x41,0x41,0x41,0x41,0x7F,0x00,0x00},
  {0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x00},/*"出",0*/
  {0x00,0x00,0x78,0x48,0x49,0x52,0x55,0x48,0x48,0x4B,0x48,0x72,0x42,0x44,0x41,0x00},
  {0x00,0x40,0x40,0xA0,0x10,0x08,0xF4,0x40,0x40,0xF8,0x40,0x48,0x44,0x44,0xC0,0x00},/*"除",0*/
  {0x00,0x10,0x10,0x12,0x12,0x7A,0x17,0x12,0x12,0x12,0x12,0x1A,0x62,0x02,0x01,0x00},
  {0x00,0x40,0x40,0x48,0x58,0xE8,0x48,0x48,0x48,0x48,0x58,0x40,0x04,0x04,0xFC,0x00},/*"地",0*/
  {0x00,0x02,0x02,0x03,0x02,0x02,0x1F,0x10,0x10,0x10,0x1F,0x00,0x24,0x22,0x42,0x00},
.....
};
//第二步字库做成字典
const uint8_t HZ_DIC[]=
{
"波测查厂出除地点动度断分"
"复关合恢记加间降接开看控"
"录路率明期器清热日设湿时"
"手特通温无线信照值址制置"
"自报警结节远程"
};
//第三 实现从字库查找 字符
void GUI_ShowChanese(uint8_t x,uint8_t y,uint8_t Mode,uint16_t GBK,uint8_t Char_Size)
{       
        uint16_t N=0x00;
        uint16_t GBKTmp;
        const uint8_t *pDat;
        pDat=HZ_DIC;
        while(*pDat)
        {       
                GBKTmp=*pDat++;
                GBKTmp<<=8;
                GBKTmp|=*pDat++;
                if(GBKTmp==GBK)break;
                N+=2;
        }
  pDat=&HANZI_TAB16[N][0];
  GUI_PutHZ(x,y,(uint8_t *)pDat,8,16);//显示另一半
  pDat=&HANZI_TAB16[N+1][0];
  GUI_PutHZ(x+8,y,(uint8_t *)pDat,8,16);//显示另一半
}


void GUI_ShowString(uint8_t x,uint8_t y,uint8_t Mode,const uint8_t *str,uint8_t Char_Size)
{
        uint16_t GBK;

  if(Mode)GUI_SetColor(1,0);
  else GUI_SetColor(0,1);
        while (*str!='\0')
        {       
                if((*str>=' ')&&(*str<0x80))
                {
                        GUI_ShowChar(x,y,Mode,*str++,Char_Size);//显示字母
      if(Char_Size==0x0C)x+=6;
      else x+=0x08;      
                }
                if(*str>=0xA0)
                {
                        GBK=*str++;
                        GBK<<=8;
                        GBK|=*str++;
                        GUI_ShowChanese(x,y,Mode,GBK,Char_Size);//显示汉字
                        x+=Char_Size;
                }   
   
#ifdef  __SWAP__XY__
  if(x>=GUI_LCM_YMAX)x=0,y+=Char_Size;
  if(y>=GUI_LCM_XMAX)x=0,y=0;
#else
          if(x>=GUI_LCM_XMAX)x=0,y+=Char_Size;
    if(y>=GUI_LCM_YMAX)x=0,y=0;
#endif

        }
  
}

最后在你需要的地方调用 void GUI_ShowString(uint8_t x,uint8_t y,uint8_t Mode,const uint8_t *str,uint8_t Char_Size)
就行了 例如
GUI_ShowString(0,8,1,“hi,你好中国",16);
ayb_ice 发表于 2024-8-26 08:36 | 显示全部楼层
Wxy8030 发表于 2024-8-23 20:57
能细说吗?

我要达到的目的就很简单,应用层要显示汉字时,直接一条语句:DpyHanZi("你好中国\r"); 简单 ...

一个汉字是16位编码,两个字节,显示时取出待显示的汉字编码(组合成一个16位的数),与字库里的ID一一比对,如果编码相同,就显示对应的字库数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

2258

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部