打印

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

[复制链接]
1212|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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("设置"); 即可:
//两字节合并16位
#define MAKE16(hi,lo) (((U16)(hi)<<8)|(U8)(lo))
//求数组元素个数
#define ARRLEN(arr) (sizeof(arr)/sizeof(arr[0]))
//--------------------------------------------------
//                显示一个汉字或英文
//--------------------------------------------------
void GUI_PutChar(U16 asc)
{
        U8 w,h,i;
        U16 id;
        U8* p;
        if(asc>0xA0A0)//汉字,16*16
        {
                for(i=0;i<ARRLEN(CH16x16_tab);i++)//搜索汉字
                {
                        id=MAKE16(CH16x16_tab[i].id[0],CH16x16_tab[i].id[1]);
                        if(asc==id)
                        {
                                w=16;//pGUIFont->Width*2;//两个字符宽
                                h=16;//pGUIFont->Height;       
                                p=(U8*)CH16x16_tab[i].buf;//字库
                                GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//指定位置显示图片
                                break;
                        }
                }
                GUI_Px+=16;
        }
        else//英文
        {
                if(asc < pGUIFont->AscFirst)return;
                if(asc > pGUIFont->AscLast)return;
                w=pGUIFont->Width;
                h=pGUIFont->Height;       
                p=pGUIFont->lib;
                p+=(asc-pGUIFont->AscFirst)* pGUIFont->BPC * pGUIFont->Width;//找到字母所在的地址
                GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//指定位置显示图片
                GUI_Px+=pGUIFont->Width;
        }
}
//--------------------------------------------------
//                输出字符串
//--------------------------------------------------
void GUI_PutStr(U8* s)
{
        static U8 c0=0;
        while(*s)
        {
                if(*s<0xa0)
                {
                        GUI_PutChar(*s);//GAL_TextInRect(hdc, dst, *c, x, y);
                        c0=0;
                }
                else
                {
                        if(c0>=0xa0)//上一字节是中文
                        {
                                GUI_PutChar(MAKE16(c0,*s));//取两个字符
                                c0=0;
                        }
                        else
                        {
                                c0=*s;
                        }
                }
                s++;
        }
}
//定义结构体类型
#define CLASS(name_)  typedef struct name_ name_;struct name_
//汉字库
CLASS(CH16x16)
{
        U8 id[2];
        U8 buf[16*16/8];
};
//汉字点阵
const CH16x16 CH16x16_tab[]={
"设",
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,//"设",0
"置",
0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,
0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,//"置",1
};


使用特权

评论回复
板凳
咕咕呱呱孤寡| | 2024-8-23 08:50 | 只看该作者
用点阵位置对应的数组不知道行不行呢

使用特权

评论回复
地板
王栋春| | 2024-8-23 09:12 | 只看该作者
这个问题不妨借鉴一下相关字符显示的程序,有针对性的改一下即可。

使用特权

评论回复
5
xionghaoyun| | 2024-8-23 11:48 | 只看该作者
是不是要汉字转点阵

使用特权

评论回复
6
ayb_ice| | 2024-8-23 16:48 | 只看该作者
做一个小的字库,需要显示什么汉字,添加库里面,然后显示字符串就可以了

使用特权

评论回复
7
飞思啦| | 2024-8-23 17:20 | 只看该作者
点阵显示,类似数码管点亮不同的二极管来实现显示不同的数字,汉字、英文字母,甚至是图片(二维的),都可以用点阵显示的方式显示出来

使用特权

评论回复
8
Wxy8030|  楼主 | 2024-8-23 20:52 | 只看该作者
LcwSwust 发表于 2024-8-23 08:40
一些关键的代码,调用 GUI_PutStr("设置"); 即可:

这种方法确实可以,但我不喜欢用搜索的方法、效率低(按说现在的单片机速度很快不用在乎这点效率,纯强迫症)

使用特权

评论回复
9
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);

这种方法啰嗦又不直观!

使用特权

评论回复
10
丙丁先生| | 2024-8-24 09:22 | 只看该作者
在C语言中,不能直接定义汉字。但是,你可以使用字符数组来存储汉字的点阵信息,然后通过循环遍历数组来显示汉字。以下是一个示例:

```c
#include <stdio.h>

// 假设你已经使用 PcToLcd 工具生成了汉字 "你好中国" 的点阵数据,并将其存储在以下数组中
unsigned char you[][8] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    // ...其他行的数据...
};

unsigned char ni[][8] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    // ...其他行的数据...
};

unsigned char wo[][8] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    // ...其他行的数据...
};

unsigned char guo[][8] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    // ...其他行的数据...
};

void DpyHanZi(char *str) {
    while (*str != '\r') {
        switch (*str) {
            case '你':
                // 显示 "你" 字的点阵数据
                for (int i = 0; i < 8; i++) {
                    printf("%s", you[i]);
                }
                break;
            case '好':
                // 显示 "好" 字的点阵数据
                for (int i = 0; i < 8; i++) {
                    printf("%s", ni[i]);
                }
                break;
            case '中':
                // 显示 "中" 字的点阵数据
                for (int i = 0; i < 8; i++) {
                    printf("%s", wo[i]);
                }
                break;
            case '国':
                // 显示 "国" 字的点阵数据
                for (int i = 0; i < 8; i++) {
                    printf("%s", guo[i]);
                }
                break;
        }
        str++;
    }
}

int main() {
    DpyHanZi("你好中国\r");
    return 0;
}
```

请注意,这个示例仅用于演示目的,你需要根据实际情况修改代码以适应你的硬件和库。

使用特权

评论回复
11
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);

使用特权

评论回复
12
ayb_ice| | 2024-8-26 08:36 | 只看该作者
Wxy8030 发表于 2024-8-23 20:57
能细说吗?

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

一个汉字是16位编码,两个字节,显示时取出待显示的汉字编码(组合成一个16位的数),与字库里的ID一一比对,如果编码相同,就显示对应的字库数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

2089

帖子

2

粉丝