如何在LCD上显示22号字体

通过调用GB2312字库在LCD上显示22号汉字,但是22号字不能被八整除,该怎么解决?

1.插值算法:可以使用插值算法对22号字的像素进行处理,以填充缺失的像素。常用的插值算法包括双线性插值、双立方插值等。

2.切割算法:可以将22号字切割成多个小块,然后将它们分别显示在LCD上。这种方法虽然可以解决像素显示不整齐的问题,但是可能会导致显示效果的分割线不自然,因此需要根据具体情况进行调整。

3.放大算法:可以对22号字进行放大并增加像素的数量,使其能够被8整除。然后再将处理后的字体显示在LCD上。


在实际应用中,可以根据具体情况选择适合的方法。如果需要高质量的显示效果,可以使用插值算法或切割算法。如果需要快速简单的实现,可以使用放大算法。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/655741
  • 这篇博客也不错, 你可以看下解决9341系列LCD,使用杜邦线等连接线,造成白屏问题
  • 除此之外, 这篇博客: 基于单片机的贪吃蛇游戏设计仿真中的 3.2、根据行列具体点亮或熄灭LCD-12864某一个点 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         由于LCD-12864的点阵点亮是八位DB0~DB7一次性操作一个page,代表一次只能八位一起操作,无法根据某一点的line,column点亮一个点,这里采用了位与或的思想,即根据某一点的line算出此坐标点对应的page中所在的位,后读取这点所在整列的数据与此位进行位或,即可在不改变原始数据的情况下点亮此点,熄灭相似,先对位信息进行取反,后与所在整列的数据与此位进行位与,即可熄灭某一具体点。

    // 位转16进制  
    int bitTo16(uint8 wei){  
        switch (wei){  
            case 0:return 0x01;break;  
            case 1:return 0x02;break;  
            case 2:return 0x04;break;  
            case 3:return 0x08;break;  
            case 4:return 0x10;break;  
            case 5:return 0x20;break;  
            case 6:return 0x40;break;  
            case 7:return 0x80;break;  
            //default:return 0x00;break;  
        }  
    }  
    // 点亮一个点,行列  
    void show_p(uint8 screen, uint8 line, uint8 column) {  
        SelectScreen(screen);  
          
        dat = read_LCD_data(line / 8, column);  
        write_LCD_data(dat | bitTo16(line % 8));  
    }  
    // 熄灭一个点,行列  
    void out_p(uint8 screen, uint8 line, uint8 column) {  
        SelectScreen(screen);  
          
        dat = read_LCD_data(line / 8, column);  
        write_LCD_data(dat & ~(bitTo16(line % 8)));  
    }