[开发工具] 【APM32F107VCT6 MINI开发板测评】OLED

[复制链接]
1035|6
 楼主| 比神乐 发表于 2023-3-14 11:40 | 显示全部楼层 |阅读模式
今天搞了一下新定义ES003板子上的OLED
SCL接PC0,SDA接PC1。
主程序代码:
  1. #include "main.h"
  2. #include "oled.h"
  3. /** @addtogroup Examples
  4.   @{
  5. */


  6. uint8_t temp;
  7. uint8_t txBuffer[50];
  8. uint8_t rxBuffer[10];
  9. uint8_t cord_h,cord_l;//???????
  10. volatile uint32_t nBytesRead = 0;
  11. char CharData[] = {   "bbs.21ic.com" };
  12. char CharData1[] = {   "APM32F107VC" };
  13. /** @addtogroup USART_Printf
  14.   @{
  15. */

  16. /** @addtogroup USART_Printf_Variables Variables
  17.   @{
  18. */

  19. volatile uint32_t tick = 0;
  20. uint8_t txBuf[] = "Key Value = :   \r\n";

  21. /**@} end of group USART_Printf_Variables */
  22. void DelayMs(uint16_t nms)
  23. {
  24.         uint16_t i,j;                  
  25.         for(i=0;i<nms;i++)
  26.        for(j=0;j<200;j++);
  27. }


  28. /*!
  29. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program
  30. *
  31. * @param       None
  32. *
  33. * @retval      None
  34. *
  35. */
  36. int main(void)
  37. {
  38.     uint8_t i;

  39.     GPIO_Config_T GPIO_ConfigStruct;
  40.     USART_Config_T USART_ConfigStruct;

  41.     APM_MINI_LEDInit(LED2);

  42.     RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1));

  43.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  44.     GPIO_ConfigStruct.pin = GPIO_PIN_9;
  45.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  46.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  47.     USART_ConfigStruct.baudRate = 115200;
  48.     USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  49.     USART_ConfigStruct.mode = USART_MODE_TX;
  50.     USART_ConfigStruct.parity = USART_PARITY_NONE;
  51.     USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  52.     USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  53.     USART_Config(USART1, &USART_ConfigStruct);

  54.     USART_Enable(USART1);

  55.     SysTick_Config(SystemCoreClock / 1000);
  56.                 I2C_Init();
  57.                 OLED_Init();
  58.                 OLED_Clear();
  59.    
  60.     OLED_ShowString(10,0,(u8 *)CharData,16);
  61.     OLED_ShowCHinese(10,2,0);
  62.                 OLED_ShowCHinese(26,2,1);
  63.                 OLED_ShowCHinese(42,2,2);
  64.                 OLED_ShowString(10,4,(u8 *)CharData1,16);
  65.                 OLED_ShowCHinese(10,6,3);
  66.                 OLED_ShowCHinese(26,6,4);
  67.                 OLED_ShowCHinese(42,6,5);
  68.                 OLED_ShowCHinese(58,6,6);
  69.                 OLED_ShowCHinese(74,6,7);
  70.                
  71.                
  72.     while(1)
  73.     {

  74.                                
  75. //                                                for(i = 0; i < sizeof(txBuf); i++)
  76. //                                                {
  77. //                                                                while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
  78. //                                                                USART_TxData(USART1, txBuf[i]);
  79. //                                                }
  80.         
  81.     }
  82. }

  83. /*!
  84. * @brief       Delay
  85. *
  86. * @param       None
  87. *
  88. * @retval      None
  89. *
  90. */
  91. void Delay(void)
  92. {
  93.     tick = 0;

  94.     while(tick < 500);
  95. }

  96. /**@} end of group USART_Printf_Functions */
  97. /**@} end of group USART_Printf */
  98. /**@} end of group Examples */
OLED.C:
  1. #include "oled.h"


  2. #define Max_Column 128
  3. //OLED的显存
  4. //存放格式如下.
  5. //[0]0 1 2 3 ... 127       
  6. //[1]0 1 2 3 ... 127       
  7. //[2]0 1 2 3 ... 127       
  8. //[3]0 1 2 3 ... 127       
  9. //[4]0 1 2 3 ... 127       
  10. //[5]0 1 2 3 ... 127       
  11. //[6]0 1 2 3 ... 127       
  12. //[7]0 1 2 3 ... 127                           


  13. void Delay1(unsigned long time)
  14. {
  15.     /*<UserCodeStart>*//*<SinOne-Tag><64>*/
  16.   for(;time>0;time--);
  17.    
  18.     /*<UserCodeEnd>*//*<SinOne-Tag><64>*/
  19. }
  20. /**
  21.   * @brief  Write_I2C_Data 向OLED写入数据
  22.   * @param  I2C_Data:数据
  23.   * @retval 无
  24.   */

  25. u8 TWI_WriteOneByte(u8 DeviceAddr,u8 DataAddr,u8 u8Data)
  26. {
  27.         u8 Error_Flag=0;
  28.         I2C_Start();

  29.    
  30.         I2C_Send_Byte(DeviceAddr);//器件地址+数据地址
  31.        

  32.         I2C_Wait_Ack();
  33.         I2C_Send_Byte(DataAddr);//双字节是数据地址低位               
  34.                                                                                                                                                                                                         //单字节是数据地址低位
  35.         I2C_Wait_Ack();

  36.         I2C_Send_Byte(u8Data);
  37.         I2C_Wait_Ack();
  38.         I2C_Stop();
  39.         return Error_Flag;
  40. }       


  41. ////OLED清屏
  42. void OLED_Clear()
  43. {
  44.     /*<UserCodeStart>*//*<SinOne-Tag><65>*/
  45.     unsigned int i,n;
  46.     for(i=0;i<8;i++)
  47.     {
  48.      TWI_WriteOneByte(0x78,0x00,0xb0+i);
  49.      TWI_WriteOneByte(0x78,0x00,0x00);
  50.      TWI_WriteOneByte(0x78,0x00,0x10);
  51.      for(n=0;n<128;n++)
  52.      {
  53.         TWI_WriteOneByte(0x78,0x40,0);
  54.       }
  55.     }
  56.    
  57.     /*<UserCodeEnd>*//*<SinOne-Tag><65>*/
  58. }
  59. ////OLED初始化
  60. void OLED_Init()
  61. {
  62.     /*<UserCodeStart>*//*<SinOne-Tag><66>*/
  63. Delay1(100);
  64. TWI_WriteOneByte(0x78,0x00,0xAE);
  65. TWI_WriteOneByte(0x78,0x00,0x00);
  66. TWI_WriteOneByte(0x78,0x00,0x10);
  67. TWI_WriteOneByte(0x78,0x00,0x40);
  68. TWI_WriteOneByte(0x78,0x00,0xB0);
  69. TWI_WriteOneByte(0x78,0x00,0x81);
  70. TWI_WriteOneByte(0x78,0x00,0xFF);
  71. TWI_WriteOneByte(0x78,0x00,0xA1);
  72. TWI_WriteOneByte(0x78,0x00,0xA6);
  73. TWI_WriteOneByte(0x78,0x00,0xA8);
  74. TWI_WriteOneByte(0x78,0x00,0x3F);
  75. TWI_WriteOneByte(0x78,0x00,0xC8);
  76. TWI_WriteOneByte(0x78,0x00,0xD3);
  77. TWI_WriteOneByte(0x78,0x00,0x00);

  78. TWI_WriteOneByte(0x78,0x00,0xD5);
  79. TWI_WriteOneByte(0x78,0x00,0x80);

  80. TWI_WriteOneByte(0x78,0x00,0xD8);
  81. TWI_WriteOneByte(0x78,0x00,0x05);

  82. TWI_WriteOneByte(0x78,0x00,0xD9);
  83. TWI_WriteOneByte(0x78,0x00,0xF1);

  84. TWI_WriteOneByte(0x78,0x00,0xDA);
  85. TWI_WriteOneByte(0x78,0x00,0x12);

  86. TWI_WriteOneByte(0x78,0x00,0xDB);
  87. TWI_WriteOneByte(0x78,0x00,0x30);

  88. TWI_WriteOneByte(0x78,0x00,0x8D);
  89. TWI_WriteOneByte(0x78,0x00,0x14);

  90. TWI_WriteOneByte(0x78,0x00,0xAF);
  91. Delay1(100);
  92.    
  93.     /*<UserCodeEnd>*//*<SinOne-Tag><66>*/
  94. }
  95. ////清除指定区域字符x0,y0,左上角坐标x1,y1,右下角坐标
  96. void OLED_PartClear(u8 x0,u8 y0,u8 x1,u8 y1)
  97. {
  98.     /*<UserCodeStart>*//*<SinOne-Tag><67>*/
  99.     u8 i,n;
  100.     for( i=x0;i<x1;i++)
  101.     {
  102.         for( n=y0;n<y1;n++)
  103.         {
  104.           TWI_WriteOneByte(0x78,0x00,0xb0+i);
  105.           TWI_WriteOneByte(0x78,0x00,((n&0xf0)>>4)|0x10);
  106.           TWI_WriteOneByte(0x78,0x00,(n&0x0f));
  107.           TWI_WriteOneByte(0x78,0x40,0);
  108.         }
  109.     }
  110.    
  111.     /*<UserCodeEnd>*//*<SinOne-Tag><67>*/
  112. }
  113. ////m^n函数
  114. unsigned long oled_pow(u8 m,u8 n)
  115. {
  116.     /*<UserCodeStart>*//*<SinOne-Tag><68>*/
  117.     u32 result=1;         
  118.         while(n--)
  119.         {
  120.          result*=m;
  121.         }   
  122.         return result;
  123.    
  124.     /*<UserCodeEnd>*//*<SinOne-Tag><68>*/
  125. }
  126. ////坐标设置
  127. void OLED_Set_Pos(unsigned char x, unsigned char y)
  128. {
  129.     /*<UserCodeStart>*//*<SinOne-Tag><69>*/
  130.    TWI_WriteOneByte(0x78,0x00,0xb0+y);
  131.    TWI_WriteOneByte(0x78,0x00,((x&0xf0)>>4)|0x10);
  132.    TWI_WriteOneByte(0x78,0x00,(x&0x0f));
  133.    
  134.     /*<UserCodeEnd>*//*<SinOne-Tag><69>*/
  135. }
  136. ////在指定位置显示一个字符,包括部分字符x:0~127y:0~8chr:字符地址size:选择字体16/12
  137. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  138. {
  139.     /*<UserCodeStart>*//*<SinOne-Tag><70>*/
  140.         unsigned char c=0,i=0;       
  141.                 c=chr-' ';//得到偏移后的值                       
  142.                 if(x>Max_Column-1)
  143.                 {
  144.                   x=0;
  145.                   y=y+2;
  146.                  }
  147.                 if(Char_Size ==16)
  148.                 {
  149.                         OLED_Set_Pos(x,y);       
  150.                         for(i=0;i<8;i++)
  151.                         {
  152.                       TWI_WriteOneByte(0x78,0x40,F8X16[c*16+i]);
  153.                     }
  154.                         OLED_Set_Pos(x,y+1);
  155.                         for(i=0;i<8;i++)
  156.                         {
  157.                           TWI_WriteOneByte(0x78,0x40,F8X16[c*16+i+8]);
  158.                          }
  159.                 }
  160.                 else
  161.                 {       
  162.                         OLED_Set_Pos(x,y);
  163.                         for(i=0;i<6;i++)
  164.                         {
  165.                           TWI_WriteOneByte(0x78,0x40,F6x8[c][i]);
  166.                          }                               
  167.                 }
  168.    
  169.     /*<UserCodeEnd>*//*<SinOne-Tag><70>*/
  170. }
  171. ////显示汉字
  172. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  173. {
  174.     /*<UserCodeStart>*//*<SinOne-Tag><71>*/
  175.     u8 t,adder=0;
  176.     OLED_Set_Pos(x,y);       
  177.     for(t=0;t<16;t++)
  178.     {
  179.       TWI_WriteOneByte(0x78,0x40,Hzk[2*no][t]);
  180.           adder+=1;
  181.     }       
  182.         OLED_Set_Pos(x,y+1);       
  183.     for(t=0;t<16;t++)
  184.         {       
  185.           TWI_WriteOneByte(0x78,0x40,Hzk[2*no+1][t]);
  186.           adder+=1;
  187.     }       
  188.    
  189.     /*<UserCodeEnd>*//*<SinOne-Tag><71>*/
  190. }
  191. /******************************************************************************************************
  192. *显示2个数字x,y :起点坐标len :数字的位数size:字体大小num:数值(0~429496729
  193. *5)
  194. ******************************************************************************************************/
  195. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  196. {
  197.     /*<UserCodeStart>*//*<SinOne-Tag><72>*/
  198.     u8 t,temp;
  199.         u8 enshow=0;                                                  
  200.         for(t=0;t<len;t++)
  201.         {
  202.                 temp=(num/oled_pow(10,len-t-1))%10;
  203.                 if(enshow==0&&t<(len-1))
  204.                 {
  205.                         if(temp==0)
  206.                         {
  207.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  208.                                 continue;
  209.                         }
  210.                         else
  211.                            enshow=1;
  212.                 }
  213.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  214.     }       
  215.    
  216.     /*<UserCodeEnd>*//*<SinOne-Tag><72>*/
  217. }
  218. ////显示一个字符串
  219. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  220. {
  221.     /*<UserCodeStart>*//*<SinOne-Tag><73>*/
  222.     unsigned char j=0;
  223.         while(chr[j]!='\0')
  224.         {               
  225.            OLED_ShowChar(x,y,chr[j],Char_Size);
  226.            x+=8;
  227.            if(x>120)
  228.            {
  229.              x=0;
  230.              y+=2;
  231.            }
  232.            j++;
  233.         }
  234.    
  235.     /*<UserCodeEnd>*//*<SinOne-Tag><73>*/
  236. }
效果图:
0.jpg


1.jpg




tpgf 发表于 2023-4-10 10:06 | 显示全部楼层
我仔细看来看 笔记本上还有微积分呢
qcliu 发表于 2023-4-10 10:59 | 显示全部楼层
OLED是无背光源、无液晶的自发光显示,具有优异的色彩饱和度、对比度和反应速度
drer 发表于 2023-4-10 11:21 | 显示全部楼层
OLED显示技术广泛的运用于手机、数码摄像机、DVD机、个人数字助理(PDA)、笔记本电脑、汽车音响和电视
coshi 发表于 2023-4-10 11:57 | 显示全部楼层
基于OLED的新技术有软性有机发光显示技术(Flexible OLED,FOLED),这项技术有可能在将来使得高度可携带、折叠的显示技术变为可能。
kxsi 发表于 2023-4-10 12:15 | 显示全部楼层
OLED显示屏幕可视角度大,并且能够节省电能
wiba 发表于 2023-4-10 13:24 | 显示全部楼层
OLED的驱动方式分为主动式驱动(有源驱动)和被动式驱动(无源驱动)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

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