这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【墨水屏电子书】过程贴-屏幕显示

共6条 1/1 1 跳转至

【墨水屏电子书】过程贴-屏幕显示

高工
2024-08-06 17:51:35     打赏

        本章节的主要目标是基于屏幕驱动函数(在屏幕任意位置画点)实现字符的显示,例如显示Hello EEPW & DigiKey 。

        到这里可以知道基本的需求是显示,不过在显示之前需要对屏幕进行驱动设计以及初始化,不过由于屏幕的资料比较少,这一部分的驱动也是在教学中提供了,我们直接使用就可以了。

image.png

    

        我们熟悉一下我们要是用的函数,除了基础的初始化函数epd_init(void)外,操作函数只有一个写点函数draw_fb_point(int x,int y),咱们要显示字符(不管是ASCII还是汉字都是一个一个点组成的)实际上就是连续的写点,在"epd2.c"中有一个ASCII的字库,16*24的,我们就用这个字库来完成本次的显示。

        首先我们要在字库中获取字符对应的初始位置:

image.png

ASCII的机器码正好是32-144,所以直接通过上面的算法就可以获得数组的起始位置;接下来就是连续写点:
void draw_fb_point(int x,int y){
    drawfb[OLED_H - x - 1][y] = 1;
}
void clear_fb_point(int x, int y){ 
    drawfb[OLED_H - x - 1][y] = 0; 
}
void draw_fb_ASCII(int x, int y, char word) {  
  const uint8_t *pData = epd2_get_font_16_24h(word);  
  unsigned char idxX, idxY;  
  int lineData;  
  
  for (idxY = 0; idxY < 24; idxY++) {  
    lineData = pData[idxY * 2 + 1];  
    lineData = lineData << 8;  
    lineData = lineData | pData[idxY * 2];  
  
    for (idxX = 0; idxX < 16; idxX++) {  
      if (lineData & (0x01 << idxX)) {  
        draw_fb_point(x + idxX, y + idxY);  
      } else {  
        clear_fb_point(x + idxX, y + idxY);  
      }  
    }  
  }  
}  

  
void draw_fb(int x, int y, char *data) {  
    short int word,ASCII_FONT_H,ASCII_FONT_W;
    int i;  
    ASCII_FONT_H = 24;
    ASCII_FONT_W = 16;
        
    for (i = 0; data[i] != 0;) {  
        if ((x + ASCII_FONT_W) > EPD_H) {  
            x = 0;  
            y += ASCII_FONT_H;  
            }  
         draw_fb_ASCII(x, y, data[i]);  
  
        x += ASCII_FONT_W;  
        i++;  
    }  
}
    

        添加了这些基础的显示函数后,我们就可以在main中添加显示内容了。

        效果如下:

image.png


专家
2024-08-06 18:51:21     打赏
2楼

感谢分享


专家
2024-08-06 18:52:57     打赏
3楼

感谢分享


专家
2024-08-06 18:53:38     打赏
4楼

感谢分享


专家
2024-08-07 09:50:58     打赏
5楼

谢谢分享


菜鸟
2024-08-08 16:06:55     打赏
6楼

感谢分享



共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]