[综合信息] 【华大测评】03 + 漂亮的OLED中英文混合显示(1)

[复制链接]
 楼主| caizhiwei 发表于 2020-7-7 23:01 | 显示全部楼层 |阅读模式
首先,在这里感谢某网友(lisingch),对我的测评进行了技术指导。      OLED目前是比较普遍的显示器件了,淘宝价格也是很便宜的。
网上搜了一圈,找到了数据手册,初始化寄存器的时候会用到的,所以手册还是有必要看一看。
方便网友下载,这里我先贴出来:
091寸OLED模块原理图_IIC接口.pdf (52.35 KB, 下载次数: 40) SSD1306-Revision 1.0.pdf (1.35 MB, 下载次数: 49)
一,此款OLED为IIC接口,硬件原理图如图,说明从IIC地址为0x78.与MCU的I2C2 接口相连接。
对于IIC,这里采用了硬件IIC,没有用模拟的,这样效率更高一些,看看我们的初始化函数,iic的速率设置为400K的Fast 模式。
  1. /**
  2. ******************************************************************************
  3. ** \brief Initialize the I2C peripheral for master
  4. **
  5. ** \param None
  6. **
  7. ** \retval
  8. **
  9. **
  10. ******************************************************************************/
  11. void I2C_Master_Config(void)
  12. {
  13. stc_i2c_init_t stcI2cInit;
  14. stc_clk_freq_t stcClkFreq;

  15. /* Initialize I2C port*/
  16. PORT_SetFunc(I2C2_SCL_PORT, I2C2_SCL_PIN, Func_I2c2_Scl, Disable);
  17. PORT_SetFunc(I2C2_SDA_PORT, I2C2_SDA_PIN, Func_I2c2_Sda, Disable);

  18. /* Enable I2C Peripheral*/
  19. PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_I2C2, Enable);

  20. I2C_DeInit(I2C_CH);

  21. /* Get system clock frequency */
  22. CLK_GetClockFreq(&stcClkFreq);

  23. MEM_ZERO_STRUCT(stcI2cInit);
  24. stcI2cInit.enI2cMode = I2cMaster;
  25. stcI2cInit.u32Pclk3 = stcClkFreq.pclk3Freq;
  26. stcI2cInit.u32Baudrate = 400000ul;
  27. stcI2cInit.u32SclTime = 0ul;
  28. I2C_Init(I2C_CH, &stcI2cInit);

  29. I2C_Cmd(I2C_CH, Enable);
  30. }
然后就是最关键的IIC读写函数了。
  1. /**
  2. ******************************************************************************
  3. ** \brief Send data to slave
  4. **
  5. ** \param pTxData Pointer to the data buffer
  6. ** \param u32Size Data size
  7. **
  8. ** \retval
  9. **
  10. **
  11. ******************************************************************************/
  12. void Master_WriteData(uint8_t Data, uint32_t u32Size)
  13. {
  14. uint32_t u32TimeOut = TIMEOUT;

  15. while(u32Size--)
  16. {
  17. /* Wait tx buffer empty */
  18. u32TimeOut = TIMEOUT;
  19. while(Reset == I2C_GetStatus(I2C_CH, I2C_SR_TEMPTYF))
  20. {
  21. if(0ul == (u32TimeOut--))
  22. {
  23. break;
  24. }
  25. }

  26. /* Send one byte data */
  27. I2C_SendData(I2C_CH, Data);

  28. /* Wait transfer end*/
  29. u32TimeOut = TIMEOUT;
  30. while(Reset == I2C_GetStatus(I2C_CH, I2C_SR_TENDF))
  31. {
  32. if(0ul == (u32TimeOut--))
  33. {
  34. break;
  35. }
  36. }

  37. /* Check ACK */
  38. u32TimeOut = TIMEOUT;
  39. while(Set == I2C_GetStatus(I2C_CH, I2C_SR_NACKDETECTF))
  40. {
  41. if(0ul == (u32TimeOut--))
  42. {
  43. break;
  44. }
  45. }
  46. }
  47. }

基本的iic驱动就OK了,剩下的就是oled取模,这里贴一下取模方式,方便网友参考。

657415f0488bf3aadf.png 驱动好了,再看看Main函数:
991405f048d4e656df.png
整个工程目录非常清爽!
再上一张靓照效果图:
510025f048e3fdec1c.png






 楼主| caizhiwei 发表于 2020-7-7 23:04 | 显示全部楼层
最后,附上完整的MDK工程,欢迎指正! I2C_OLED_091.rar (638.86 KB, 下载次数: 97)

smartpower 发表于 2020-7-7 23:17 | 显示全部楼层
牛人啊。。
比神乐 发表于 2020-7-8 19:49 | 显示全部楼层
不错不错
 楼主| caizhiwei 发表于 2020-7-8 22:39 | 显示全部楼层

多谢辣椒小哥哥~
usysm 发表于 2020-7-9 08:03 | 显示全部楼层
OLED不是有串口的吗   
typeof 发表于 2020-7-9 08:04 | 显示全部楼层
做个gui的吧   
yujielun 发表于 2020-7-9 08:04 | 显示全部楼层
怎么不让OLED滚动起来  
htmlme 发表于 2020-7-9 08:04 | 显示全部楼层
                     
pklong 发表于 2020-7-9 08:05 | 显示全部楼层
caizhiwei 发表于 2020-7-7 23:04
最后,附上完整的MDK工程,欢迎指正!

学习一下这个。      
touser 发表于 2020-7-9 08:09 | 显示全部楼层
TFT LCD吧     
myiclife 发表于 2020-7-9 08:09 | 显示全部楼层
这个是申请的开发板吗   
iyoum 发表于 2020-7-9 08:10 | 显示全部楼层
手册还是有必要看一看。  
uytyu 发表于 2020-7-9 08:10 | 显示全部楼层
期待楼主更多的资料分析了。   
jkl21 发表于 2020-7-9 08:11 | 显示全部楼层
使用的硬件IIC吗   
pklong 发表于 2020-7-9 08:12 | 显示全部楼层
caizhiwei 发表于 2020-7-7 23:04
最后,附上完整的MDK工程,欢迎指正!

是自带字库的LED吗?   
htmlme 发表于 2020-7-9 08:12 | 显示全部楼层
谢谢楼主分享的资料了。   
touser 发表于 2020-7-9 08:12 | 显示全部楼层
可以做触摸控制的TFT LCD给力。   
myiclife 发表于 2020-7-9 08:12 | 显示全部楼层
功能看着真是强大呢。   
yujielun 发表于 2020-7-9 08:12 | 显示全部楼层
楼主可以做个滚动显示了。   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

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