找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自建24点阵数字字库显示不正常

[复制链接]
跳转到指定楼层
楼主
ID:570252 发表于 2024-5-25 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,

前些天在用LCD0802做频率计,总觉得显示不好看,想改用12864(12832比较难买)。碰到的问题是用16点阵字体太小,一屏四行也用不完,想改成24点阵的。用PCTOLCD2000建了只0-9再加上小数点的小字库,如下:
const unsigned char code F12X24[][36]=         
{
{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04},
{0x00,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F},
{0x80,0x00,0x00,0x00},/*"0",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x03},
{0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00},
{0x00,0x00,0x00,0x00},/*"1",1*/
{0x00,0x00,0x00,0x01,0xC0,0x18,0x02,0xC0,0x38,0x04,0x00,0x48,0x04,0x00,0x88,0x04},
{0x03,0x08,0x04,0x06,0x08,0x06,0x0C,0x08,0x03,0xF8,0x08,0x01,0xE0,0x78,0x00,0x00},
{0x00,0x00,0x00,0x00},/*"2",2*/
{0x00,0x00,0x00,0x03,0x80,0x70,0x03,0x80,0x70,0x04,0x00,0x08,0x04,0x08,0x08,0x04},
{0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00},
{0x00,0x00,0x00,0x00},/*"3",3*/
{0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x05,0x00,0x00,0x19,0x00,0x00,0x21,0x00,0x00},
{0xC1,0x08,0x01,0x01,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x01,0x08,0x00,0x01},
{0x08,0x00,0x01,0x00},/*"4",4*/
{0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xFC,0xD0,0x04,0x08,0x08,0x04,0x10,0x08,0x04},
{0x10,0x08,0x04,0x10,0x08,0x04,0x18,0x38,0x04,0x0F,0xF0,0x04,0x07,0xC0,0x00,0x00},
{0x00,0x00,0x00,0x00},/*"5",5*/
{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x84,0x30,0x02,0x08,0x18,0x04},
{0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x07,0x18,0x10,0x03,0x0F,0xF0,0x00,0x07},
{0xC0,0x00,0x00,0x00},/*"6",6*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x06,0x00,0x00,0x04,0x00,0x00,0x04},
{0x00,0xF8,0x04,0x07,0xF8,0x04,0x18,0x00,0x04,0xE0,0x00,0x07,0x00,0x00,0x06,0x00},
{0x00,0x00,0x00,0x00},/*"7",7*/
{0x00,0x00,0x00,0x01,0xC1,0xE0,0x03,0xF3,0xF0,0x06,0x36,0x10,0x04,0x18,0x08,0x04},
{0x08,0x08,0x04,0x0C,0x08,0x04,0x0C,0x08,0x06,0x16,0x18,0x03,0xF3,0xF0,0x01,0xC1},
{0xE0,0x00,0x00,0x00},/*"8",8*/
{0x00,0x00,0x00,0x00,0xF8,0x00,0x03,0xFC,0x30,0x03,0x06,0x38,0x04,0x02,0x08,0x04},
{0x02,0x08,0x04,0x02,0x08,0x04,0x04,0x10,0x03,0x08,0xF0,0x01,0xFF,0xC0,0x00,0x7F},
{0x00,0x00,0x00,0x00},/*"9",9*/
};

显示函数如下(24点阵):

else if(Char_Size ==24)
                {
                 c=chr-'/';               
     OLED_Set_Pos(x, y);
        for (i = 0; i < 12; i++)
            OLED_WR_Byte(F12X24[c * 36 + i], OLED_DATA);  //18*2
        OLED_Set_Pos(x, y + 1);
        for (i = 0; i < 12; i++)
            OLED_WR_Byte(F12X24[c * 36 + i +12], OLED_DATA);
            OLED_Set_Pos(x, y + 2);
        for (i = 0; i < 12; i++)
            OLED_WR_Byte(F12X24[c * 36 + i +24], OLED_DATA);

}

其中c=chr-'/'是取偏移后的值。因为小字库的第一位是‘0’,ASC值48,而‘/'是47,48-47=1,正好取首字符。

工作时16点阵正常,但在24点阵时仅能显示24点阵麻点方块,不是所需数字。

我对C语言的底层编程不内行,故特地向各位请教。

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

使用道具 举报

沙发
ID:69038 发表于 2024-5-25 15:03 | 只看该作者
“其中c=chr-'/'是取偏移后的值。因为小字库的第一位是‘0’,ASC值48,而‘/'是47,48-47=1,正好取首字符。”
总感觉哪里不对
回复

使用道具 举报

板凳
ID:570252 发表于 2024-5-25 16:39 | 只看该作者
zhuls 发表于 2024-5-25 15:03
“其中c=chr-'/'是取偏移后的值。因为小字库的第一位是‘0’,ASC值48,而‘/'是47,48-47=1,正好取首字符 ...

你好,谢谢关注。
在一般西文字库里,大都会从 ‘ ’ 开始,即从 ‘ ’ - ‘~’,并按ASCII值排列,因此偏移值要减去 ‘ ’(ASCII值32),即 c=chr-' ’ ,即可得到所需显示字符在字库里的位置。但我的字库里只有11个数字(多了内存不够),所以就自作聪明,减去 ‘/' 字符的ASCII值(47)了。
回复

使用道具 举报

地板
ID:69038 发表于 2024-5-25 17:29 | 只看该作者
bobby_jack 发表于 2024-5-25 16:39
你好,谢谢关注。
在一般西文字库里,大都会从 ‘ ’ 开始,即从 ‘ ’ - ‘~’,并按ASCII值排列,因此 ...

理是这个理,要是显示‘0’时,你-47,能对的上吗?我觉得既然你的小字库是0~9,那么首字当是‘0’,偏移量就应该是‘0’,即0x30,你用这个‘/’(0x2F)做偏移量真的对吗?
  1. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  2. {              
  3.         unsigned char c=0,i=0;        
  4. <font color="#ff0000">                c=chr-' ';//得到偏移后的值  //字库从' '空格开始,偏移量就该是‘ ’空格的ASC码</font>
  5.                 if(x>Max_Column-1){x=0;y=y+2;}
  6.                 if(SIZE ==16)
  7.                         {
  8.                         OLED_Set_Pos(x,y);        
  9.                         for(i=0;i<8;i++)
  10.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11.                         OLED_Set_Pos(x,y+1);
  12.                         for(i=0;i<8;i++)
  13.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14.                         }
  15.                         else {        
  16.                                 OLED_Set_Pos(x,y+1);
  17.                                 for(i=0;i<6;i++)
  18.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19.                                 
  20.                         }
  21. }
复制代码


//常用ASCII表
//偏移量32
const unsigned char code F8X16[]=

回复

使用道具 举报

5#
ID:570252 发表于 2024-5-25 22:17 | 只看该作者
zhuls 发表于 2024-5-25 17:29
理是这个理,要是显示‘0’时,你-47,能对的上吗?我觉得既然你的小字库是0~9,那么首字当是‘0’,偏移 ...

你好,谢谢再次支招。

问题已经解决,主要有三点:

第一即是如你所说的应该改去‘0’,因为C语言都是从0开始计数,而我忽略了。

第二是调用函数有误。它是从网上摘录下来的,估计发布者也没有对此验证。正确的写法应该是:
  1.                 else if(Char_Size ==24)
  2.                 {
  3.           if(x>Max_Column-1){x=0;y=y+2;}
  4.                  c=chr-'0';               
  5.      OLED_Set_Pos(x, y);
  6.         for (i = 0; i < 12; i++)
  7.             OLED_WR_Byte(F12X24[c] [i], OLED_DATA);  
  8.         OLED_Set_Pos(x, y + 1);
  9.         for (i = 0; i < 12; i++)
  10.             OLED_WR_Byte(F12X24[c] [i +12], OLED_DATA);
  11.             OLED_Set_Pos(x, y + 2);
  12.         for (i = 0; i < 12; i++)
  13.             OLED_WR_Byte(F12X24[c] [i +24], OLED_DATA);

  14.                 }
复制代码

即F12X24本身是二维的,而在原程序调用时写成一维。

第三是pctolcd取模时在正向,而我用反了。

再次谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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