12下一页
返回列表 发新帖我要提问本帖赏金: 21.00元(功能说明)

[开发工具] HC32F460开发板之点亮板载的0.91寸OLED

[复制链接]
 楼主| gaoyang9992006 发表于 2021-8-8 22:36 | 显示全部楼层 |阅读模式
<
#申请原创# @21小跑堂

该开发板自带了一片0.91寸OLED,分辨率为128×32,不过厂家好像没提供例程和芯片介绍,经查找资料,发现应该是SSD1306驱动的。
因此我们可以找到SSD1306的驱动程序,稍加修改以适配该显示屏。
由于我手上之前做过128×64的,因此只要稍加修改就可以了。
根据开发板原理图,先定义出OLED所用的IIC接口的管脚
  1. #define SCL_PORT         (PortD)
  2. #define SCL_PIN          (Pin00)

  3. #define SDA_PORT         (PortD)
  4. #define SDA_PIN          (Pin01)
只要用到的文件都复制一份,这样阅读代码更方便
在oled.h
定义如下内容
  1. //-----------------OLED端口定义----------------

  2. #define OLED_SCL_Clr() PORT_ResetBits(SCL_PORT,SCL_PIN)
  3. #define OLED_SCL_Set() PORT_SetBits(SCL_PORT,SCL_PIN)

  4. #define OLED_SDA_Clr() PORT_ResetBits(SDA_PORT,SDA_PIN)
  5. #define OLED_SDA_Set() PORT_SetBits(SDA_PORT,SDA_PIN)
这样就对应上原来的库函数了。
接下来修改原来的SSD1315的初始化代码,来对应SSD1306的驱动器
  1. //初始化                                    
  2. void OLED_Init(void)
  3. {
  4.         OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  5.         OLED_WR_Byte(0x40,OLED_CMD);//--setstart line address  
  6.         OLED_WR_Byte(0xB0,OLED_CMD);//--setpage address
  7.         OLED_WR_Byte(0xC8,OLED_CMD);//Comscan direction
  8.         OLED_WR_Byte(0x81,OLED_CMD);// contract control
  9.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  10.         OLED_WR_Byte(0xA1,OLED_CMD);//setsegment remap
  11.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal/ reverse
  12.         OLED_WR_Byte(0xA8,OLED_CMD);//--setmultiplex ratio(1 to 64)
  13.         OLED_WR_Byte(0x1F,OLED_CMD);//--1/32duty         
  14.         OLED_WR_Byte(0xD3,OLED_CMD);//-setdisplay offset
  15.         OLED_WR_Byte(0x00,OLED_CMD);//  
  16.         OLED_WR_Byte(0xD5,OLED_CMD);//setosc division
  17.         OLED_WR_Byte(0xf0,OLED_CMD);//   
  18.         OLED_WR_Byte(0xD9,OLED_CMD);//SetPre-Charge Period
  19.         OLED_WR_Byte(0x22,OLED_CMD);//  
  20.         OLED_WR_Byte(0xDA,OLED_CMD);//setcom pin configuartion
  21.         OLED_WR_Byte(0x02,OLED_CMD);//  
  22.         OLED_WR_Byte(0xDB,OLED_CMD);//setVcomh
  23.         OLED_WR_Byte(0x49,OLED_CMD);//  
  24.         OLED_WR_Byte(0x8D,OLED_CMD);//setcharge pump enable
  25.         OLED_WR_Byte(0x14,OLED_CMD);//  
  26.         OLED_WR_Byte(0xAF,OLED_CMD);//--turnon oled panel
  27.         OLED_Clear();
  28.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  29. }
接下来完成PIN管脚的初始化配置
依葫芦画瓢,设置为输出开漏模式
  1. void oled_pin_init(void)
  2. {
  3.         stc_port_init_t stcPortInit;

  4.         /* configuration structure initialization */
  5.         MEM_ZERO_STRUCT(stcPortInit);

  6.         stcPortInit.enPinMode = Pin_Mode_Out;
  7.         stcPortInit.enPinOType = Pin_OType_Od;
  8.         stcPortInit.enExInt = Enable;
  9.         stcPortInit.enPullUp = Enable;

  10.         PORT_Init(SCL_PORT, SCL_PIN, &stcPortInit);
  11.         PORT_Init(SDA_PORT, SDA_PIN, &stcPortInit);

  12. }
然后差不多了,该包含的头文件包含进来后。编译,通过,ISP烧录,重启运行,OK
78114610fe9c904bc5.png
运行效果还是很不错的。
烧录上需要注意,开发板本身的串口竟然是不能用的,需要额外提供一个串口,然后用跳线连接到ISP接口。选择这个额外的串口进行烧录,同时复位按键上面的
J7跳线帽应短接,点执行后,按下复位键,即可完成烧录,重启需要去掉短接的跳线帽,然后按复位即可。有点小麻烦。
31934610fea2cb6ef8.png
打包的完整工程,以供大家测试。
GPIO_LED.rar (453.54 KB, 下载次数: 168)
开发板相关资料
HC32F460 EVB Introduction.pdf (932.55 KB, 下载次数: 50) HC32F460系列的MCU开发工具用户手册Rev1.0.pdf (759.45 KB, 下载次数: 43)





打赏榜单

21小跑堂 打赏了 20.00 元 2021-08-11
理由:恭喜通过原创文章审核!请多多加油哦!

巧克力娃娃 打赏了 1.00 元 2021-08-10
理由:感谢分享

huquanz711 发表于 2021-8-10 08:10 来自手机 | 显示全部楼层
华大这个开发板送了很多啊
 楼主| gaoyang9992006 发表于 2021-8-10 11:28 | 显示全部楼层
经过测试,在配置好GPIO作为开漏给IIC模拟使用的情况下,配置好后如果不延时给系统以响应时间,一次操作无法点亮屏幕,需要重启复位一次才行,因此需要在GPIO的初始化后就应该延时100ms,给IO电路以彻底的充放电反应时间。
完善后的OLED管脚硬件初始化函数如下
  1. void oled_pin_init(void)
  2. {
  3.         stc_port_init_t stcPortInit;

  4.         /* configuration structure initialization */
  5.         MEM_ZERO_STRUCT(stcPortInit);

  6.         stcPortInit.enPinMode = Pin_Mode_Out;
  7.         stcPortInit.enPinOType = Pin_OType_Od;
  8.         stcPortInit.enExInt = Enable;
  9.         stcPortInit.enPullUp = Enable;

  10.         PORT_Init(SCL_PORT, SCL_PIN, &stcPortInit);
  11.         PORT_Init(SDA_PORT, SDA_PIN, &stcPortInit);
  12.         //配置好后,等待片刻,给硬件以准备时间。
  13.         Ddl_Delay1ms(100);
  14. }
 楼主| gaoyang9992006 发表于 2021-8-13 10:19 | 显示全部楼层

如果需要显示一个变量的更新,就需要使用到数字显示函数,实现数字的显示

  1. #include "hc32_ddl.h"

  2. #include "oled.h"

  3. /* LED0 Port/Pin definition */
  4. #define  LED0_PORT        (PortE)
  5. #define  LED0_PIN         (Pin06)

  6. /* LED1 Port/Pin definition */
  7. #define  LED1_PORT        (PortA)
  8. #define  LED1_PIN         (Pin07)

  9. /* LED2 Port/Pin definition */
  10. #define  LED2_PORT        (PortB)
  11. #define  LED2_PIN         (Pin05)

  12. /* LED3 Port/Pin definition */
  13. #define  LED3_PORT        (PortB)
  14. #define  LED3_PIN         (Pin09)

  15. /* LED0~3 toggle definition */
  16. #define  LED0_TOGGLE()    (PORT_Toggle(LED0_PORT, LED0_PIN))
  17. #define  LED1_TOGGLE()    (PORT_Toggle(LED1_PORT, LED1_PIN))
  18. #define  LED2_TOGGLE()    (PORT_Toggle(LED2_PORT, LED2_PIN))
  19. #define  LED3_TOGGLE()    (PORT_Toggle(LED3_PORT, LED3_PIN))



  20. #define  DLY_MS           (100ul)

  21. void led_init(void)
  22. {
  23.         stc_port_init_t stcPortInit;

  24.         /* configuration structure initialization */
  25.         MEM_ZERO_STRUCT(stcPortInit);

  26.         stcPortInit.enPinMode = Pin_Mode_Out;
  27.         stcPortInit.enExInt = Enable;
  28.         stcPortInit.enPullUp = Enable;

  29.         PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);
  30.         PORT_Init(LED1_PORT, LED1_PIN, &stcPortInit);
  31.         PORT_Init(LED2_PORT, LED2_PIN, &stcPortInit);
  32.         PORT_Init(LED3_PORT, LED3_PIN, &stcPortInit);
  33. }

  34. void led_run(void)
  35. {
  36.         LED0_TOGGLE();
  37.         Ddl_Delay1ms(DLY_MS);
  38.         LED1_TOGGLE();
  39.         Ddl_Delay1ms(DLY_MS);
  40.         LED2_TOGGLE();
  41.         Ddl_Delay1ms(DLY_MS);
  42.         LED3_TOGGLE();
  43.         Ddl_Delay1ms(DLY_MS);
  44. }

  45. void oled_pin_init(void)
  46. {
  47.         stc_port_init_t stcPortInit;

  48.         /* configuration structure initialization */
  49.         MEM_ZERO_STRUCT(stcPortInit);

  50.         stcPortInit.enPinMode = Pin_Mode_Out;
  51.         stcPortInit.enPinOType = Pin_OType_Od;
  52.         stcPortInit.enExInt = Enable;
  53.         stcPortInit.enPullUp = Enable;

  54.         PORT_Init(SCL_PORT, SCL_PIN, &stcPortInit);
  55.         PORT_Init(SDA_PORT, SDA_PIN, &stcPortInit);
  56.         //配置好后,等待片刻,给硬件以准备时间。
  57.         Ddl_Delay1ms(100);
  58. }

  59. int32_t main(void)
  60. {
  61.         int i;
  62.         int num=0;
  63.         led_init();
  64.        
  65.         oled_pin_init();

  66.        
  67.         OLED_Init();//初始化OLED
  68.         OLED_ColorTurn(0);//0正常显示,1 反色显示
  69.         OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示

  70.         for(i=0;i<8;i++)
  71.                 OLED_ShowChinese(i*16,0,i,16);      //第一个是列坐标,字符是16×16,第二个是行开始的坐标,单位是8。第三个是写入第几个字符的数组编号
  72.         for(i=0;i<5;i++)
  73.                 OLED_ShowChinese(24+i*16,2,i+8,16); //第一个加24,为了居中对齐。
  74.         Ddl_Delay1ms(1500);
  75.         OLED_ShowString(0,2,"-21ic-HC32F460-",16);
  76.         Ddl_Delay1ms(1500);
  77.         OLED_ShowString(0,2,"HC32F460--0000--",16);
  78.        
  79.         while(1)
  80.         {
  81.                 led_run();
  82.                 OLED_ShowNum(80,2,num++,4,16);
  83.                 if(num>10000) num=0;
  84.         }
  85. }
1111111111.gif
linguanghua 发表于 2021-8-13 11:17 | 显示全部楼层
华大能不能也给我一个开发板啊,我可以写几个GUI移植使用。
Charlotte夏 发表于 2021-8-16 22:05 | 显示全部楼层
华大开发板属实不错,楼主可以继续深研究一波哦
Emily999 发表于 2021-8-16 22:05 | 显示全部楼层
瞅这代码风格,和正常用的32位单片机差不多,估计很好上手
B1lanche 发表于 2021-8-16 22:06 | 显示全部楼层
用link烧录吧,楼主,很方便呢
Betty996 发表于 2021-8-16 22:08 | 显示全部楼层
可以再跑跑其他例程,看看有没有什么"BUG"
Betty1299 发表于 2021-8-16 22:08 | 显示全部楼层
流水灯做的挺有意思,支持一波
Candic12e 发表于 2021-8-16 22:09 | 显示全部楼层
现在OLED很贵,屏的价格都快起飞了
Alina艾 发表于 2021-8-16 22:10 | 显示全部楼层
他这个ISP烧录 看着很费劲哦
Carmen7 发表于 2021-8-16 22:13 | 显示全部楼层
这颗MCU可以用OLED跑一跑U8G2的库 很耐斯
Belle1257 发表于 2021-8-16 22:13 | 显示全部楼层
效果真不错,期待后续有更棒的发现
Charlene沙 发表于 2021-8-16 22:14 | 显示全部楼层
0.91的屏一般都适合做什么呢??感觉有点儿小
alxd 发表于 2021-8-16 22:50 | 显示全部楼层
华大的单片机真心不错
Allison8859 发表于 2021-8-16 22:51 | 显示全部楼层
这个开发板上的黑色的方块是什么模块呀?
Carina卡 发表于 2021-8-16 22:52 | 显示全部楼层
感觉这板子做的挺憨厚的,这么大,却没啥东西
Annie556 发表于 2021-8-16 22:52 | 显示全部楼层
支持一波楼主,这个开发板期待楼主后续大作
yangjiaxu 发表于 2021-8-16 22:54 | 显示全部楼层
高总很强,有时间 跑个系统玩玩吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部