|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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。
- /* 卡罗拉 U8g2 SPI0 */
- U8G2_GP1287AI_256X50_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_GP1287AI_256X50_2_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_GP1287AI_256X50_F_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- /* 卡罗拉 U8g2 SPI1 */
- U8G2_GP1287AI_256X50_1_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_GP1287AI_256X50_2_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_GP1287AI_256X50_F_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- /* RAV4 U8g2 SPI0 */
- U8G2_RAV4_253X63_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_RAV4_253X63_2_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_RAV4_253X63_F_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- /* RAV4 U8g2 SPI1 */
- U8G2_RAV4_253X63_1_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_RAV4_253X63_2_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- U8G2_RAV4_253X63_F_2ND_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* reset=*/ 9);
- /* 卡罗拉 U8x8 SPI0 */
- U8X8_GP1287AI_256X50_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
- /* 卡罗拉 U8x8 SPI1 */
- U8X8_GP1287AI_256X50_2ND_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
-
- /* RAV4 U8x8 SPI0 */
- U8X8_RAV4_253X63_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
- /* RAV4 U8x8 SPI1*/
- U8X8_RAV4_253X63_2ND_3W_HW_SPI u8x8( /* cs=*/ 10, /* reset=*/ 9);
复制代码
三、亮度调节:
这两个型号的屏幕原本支持1024级亮度,但是U8g2最多只能输入255,所以setContrast()每增加1级的亮度实际是增加了4级的亮度。
- /* 亮度调节 */
- u8g2.setContrast(255);
复制代码
四、节能模式:
在退出节能模式时会自动有1毫秒延时,等待屏幕内部振荡器稳定。
- /* 进入节能模式 */
- u8g2.setPowerSave(1);
-
- /* 退出节能模式 */
- 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内下面这三个:
- uint8_t *u8g2_m_32_8_1(uint8_t *page_cnt);
- uint8_t *u8g2_m_32_8_2(uint8_t *page_cnt);
- uint8_t *u8g2_m_32_8_f(uint8_t *page_cnt);
复制代码
最后还需要添加SPI和GPIO回调函数(直接加到main.c里或新建一个文件都行):
- /* SPI回调 */
- uint8_t u8x8_byte_hw_spi_futaba_vfd(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
- {
- uint8_t *data;
- switch (msg)
- {
- case U8X8_MSG_BYTE_SEND: // 每次需要SPI发送数据时会进入这里,arg_ptr为数据指针,arg_int为数据大小
- data = (uint8_t *)arg_ptr;
- for (uint8_t i = 0; i < arg_int; i++)
- {
- while (LL_SPI_IsActiveFlag_TXE(SPI1) == RESET)
- {
- //__NOP();
- }
- LL_SPI_TransmitData8(SPI1, *data);
- data += 1;
- }
- while (LL_SPI_IsActiveFlag_BSY(SPI1) == SET)
- {
- //__NOP();
- }
- break;
- case U8X8_MSG_BYTE_START_TRANSFER:
- LL_GPIO_ResetOutputPin(SPI1_CS_GPIO_Port, SPI1_CS_Pin);
- break;
- case U8X8_MSG_BYTE_END_TRANSFER:
- LL_GPIO_SetOutputPin(SPI1_CS_GPIO_Port, SPI1_CS_Pin);
- break;
- default:
- return 0;
- }
- return 1;
- }
- /* GPIO回调 */
- 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)
- {
- switch (msg)
- {
- case U8X8_MSG_GPIO_AND_DELAY_INIT:
- LL_SPI_Enable(SPI1);
- break;
- case U8X8_MSG_DELAY_MILLI:
- LL_mDelay(arg_int);
- break;
- case U8X8_MSG_GPIO_RESET:
- if (arg_int)
- LL_GPIO_SetOutputPin(RST_GPIO_Port, RST_Pin);
- else
- LL_GPIO_ResetOutputPin(RST_GPIO_Port, RST_Pin);
- break;
- default:
- u8x8_SetGPIOResult(u8x8, 1);
- break;
- }
- return 1;
- }
复制代码
二、添加VFD驱动:
1、首先下载这个压缩包,然后解压一下,得到“csrc”文件夹
stm32_u8g2_vfd驱动.zip
2、之后的步骤和“Arduino自己修改库”的 5 到 8 步是相同的
三、支持的Setup函数:
1页缓冲占用256Byte内存,2页缓冲占用512Byte内存,全缓冲卡罗拉的需要1792Byte、RAV4的需要2048Byte。
- /* 卡罗拉 U8g2 */
- u8g2_Setup_futaba_vfd_gp1287ai_256x50_1(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
- u8g2_Setup_futaba_vfd_gp1287ai_256x50_2(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
- u8g2_Setup_futaba_vfd_gp1287ai_256x50_f(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
-
- /* RAV4 U8g2 */
- u8g2_Setup_futaba_vfd_rav4_253x63_1(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
- u8g2_Setup_futaba_vfd_rav4_253x63_2(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
- u8g2_Setup_futaba_vfd_rav4_253x63_f(&u8g2, U8G2_R0, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
-
- /* 卡罗拉 U8x8 */
- u8x8_Setup(&u8x8, u8x8_d_futaba_vfd_gp1287ai_256x50, u8x8_cad_empty, u8x8_byte_hw_spi_futaba_vfd, u8x8_gpio_and_delay_futaba_vfd);
-
- /* RAV4 U8x8 */
- 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级的亮度。
- /* 亮度调节 */
- u8g2_SetContrast(&u8g2, 255);
复制代码
五、节能模式:
在退出节能模式时会自动有1毫秒延时,等待屏幕内部振荡器稳定。注意:在调用InitDisplay()之后默认状态为进入节能模式,需要手动使用SetPowerSave(0)退出(参见上面的官方使用示例)
- /* 进入节能模式 */
- u8g2_SetPowerSave(&u8g2, 1);
- /* 退出节能模式 */
- u8g2_SetPowerSave(&u8g2, 0);
复制代码
六、注意事项:
1、高压使能(屏幕PCB上的SLEEP或HVEN测试点)在U8g2里没有去控制,自己用一个io口去控制就行,高电平是开启,低电平是关闭。在打开以后建议等700毫秒左右,待灯丝完全加热以后再发显示数据,不然显示内容会有从暗变亮的过程,视觉效果会不太好。
附件:
1、卡罗拉的显示面板PCB测试点和逻辑分析仪数据:
卡罗拉VFD.zip
(8.75 MB, 下载次数: 58)
2、RAV4的逻辑分析仪数据:
RAV4 VFD逻辑分析仪数据.zip
(1005.61 KB, 下载次数: 22)
3、在103C8上移植好U8g2的Keil(V5.29)示例工程:
103C8T6_U8g2_VFD.zip
(9.57 MB, 下载次数: 55)
萌新第一次发帖,如果有什么问题欢迎指出~
补充内容 (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
|
打赏
-
查看全部打赏
|