数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 13953|回复: 31

[Arduino] 分享一个RAV4和卡罗拉车机VFD屏的U8g2驱动(Arduino / STM32)

[复制链接]
发表于 2020-1-21 20:41:07 | 显示全部楼层 |阅读模式
2020/1/23更新:增加支持U8x8(请重新下载压缩文件)

先上两张卡罗拉VFD屏的效果图,是U8g2和U8x8自带的示例。(点击可查看大图)

U8g2 Logo:



U8x8 GraphicsTest:


Arduino

一、安装:
这里是已经修改好的u8g2库,版本是2.27.5,直接下载然后在Arduino里选“项目->加载库->添加.zip库”就能安装,记得先删掉原来的U8g2。
U8g2-2.27.5.zip

安装好库以后,像其他屏幕一样使用就行。

二、构造函数:
1页缓冲占用256Byte内存,2页缓冲占用512Byte内存,全缓冲卡罗拉的需要1792Byte、RAV4的需要2048Byte。对于有多个SPI口的Arduino板,可以使用带2ND符号的构造函数来使用第二个SPI。
  1. /* 卡罗拉 U8g2 SPI0 */
  2. U8G2_GP1287AI_256X50_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  3. U8G2_GP1287AI_256X50_2_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  4. U8G2_GP1287AI_256X50_F_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  5. /* 卡罗拉 U8g2 SPI1 */
  6. U8G2_GP1287AI_256X50_1_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  7. U8G2_GP1287AI_256X50_2_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  8. U8G2_GP1287AI_256X50_F_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);

  9. /* RAV4 U8g2 SPI0 */
  10. U8G2_RAV4_253X63_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  11. U8G2_RAV4_253X63_2_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  12. U8G2_RAV4_253X63_F_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  13. /* RAV4 U8g2 SPI1 */
  14. U8G2_RAV4_253X63_1_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  15. U8G2_RAV4_253X63_2_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
  16. U8G2_RAV4_253X63_F_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);

  17. /* 卡罗拉 U8x8 SPI0 */
  18. U8X8_GP1287AI_256X50_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
  19. /* 卡罗拉 U8x8 SPI1 */
  20. U8X8_GP1287AI_256X50_2ND_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);

  21. /* RAV4 U8x8 SPI0 */
  22. U8X8_RAV4_253X63_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
  23. /* RAV4 U8x8 SPI1*/
  24. U8X8_RAV4_253X63_2ND_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
复制代码



三、亮度调节:
这两个型号的屏幕原本支持1024级亮度,但是U8g2最多只能输入255,所以setContrast()每增加1级的亮度实际是增加了4级的亮度。
  1. /* 亮度调节 */
  2. u8g2.setContrast(255);
复制代码



四、节能模式:

在退出节能模式时会自动有1毫秒延时,等待屏幕内部振荡器稳定。
  1. /* 进入节能模式 */
  2. u8g2.setPowerSave(1);

  3. /* 退出节能模式 */
  4. u8g2.setPowerSave(0);
复制代码



五、注意事项:
1、这两种屏幕的逻辑供电和所有io均为3.3V,如果用5V的Arduino板(UNO、Leonardo之类的)驱动的话需要加电平转换(因为默认是推挽输出,所以最好是使用转换芯片或三极管,也可以自己修改程序为开漏输出,然后用两个电阻做电平转换)。
2、高压使能(屏幕PCB上的SLEEP或HVEN测试点)在U8g2里没有去控制,自己用一个io口去控制就行,高电平是开启,低电平是关闭。在打开以后建议等700毫秒左右,待灯丝完全加热以后再发显示数据,不然显示内容会有从暗变亮的过程,视觉效果会不太好。

EX、Arduino自己修改库的操作步骤:
1、首先下载这个压缩包,然后解压一下,得到“src”文件夹
arduino_u8g2_vfd驱动.zip
2、将“src\追加\U8g2lib.h”里的内容全部添加到库中“U8g2\src\U8g2lib.h”的最后:
(点击可查看大图)


3、将“src\追加\U8x8lib.h”里的内容全部添加到库中“U8g2\src\U8x8lib.h”的最后:


4、用“src\修改\U8x8lib.cpp”里的相应内容替换库中“U8g2\src\U8x8lib.cpp”内相应的行:
(第一组)

(第二组)

(第三组)

(第四组)


5、将“src\clib\直接放入\u8x8_d_futaba_vfd.c”复制到库中“U8g2\src\clib”文件夹内:


6、将“src\clib\追加\u8g2.h”里的相应内容添加到库中“U8g2\src\clib\u8g2.h”文件的相应位置:

(第一组)

(第二组)


7、将“src\clib\追加”文件夹里剩余几个文件的内容添加到库中“U8g2\src\clib”文件内相同文件名文件的最后:
(u8g2_d_memory.c)

(u8g2_d_setup.c)

(u8x8.h)


8、最后将库中“U8g2\src\clib\u8g2.h”开头的 //#define U8G2_16BIT 注译去掉,变为#define U8G2_16BIT,启用16bit模式支持大尺寸屏幕。


STM32

一、移植U8g2:


这里是官方的移植和使用示例:
https://github.com/olikraus/u8g2/wiki/Porting-to-new-MCU-platform
https://github.com/olikraus/u8g2/wiki/u8g2setupc


最后附件里也有移植好并添加了VFD驱动的整个Keil工程

移植比较简单在这里就不细说了,不用修改什么东西,只需要添加就行。在编译的时候出现Error: L6406E: No space in execution regions with .ANY xxxxxxx的话建议切换到version6的编译器(如果是GCC可以启用垃圾收集):


不想使用version6编译器的话就需要手动删掉不需要的函数和字体,详细方法网上都有,在删除时需要注意保留u8g2_d_memory.c内下面这三个:
  1. uint8_t *u8g2_m_32_8_1(uint8_t *page_cnt);
  2. uint8_t *u8g2_m_32_8_2(uint8_t *page_cnt);
  3. uint8_t *u8g2_m_32_8_f(uint8_t *page_cnt);
复制代码



最后还需要添加SPI和GPIO回调函数(直接加到main.c里或新建一个文件都行):
  1. /* SPI回调 */
  2. uint8_t u8x8_byte_hw_spi_futaba_vfd(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
  3. {
  4.   uint8_t *data;
  5.   switch (msg)
  6.   {
  7.   case U8X8_MSG_BYTE_SEND: // 每次需要SPI发送数据时会进入这里,arg_ptr为数据指针,arg_int为数据大小
  8.     data = (uint8_t *)arg_ptr;
  9.     for (uint8_t i = 0; i < arg_int; i++)
  10.     {
  11.       while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
  12.       {
  13.         //__NOP();
  14.       }
  15.       LL_SPI_TransmitData8(SPI1, *data);
  16.       data += 1;
  17.     }
  18.     while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
  19.     {
  20.       //__NOP();
  21.     }
  22.     break;
  23.   case U8X8_MSG_BYTE_START_TRANSFER:
  24.     LL_GPIO_ResetOutputPin(SPI1_CS_GPIO_Port, SPI1_CS_Pin);
  25.     break;
  26.   case U8X8_MSG_BYTE_END_TRANSFER:
  27.     LL_GPIO_SetOutputPin(SPI1_CS_GPIO_Port, SPI1_CS_Pin);
  28.     break;
  29.   default:
  30.     return 0;
  31.   }
  32.   return 1;
  33. }
  34. /* GPIO回调 */
  35. uint8_t u8x8_gpio_and_delay_futaba_vfd(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
  36. {
  37.   switch (msg)
  38.   {
  39.   case U8X8_MSG_GPIO_AND_DELAY_INIT:
  40.     LL_SPI_Enable(SPI1);
  41.     break;
  42.   case U8X8_MSG_DELAY_MILLI:
  43.     LL_mDelay(arg_int);
  44.     break;
  45.   case U8X8_MSG_GPIO_RESET:
  46.     if (arg_int)
  47.       LL_GPIO_SetOutputPin(RST_GPIO_Port, RST_Pin);
  48.     else
  49.       LL_GPIO_ResetOutputPin(RST_GPIO_Port, RST_Pin);
  50.     break;
  51.   default:
  52.     u8x8_SetGPIOResult(u8x8, 1);
  53.     break;
  54.   }
  55.   return 1;
  56. }
复制代码




二、添加VFD驱动:
1、首先下载这个压缩包,然后解压一下,得到“csrc”文件夹
stm32_u8g2_vfd驱动.zip
2、之后的步骤和“Arduino自己修改库”的 5 到 8 步是相同的

三、支持的Setup函数:
1页缓冲占用256Byte内存,2页缓冲占用512Byte内存,全缓冲卡罗拉的需要1792Byte、RAV4的需要2048Byte。
  1. /* 卡罗拉 U8g2 */
  2. u8g2_Setup_futaba_vfd_gp1287ai_256x50_1(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
  3. u8g2_Setup_futaba_vfd_gp1287ai_256x50_2(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
  4. u8g2_Setup_futaba_vfd_gp1287ai_256x50_f(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);

  5. /* RAV4 U8g2 */
  6. u8g2_Setup_futaba_vfd_rav4_253x63_1(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
  7. u8g2_Setup_futaba_vfd_rav4_253x63_2(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
  8. u8g2_Setup_futaba_vfd_rav4_253x63_f(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);

  9. /* 卡罗拉 U8x8 */
  10. u8x8_Setup(&u8x8, u8x8_d_futaba_vfd_gp1287ai_256x50, u8x8_cad_empty, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);

  11. /* RAV4 U8x8 */
  12. u8x8_Setup(&u8x8, u8x8_d_futaba_vfd_rav4_256x50, u8x8_cad_empty, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
复制代码



四、亮度调节:这两个型号的屏幕原本支持1024级亮度,但是U8g2最多只能输入255,所以SetContrast()每增加1级的亮度实际是增加了4级的亮度。
  1. /* 亮度调节 */
  2. u8g2_SetContrast(&u8g2, 255);
复制代码



五、节能模式:
在退出节能模式时会自动有1毫秒延时,等待屏幕内部振荡器稳定。注意:在调用InitDisplay()之后默认状态为进入节能模式,需要手动使用SetPowerSave(0)退出(参见上面的官方使用示例)
  1. /* 进入节能模式 */
  2. u8g2_SetPowerSave(&u8g2, 1);

  3. /* 退出节能模式 */
  4. u8g2_SetPowerSave(&u8g2, 0);
复制代码




六、注意事项:
1、高压使能(屏幕PCB上的SLEEP或HVEN测试点)在U8g2里没有去控制,自己用一个io口去控制就行,高电平是开启,低电平是关闭。在打开以后建议等700毫秒左右,待灯丝完全加热以后再发显示数据,不然显示内容会有从暗变亮的过程,视觉效果会不太好。





附件:
1、卡罗拉的显示面板PCB测试点和逻辑分析仪数据:
2、RAV4的逻辑分析仪数据:
3、在103C8上移植好U8g2的Keil(V5.29)示例工程:



萌新第一次发帖,如果有什么问题欢迎指出~


补充内容 (2020-1-23 15:54):
2020/1/23更新:增加支持U8x8,链接地址:https://docs.qq.com/doc/DTlp1akJUVlFVQW5r(原贴不能编辑了,就在文档里更新了)





相关阅读:玩点不一样的!卡罗拉车机VFD屏实现灰度显示:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=196643

本帖子中包含更多资源

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

x

打赏

参与人数 2家元 +40 收起 理由
人艰不拆了 + 20
jpdd521 + 20 打赏萌新,好评x2

查看全部打赏

发表于 2020-1-21 21:27:21 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-5 09:18:09 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-5 20:03:09 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-8 14:03:21 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-9 15:58:11 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 21:24:17 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-13 10:58:50 来自手机浏览器 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-2-22 20:46:17 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 10:59:29 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-3-1 11:21:19 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-4-28 11:25:43 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-4-29 08:29:12 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-4-30 09:59:47 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-3 22:27:10 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-7-20 21:53:18 来自手机浏览器 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2020-8-6 09:21:41 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2020-8-6 09:29:34 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|数码之家-技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-6-21 12:31 , Processed in 0.249601 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

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