[STM32] T6963C 240*128如何显示9行汉字

[复制链接]
2114|16
 楼主| Cjy_JDxy 发表于 2020-6-10 15:02 | 显示全部楼层 |阅读模式

如上图参数设定,一共9行文字,每行都有汉字。
T6963C选的是240*128,16*16的汉字只能显示8行。
若要显示9行,那么需要小的字模,可是我不知道如何显示。
请高手指点思路,谢谢!

本帖子中包含更多资源

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

×
LcwSwust 发表于 2020-6-10 15:21 | 显示全部楼层
https://bbs.21ic.com/icview-1008978-1-1.html
其实,先写一个在任意位置显示任意大小的图片的函数,然后把汉字当成图片来显示就行了。
 楼主| Cjy_JDxy 发表于 2020-6-10 16:52 | 显示全部楼层
LcwSwust 发表于 2020-6-10 15:21
https://bbs.21ic.com/icview-1008978-1-1.html
其实,先写一个在任意位置显示任意大小的图片的函数,然后 ...


谢谢!现在可以显示9行了。但是每个汉字横向距离太远,有什么办法让它们近一些,可以每行多显示几个汉字。

本帖子中包含更多资源

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

×
LcwSwust 发表于 2020-6-10 17:00 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-10 16:52
谢谢!现在可以显示9行了。但是每个汉字横向距离太远,有什么办法让它们近一些,可以每行多显示几个汉字 ...

这算问题吗?我不能理解。
 楼主| Cjy_JDxy 发表于 2020-6-10 17:31 | 显示全部楼层
LcwSwust 发表于 2020-6-10 17:00
这算问题吗?我不能理解。


你看这个图,破型起限那一行显示不开,不好看。

本帖子中包含更多资源

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

×
LcwSwust 发表于 2020-6-10 21:34 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-10 17:31
你看这个图,破型起限那一行显示不开,不好看。

显示文字的X座标是怎么控制的?
ningling_21 发表于 2020-6-10 21:41 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-10 16:52
谢谢!现在可以显示9行了。但是每个汉字横向距离太远,有什么办法让它们近一些,可以每行多显示几个汉字 ...

控制汉字的起始左标
 楼主| Cjy_JDxy 发表于 2020-6-11 07:54 | 显示全部楼层
LcwSwust 发表于 2020-6-10 21:34
显示文字的X座标是怎么控制的?

第一个字X 0
第二个字X 2
LcwSwust 发表于 2020-6-11 08:21 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-11 07:54
第一个字X 0
第二个字X 2

哦,不是图形模式啊,那我就不知道了。
我的习惯是在图形模式下把文字当图片处理,想显示到哪里就显示到哪里。
 楼主| Cjy_JDxy 发表于 2020-6-11 08:33 | 显示全部楼层
LcwSwust 发表于 2020-6-11 08:21
哦,不是图形模式啊,那我就不知道了。
我的习惯是在图形模式下把文字当图片处理,想显示到哪里就显示到 ...

是在图形模式。搞不清楚你怎么当图片处理,字模是一个一个的。你能给个例子吗?谢谢
LcwSwust 发表于 2020-6-11 10:00 | 显示全部楼层
Cjy_JDxy 发表于 2020-6-11 08:33
是在图形模式。搞不清楚你怎么当图片处理,字模是一个一个的。你能给个例子吗?谢谢 ...

若是16*16点的汉字,x座标在显示一个汉字之后应该是加16,不知你用多大的字?x加的多少?
我的思路一般是在内存中绘图然后整体刷新到显示屏。
绘图函数:
  1. //-------------------------------------------------------
  2. //绘图
  3. //x,y为座标,w为宽度,h为高度,buf为数据
  4. //m 为模式:B0:0正常,1取反,B2&B1:00正常,01:OR,10:AND,11:XOR
  5. //-------------------------------------------------------
  6. void GUI_DrawPic(S16 x0,S16 y0,S16 w,S16 h,U8 m,U8* buf)
  7. {
  8.         S16 x,y,bs,px=0,dx=0,dw,m1,n=0;
  9.         U16 temp;
  10.         U16 ps;
  11.         dw=(w+7)>>3;//图像数组横向占用的字节数
  12.         //一个横向16位里可能有3个字节
  13.         px=x0&0x07;//x方向的偏移(余数)
  14.         bs=px;//起始位
  15.         m1=(m>>1)&0x03;//模式
  16.         for(x=x0;(x<x0+w)&&(x<LCD_WIDTH);x++)
  17.         {
  18.                 n++;//显示点数统计
  19.                 if(((x&0x07)==0x07)||((x+1)==(x0+w)||((x+1)==LCD_WIDTH)))//横向8位
  20.                 {
  21.                         for(y=y0;(y<y0+h)&&(y<LCD_HEIGHT);y++)
  22.                         {
  23.                                 ps=y-y0;
  24.                                 ps=ps*dw+dx;//数组中的位置
  25.                                 temp=((U16)buf[ps-1]<<8)|buf[ps];//连续取两个字节
  26.                                 if(m&BIT(0))temp=~temp;//数据取反
  27.                                 //temp=(temp>>px)&((0xff<<(8-n))>>bs);//从bs位开始取n个位
  28.                                 temp=(temp>>px)&((U8)(0xff<<(8-n))>>bs);
  29.                                 //---------------------------对绘图模式的处理->
  30.                                 if((n<8)||(m>0))//小于8位,或在非正常模式,需要读出原位置的数据来处理
  31.                                         ps=GUI_Buf_Read(x>>3,y);//LCD_Read16(x>>4,y);
  32.                                 if(m1==0)//正常
  33.                                 {
  34.                                         if(n<8)
  35.                                         {
  36.                                                 temp=ps&(~((U8)(0xff<<(8-n))>>bs))|temp;
  37.                                                 //将读出的数从bs位开始n个位清0,再或上temp
  38.                                         }
  39.                                 }
  40.                                 else if(m1==1)//OR
  41.                                 {
  42.                                         temp|=ps;
  43.                                 }
  44.                                 else if(m1==2)//AND
  45.                                 {
  46.                                         temp&=ps;
  47.                                 }
  48.                                 else if(m1==3)//XOR
  49.                                 {
  50.                                         temp^=ps;
  51.                                 }
  52.                                 //---------------------------对绘图模式的处理<-
  53.                                 GUI_Buf_Write(x>>3,y,temp);                                
  54.                         }
  55.                         dx++;//数组指向下一个
  56.                         if(n>8)dx++;//数据位多于8个,就要再向下移一个字节
  57.                         px&=0x07;//偏移没那么多了
  58.                         n=0;//数据位清0
  59.                         bs=0;//之后的起始位就为0了
  60.                 }
  61.         }
  62. }


显示汉字:
  1. //--------------------------------------------------
  2. //                显示一个字
  3. //--------------------------------------------------
  4. void GUI_PutChar(U16 asc)
  5. {
  6.         U8 w,h,i;
  7.         U16 id;
  8.         U8* p;
  9.         if(asc>0xA0A0)//汉字,16*16
  10.         {
  11.                 for(i=0;i<ARRLEN(CH16x16_tab);i++)//
  12.                 {
  13.                         id=MAKE16(CH16x16_tab[i].id[0],CH16x16_tab[i].id[1]);
  14.                         if(asc==id)
  15.                         {
  16.                                 w=pGUIFont->Width*2;//两个字符宽
  17.                                 h=pGUIFont->Height;        
  18.                                 p=CH16x16_tab[i].buf;//字库
  19.                                 GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//画图
  20.                                 break;
  21.                         }
  22.                 }
  23.                 GUI_Px+=w;
  24.         }
  25.         else//英文
  26.         {
  27.                 if(asc < pGUIFont->AscFirst)return;
  28.                 if(asc > pGUIFont->AscLast)return;
  29.                 w=pGUIFont->Width;
  30.                 h=pGUIFont->Height;        
  31.                 p=pGUIFont->lib;
  32.                 p+=(asc-pGUIFont->AscFirst)* pGUIFont->BPL * pGUIFont->Height;//找到字母所在的地址
  33.                 GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);
  34.                 GUI_Px+=pGUIFont->Width;
  35.         }
  36. }
 楼主| Cjy_JDxy 发表于 2020-6-11 10:08 | 显示全部楼层
LcwSwust 发表于 2020-6-11 10:00
若是16*16点的汉字,x座标在显示一个汉字之后应该是加16,不知你用多大的字?x加的多少?
我的思路一般是 ...

我用的12*12的x+2
LcwSwust 发表于 2020-6-11 10:10 | 显示全部楼层
本帖最后由 LcwSwust 于 2020-6-11 10:11 编辑

你的x坐标不对应像素点?真奇怪,那么如果想在任意指定位置画一个点怎么办呢?
看来需要横向移位处理了,先在内存中处理好再输出到显示屏。
LcwSwust 发表于 2020-6-11 10:26 | 显示全部楼层
先前11楼的代码应该是纵向8点的屏,
这里还有个横向16点的屏的程序,参考一下:

  1. //-------------------------------------------------------
  2. //        写16位图形数据,将原座标系:x(0~15),y(0~31)变换为x(0~7),y(0~63)
  3. //mode为绘图模式:0:正常,1:或,2:与,3:取反
  4. //-------------------------------------------------------
  5. void LCD_Write16(U8 x,U8 y,U16 d,U8 mode)
  6. {
  7.         idata U16 temp;
  8.         if(x>7)return;
  9.         if(y>63)return;
  10.         if(y>31){y-=32;x+=8;}
  11.         LCD_W_Cmd(BIT(7)+y);//x
  12.         LCD_W_Cmd(BIT(7)+x);//y       
  13.         if(mode)
  14.         {
  15.                 LCD_R_Dat();
  16.                 temp=LCD_R_Dat();
  17.                 temp=(temp<<8)|LCD_R_Dat();//读出数据
  18.                 LCD_W_Cmd(BIT(7)+y);//x
  19.                 LCD_W_Cmd(BIT(7)+x);//y        //读取参数过后地址会改变,需重新设置地址
  20.                 if(mode==1)//or
  21.                         d|=temp;
  22.                 else if(mode==2)//and
  23.                         d&=temp;
  24.                 else if(mode==3)//xor
  25.                         d^=temp;
  26.         }
  27.         LCD_W_Dat(d>>8);
  28.         LCD_W_Dat(d);
  29. }
  30. //-------------------------------------------------------
  31. //        读16位图形数据,将原座标系:x(0~15),y(0~31)变换为x(0~7),y(0~63)
  32. //-------------------------------------------------------
  33. U16 LCD_Read16(U8 x,U8 y)
  34. {
  35.         idata U16 d=0;
  36.         if(x>7)return 0;
  37.         if(y>63)return 0;
  38.         if(y>31){y-=32;x+=8;}
  39.         LCD_W_Cmd(BIT(7)+y);//x
  40.         LCD_W_Cmd(BIT(7)+x);//y       
  41.         LCD_R_Dat();
  42.         d=LCD_R_Dat();
  43.         d=(d<<8)|LCD_R_Dat();//读出数据
  44.         return d;       
  45. }
  46. //-------------------------------------------------------
  47. //绘图
  48. //x,y为座标,w为宽度,h为高度,d为数据
  49. //m 为模式:B0:0正常,1取反,B2&B1:00正常,01:OR,10:AND,11:XOR
  50. //-------------------------------------------------------
  51. void LCD_DrawPic(U8 x0,U8 y0,U8 w,U8 h,U8 m,U8* d)
  52. {
  53.         idata U8 x,y,bs,px=0,dx=0,dw,m1,n=0;
  54.         idata U32 temp;
  55.         idata U16 ps;
  56.         dw=(w+7)>>3;//数组横向字节数
  57.         //一个横向16位里可能有3个字节
  58.         px=x0&0x0f;//x方向的偏移(余数)
  59.         bs=px;//起始位
  60.         m1=(m>>1)&0x03;
  61.         for(x=x0;(x<x0+w)&&(x<128);x++)
  62.         {
  63.                 n++;
  64.                 if(((x&0x0f)==0x0f)||((x+1)==(x0+w)||((x+1)==128)))//横向16位
  65.                 {
  66.                         for(y=y0;(y<y0+h)&&(y<64);y++)
  67.                         {
  68.                                 ps=y-y0;
  69.                                 ps=ps*dw+dx;//数组中的位置
  70.                                 temp=((U32)d[ps-1]<<16)|((U16)d[ps]<<8)|d[ps+1];//连续取三个字节
  71.                                 if(m&BIT(0))temp=~temp;//数据取反
  72.                                 temp=(temp>>px)&((0xffff<<(16-n))>>bs);//从bs位开始取n个位
  73.                                 //---------------------------对绘图模式的处理->
  74.                                 if((n<16)||(m>0))//小于16位,或在非正常模式,需要读出原位置的数据来处理
  75.                                         ps=LCD_Read16(x>>4,y);
  76.                                 if(m1==0)//正常
  77.                                 {
  78.                                         if(n<16)
  79.                                         {
  80.                                                 temp=ps&(~((0xffff<<(16-n))>>bs))|temp;//ps|((0xffff<<(16-n))>>bs)&temp;
  81.                                                 //将读出的数从bs位开始n个位清0,再或上temp
  82.                                         }
  83.                                 }
  84.                                 else if(m1==1)//OR
  85.                                 {
  86.                                         temp|=ps;
  87.                                 }
  88.                                 else if(m1==2)//AND
  89.                                 {
  90.                                         temp&=ps;
  91.                                 }
  92.                                 else if(m1==3)//XOR
  93.                                 {
  94.                                         temp^=ps;
  95.                                 }
  96.                                 //---------------------------对绘图模式的处理<-
  97.                                 LCD_Write16(x>>4,y,temp,0);
  98.                         }
  99.                         dx++;//数组指向下一个
  100.                         if(n>8)dx++;//数据位多于8个,就要再向下移一个字节
  101.                         px&=0x07;//偏移没那么多了
  102.                         n=0;//数据位清0
  103.                         bs=0;//之后的起始位就为0了
  104.                 }
  105.         }
  106. }

打赏榜单

Cjy_JDxy 打赏了 0.10 元 2020-06-11
理由:很给力

LcwSwust 发表于 2020-6-11 13:49 | 显示全部楼层
程序写太多没注意,11楼的绘图函数其实和14楼一样,是横向16位的,以前用过一个型号是HJ12864,
纵向8位的屏是JLX12864,习惯是定义一个与屏大小相同的数组,绘图在数组中处理,然后整体刷新,代码:
  1. //-------------------------------------------------------
  2. //绘图
  3. //x,y为座标,w为宽度,h为高度,d为数据
  4. //m 为模式:B0:0正常,1取反,B2&B1:00正常,01:OR,10:AND,11:XOR
  5. //-------------------------------------------------------
  6. void LCD_DrawPic(S16 x0,S16 y0,S16 w,S16 h,U8 m,U8* d)
  7. {
  8.         idata S16 x,y,y1;
  9.         idata U8 bs,py,n,dh;
  10.         idata U8 temp,bitmask;
  11.         idata U16 ps;//数组中的位置
  12.         //-----------------计算y循环次数
  13.         if(h==0)return;
  14.         if(w==0)return;
  15.         dh=((y0+h-1)>>3)-(y0>>3)+1;//dh=((y0+h-1)>>3)-(y0>>3)+1;               
  16.         py=y0&0x07;        //y方向偏移(取数据时用)
  17.         y1=y0>>3;//y1=y0>>3;        //Y启始位置
  18.         bs=py;                //第一行起始位
  19.         n=8-bs;                //第一行数据位数

  20.         for(y=y1;(y<y1+dh)&&(y<LCD_HEIGHT);y++)//纵向dh次循环
  21.         {                       
  22.                 if(y>=y1+dh-1)//最后一行
  23.                 {
  24.                         if((h+y0)&0x07)
  25.                                 n=n-(8-((h+y0)&0x07));//减去下方空余
  26.                 }
  27.                 bitmask=0xff>>(8-n)<<bs;//从bs开始取n个位
  28.                 for(x=x0;(x<x0+w)&&(x<LCD_WIDTH);x++)//横向绘图
  29.                 {                       
  30.                         ps=(y-y1)*w+(x-x0);//ps*dh+dx;//数组中的位置
  31.                         temp=(d[ps-w]>>(8-py))+(d[ps]<<py);//本行显示上行数据的高位和本行数据的低位
  32.                         if(m&BIT(0))temp=~temp;//数据取反                       
  33.                         temp=temp & bitmask;//从bs开始取n个位
  34.                          //---------------------------对绘图模式的处理->
  35.                         if((n<8)||(m>0))//小于8位,或在非正常模式,需要读出原位置的数据来处理
  36.                                 ps=lcd_buf_read(x,y);//读取液晶屏数据
  37.                         switch(m&0x06)
  38.                         {
  39.                                 case 0://正常
  40.                                         if(n<8)
  41.                                                 temp=ps&(~bitmask)|temp;
  42.                                         break;
  43.                                 case 2://OR
  44.                                         temp|=ps;
  45.                                         break;
  46.                                 case 4://AND
  47.                                         temp=ps&(temp|~bitmask);//只对bitmask为1的位取与
  48.                                         break;
  49.                                 case 6://XOR
  50.                                         temp^=ps;
  51.                                         break;
  52.                         }
  53.                         //---------------------------对绘图模式的处理<-
  54.                         lcd_buf_write(x,y,temp);//LCD_Write16(x>>4,y,temp,0);
  55.                 }               
  56.                 n=8;//从第2行开始为8位数
  57.                 bs=0;//从第2行开始启始位为0
  58.         }
  59. }
wangshujun 发表于 2020-6-12 14:06 | 显示全部楼层
12点的字库会让显示速度慢不少,而且处理不好容易破坏显示的上下行,不到万不得已尽量别用12点阵字库吧,显示效果真的差不少,效率又低
cjseng 发表于 2020-6-12 19:39 | 显示全部楼层
把不需要改变的文字,统一做成一个图片,显示这个图片,然后在上面叠加文字
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

20

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