【沁恒微CH32V307评估板试用体验】CH32V307接OLED显示超声波测试距离数据 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

[文章]

【沁恒微CH32V307评估板试用体验】CH32V307接OLED显示超声波测试距离数据

本帖最后由 lingxin-yuhe 于 2022-6-23 13:16 编辑

前言:前一段时间头脑一热买了一堆传感器也捎带买了一个大家都用的OLED(0.96寸,4pin),淘宝截图几张看看参数。
oled0.png oled1.png
先来连接管脚说明:I2C1_SCL ---- PB8
                              I2C1_SDA ---- PB9
                              VCC ---------- 3.3V
                              GND---------- 电源
                              
第一、oled简介
  通常我们所用的OLED屏有白色、蓝色、黄蓝双色等几种;屏的大小为0.96寸,像素点为128*64,所以我们也称之为0.96OLED屏或者12864屏。我在淘宝买的黄蓝双色的。
  内部驱动IC为SSD1306;通信方式一般为SPI或者I2C。如下图所示,配置哪种模式主要是根据BS0、BS1和BS2这三个管脚的电平逻辑来的。
ds1306-0.png


第二、IIC通信地址与通信过程
  关于I2C地址的描述,根据DC引脚电平的不同,地址为,0111100和0111101两种,通常我们设置DC引脚接地,所以作为I2C从机的七位地址为0111100;又因为我们与驱动IC交互时,都是主机发送命令或者数据到IC,也就是只有写数据,没有读数据,所以从机地址为0x78。板子背面有个IIC ADRESS SELECT的电阻,我们设定它为从机则为0x78。

ds1306-1.png
先发送从机地址,再发送命令字节,接着发送数据字节。
ds1302-2.png
参考赤菟IIC例程I2C_7bit_Mode,编写移植大牛们的代码做成,如图所示例程位置,具体代码请到沁恒官网进行下载查阅。

赤菟IIC.png

第三、显示原理
手里的OLED显示像素为128*64,也就是水平方向分布了128个像素点,垂直方向分布了64个像素点,而驱动芯片在点亮像素点的时候,是以8个像素点为单位的。官方的例程推荐的是垂直扫描的方式,也就是先画垂直方向的8个像素点,所以我们在画点的时候Y的取值为0-7,X的取值为0-127。(参考网址 https://www.freesion.com/article/4002416013/
根据显示原理进行取模(用取模软件做),打开取模软件,点击选项进入字模选项,设置好,然后在输入框内输入你要显示的字符,生产就可以了。字体大小需要字节设置。
取字模.png
根据取模演示动画就可以了解如何进行显示啦,字体大的需要先显示上半部分,再显示下半部分。自己研究一下即可。

第四、将超声波测距结果显示到OLED上
先看main函数,没啥。把字符库放到头文件,写一下或者拷贝一下网上的代码都可以。新建ssd1306头文件和源码文件,将IIC代码也另起头文件和源文件,边写边调,最后就OK了。
  1. *******************************************************************************/
  2. /*
  3. *@Note
  4. 7位地址模式,Master:
  5. I2C1_SCL(PB8)、I2C1_SDA(PB9)。
  6. */

  7. /*
  8. *@Note
  9. 超声波测距模块
  10. */

  11. #include "debug.h"
  12. #include "gpio.h"
  13. #include "timer.h"
  14. #include "I2C.h"
  15. #include "ssd1306.h"

  16. /*******************************************************************************
  17. * Function Name  : main
  18. * Description    : Main program.
  19. * Input          : None
  20. * Return         : None
  21. *******************************************************************************/
  22. int main(void)
  23. {
  24.     float distance = 0;
  25.     uint8_t dist[32] = {0};
  26.     Delay_Init();
  27.     USART_Printf_Init(115200);

  28. //    ultrasonic_GPIO_Init();
  29.     Input_Capture_Init(1000-1,72-1);

  30.     printf("SystemClk:%drn",SystemCoreClock);
  31.     printf("This is Ultrasonic ranging examplern");
  32.     oled_init();
  33.     oled_clear();
  34.     OLED_ShowStr(2,0,"CH32V307!",24);
  35.     OLED_ShowStr(28,3,"ELECFANS",16);


  36.     while(1)
  37.     {
  38.         distance = Ultrasoniclength();  //cm
  39.         printf("DISTANCE:%3.2f cmn",distance);
  40.         sprintf(dist,"DISTANCE : %3.2f cm",distance);
  41.         oled_clear_line(7,2);
  42.         OLED_ShowStr(7,5,dist,12);
  43.         Delay_Ms(1000);
  44.     }
  45. }
测距结果显示前需要先将显示行及用到的行清一下,开始没清,结果你知道的。哈哈哈。

代码我会传上来。


回帖(2)

北山独狼

2022-6-25 18:25:48
谢谢分享,学习学习

打马过草原

2023-3-14 11:59:50
感谢大佬分享呀

更多回帖

×
发帖