发 帖  
原厂入驻New

[经验] 【NXP LPC54110试用体验】OLED屏点亮

2017-10-15 16:09:19  2295
分享
0
oled屏点亮花费了一段时间,问题出现在 MCUXpresso Config 动态生成的pin_mux 只包含了引脚的分配,但是并没有对引脚进行初始化,这是一直连接不通的原因

另外OLED 虽然写明支持I2C  SPI,但是使用硬件接口并不顺序,这方面需要后面来解决,现在用的的软件模拟3线SPI进行驱动
关键代码 如下:

  1. #include "board.h"

  2. #include "pin_mux.h"

  3. #include "fsl_common.h"
  4. #include "fsl_iocon.h"

  5. #include <stdbool.h>

  6. /*----------------------------------------------*
  7. * 外部变量说明                                 *
  8. *----------------------------------------------*/

  9. /*----------------------------------------------*
  10. * 外部函数原型说明                             *
  11. *----------------------------------------------*/

  12. /*----------------------------------------------*
  13. * 内部函数原型说明                             *
  14. *----------------------------------------------*/

  15. /*----------------------------------------------*
  16. * 全局变量                                     *
  17. *----------------------------------------------*/

  18. /*----------------------------------------------*
  19. * 模块级变量                                   *
  20. *----------------------------------------------*/

  21. /*----------------------------------------------*
  22. * 常量定义                                     *
  23. *----------------------------------------------*/

  24. /*----------------------------------------------*
  25. * 宏定义                                       *
  26. *----------------------------------------------*/
  27. #include "Delay_Log.h"
  28. #define DispDly_uS(x)      S_Log_Delay(x)




  29. #define OLED_MODE_SPI3  1   /* 定义此行表示OLED模块硬件是SPI-3接口模式;不定义则认为是8位并口模式 */
  30. #define OLED_MODE_SPI4  2   /* 使OLED模块硬件是SPI-4接口模式*/
  31. #define OLED_MODE_FSMS  3   /*FSMC   8位并口模式*/
  32. #define OLED_MODE_I2C   4   /* I2C模式 */

  33. #define OLED_MODE_SET   OLED_MODE_SPI3


  34. #IF (OLED_MODE_SET == OLED_MODE_SPI3 )
  35. /*
  36. [OLED模块排针] [开发板TFT接口(STM32口线)]
  37.         VCC ----------- 3.3V
  38.         GND ----------- GND
  39.          CS ----------- TP_NCS  (PA4) //(PG11)
  40.         RST ----------- NRESET (也可以不连接)
  41. D0/SCK ----------- TP_SCK   (PA5)
  42. D1/SDIN ----------- TP_MOSI  (PA7)
  43. */
  44. //#define SSD_CS_RCCAPB        RCC_APB2Periph_GPIOB
  45. //#define SSD_CS_PORT                GPIOB       
  46. //#define SSD_CS_GPIO                GPIO_Pin_14
  47. //
  48. //#define SSD_SDIN_RCCAPB        RCC_APB2Periph_GPIOB
  49. //#define SSD_SDIN_PORT        GPIOB
  50. //#define SSD_SDIN_GPIO        GPIO_Pin_15
  51. //
  52. //#define SSD_SCK_RCCAPB        RCC_APB2Periph_GPIOB
  53. //#define SSD_SCK_PORT        GPIOB
  54. //#define SSD_SCK_GPIO        GPIO_Pin_13

  55. //#define SSD_CS_1()          GPIO_SetBits(SSD_CS_PORT, SSD_CS_GPIO)           //GPIOB->BSRR = GPIO_Pin_1  //
  56. //#define SSD_CS_0()          GPIO_ResetBits(SSD_CS_PORT, SSD_CS_GPIO)         //GPIOB->BRR = GPIO_Pin_1   //
  57. //   
  58. //#define SSD_SDIN_1()  GPIO_SetBits(SSD_SDIN_PORT, SSD_SDIN_GPIO)          //GPIOA->BSRR = GPIO_Pin_7 //
  59. //#define SSD_SDIN_0()  GPIO_ResetBits(SSD_SDIN_PORT, SSD_SDIN_GPIO)        //GPIOA->BRR = GPIO_Pin_7  //
  60. //   
  61. //#define SSD_SCK_1()   GPIO_SetBits(SSD_SCK_PORT, SSD_SCK_GPIO)                //GPIOA->BSRR = GPIO_Pin_5  //
  62. //#define SSD_SCK_0()   GPIO_ResetBits(SSD_SCK_PORT, SSD_SCK_GPIO)        //GPIOA->BRR = GPIO_Pin_5   //


  63. #define SSD_CS_INIT()    GPIO_PinInit(GPIO, 0, 15,&(gpio_pin_config_t){kGPIO_DigitalOutput,1})
  64. #define SSD_CS_1()             GPIO_WritePinOutput(GPIO,0, 15, 1)
  65. #define SSD_CS_0()             GPIO_WritePinOutput(GPIO,0, 15, 0)

  66. #define SSD_SDIN_INIT()  GPIO_PinInit(GPIO, 1, 4,&(gpio_pin_config_t){kGPIO_DigitalOutput,1})   
  67. #define SSD_SDIN_1()     GPIO_WritePinOutput(GPIO,1, 4, 1)
  68. #define SSD_SDIN_0()     GPIO_WritePinOutput(GPIO,1, 4, 0)

  69. #define SSD_SCK_INIT()   GPIO_PinInit(GPIO, 1, 5,&(gpio_pin_config_t){kGPIO_DigitalOutput,1})      
  70. #define SSD_SCK_1()      GPIO_WritePinOutput(GPIO,1, 5, 1)
  71. #define SSD_SCK_0()      GPIO_WritePinOutput(GPIO,1, 5, 0)


  72. #elif(OLED_MODE_SET == OLED_MODE_SPI4 )

  73. #elif(OLED_MODE_SET == OLED_MODE_FSMS )
  74. /* 定义lcd驱动器的访问地址
  75.         TFT接口中的RS引脚连接FSMC_A0引脚,由于是16bit模式,RS对应A1地址线,因此
  76.         OLED_RAM的地址是+2
  77. */
  78. #define OLED_BASE       ((uint32)(0x60000000 | 0x0C000000))
  79. #define OLED_CMD                *(__IO uint16_t *)(OLED_BASE)
  80. #define OLED_DATA                *(__IO uint16_t *)(OLED_BASE + 2)
  81. /*
  82. [OLED模块排针] [开发板TFT接口(STM32口线)]
  83.             VCC ----------- 3.3V
  84.             GND ----------- GND
  85.              CS ----------- NCS
  86.         RST ----------- NRESET (也可以不连接)
  87.             D/C ----------- RS   (FSMC_A0)
  88.              WE ----------- NWE  (FSMC_NWE)
  89.              OE ----------- NOE  (FSMC_NOE)
  90.      D0/SCK ----------- DB0  (FSMC_D0)
  91.         D1/SDIN ----------- DB1  (FSMC_D1)
  92.              D2 ----------- DB2  (FSMC_D2)
  93.              D3 ----------- DB3  (FSMC_D3)
  94.              D4 ----------- DB4  (FSMC_D4)
  95.              D5 ----------- DB5  (FSMC_D5)
  96.              D6 ----------- DB6  (FSMC_D6)
  97.              D7 ----------- DB7  (FSMC_D7)

  98. */

  99. #elif(OLED_MODE_SET == OLED_MODE_I2C )

  100. #else
  101. #error "OLED_MODE_SET error define'd in "
  102. #endif




  103. /******************************************************************************
  104.                             资料信息
  105. *******************************************************************************/
  106. /*
  107. ------------------------------------------------------------------
  108. | PA4-SPI1-NSS                  : SPI_CS#        3CS#          |
  109. | PA5-SPI1-SCK                  : SPI_SCLK        8D0         |
  110. | PA6-SPI1-MISO(DO)        : 无                                 |
  111. | PA7-SPI1-MOSI(DIO)        : SPI_SDIN        9D1         |
  112. | (可以不连接)PA6        : SPI_D/C#         5D/C#        |
  113. | (可以不连接)                : SPI_RES#         5RES#        |
  114. |  STM32的SPI可以工作在全双工,单向发送,单向接收模式,可以使用DMA方式操作

  115. */


  116. /******************************************************************************
  117.                             内部私有函数,移植时关意
  118. *******************************************************************************/
  119. /******************************************************************************
  120.                             内部函数  for os 的操作
  121. *******************************************************************************/
  122. /*
  123. *********************************************************************************************************
  124. *                                              VARIABLES
  125. *********************************************************************************************************
  126. */
  127. //#include "BSP_OS.h"
  128. //static  OS_EVENT   *OledDispSem;                /* Semaphore used to access display functions              */

  129. /*
  130. *********************************************************************************************************
  131. *                                       INITIALIZE RTOS SERVICES
  132. *
  133. * Description : This function creates a semaphore to ensure exclusive access to the LCD module and thus
  134. *               provide thread safe access to the display.
  135. *
  136. * Arguments   : none
  137. *
  138. * Returns     : none
  139. *********************************************************************************************************
  140. */

  141. void  OledDispInitOS (void)
  142. {
  143. #if 0   
  144. #if OS_EVENT_NAME_EN > 0
  145.     INT8U  err;
  146. #endif


  147.     OledDispSem  = OSSemCreate(1);              /* Create display access semaphore                         */
  148. #if OS_EVENT_NAME_EN > 0
  149.     OSEventNameSet(OledDispSem, (INT8U *)"Qt/OLED Lock", &err);
  150. #endif
  151. #endif
  152. }

  153. /*
  154. *********************************************************************************************************
  155. *                              EXCLUSIVE ACCESS FUNCTIONS TO THE DISPLAY
  156. *
  157. * Description : These functions are used to gain and release exclusive access to the LCD display.
  158. *
  159. * Arguments   : none
  160. *
  161. * Returns     : none
  162. *********************************************************************************************************
  163. */

  164. void  OledDispLock (void)
  165. {
  166. #if 0
  167.     INT8U  err;


  168.     OSSemPend(OledDispSem, 0, &err);            /* Obtain exclusive access to the display                  */
  169. #endif
  170. }



  171. void  OledDispUnlock (void)
  172. {
  173. #if 0
  174.     OSSemPost(OledDispSem);                     /* Release access to display                               */
  175. #endif
  176. }


  177. /******************************************************************************
  178.                             外部公用函数
  179. *******************************************************************************/
  180. /*
  181. *********************************************************************************************************
  182. *                                             DispInitPort()
  183. *
  184. * Description : Initialize the I/O ports used by the display driver.
  185. *
  186. * Arguments   : none.
  187. *
  188. * Returns     : none.
  189. *
  190. * Caller(s)   : DispInit().
  191. *
  192. * Notes       : none.
  193. *********************************************************************************************************
  194. */

  195. void  OLEDInitPort (void)
  196. {
  197.        
  198.         #if 0
  199.     GPIO_InitTypeDef GPIO_InitStructure;
  200.        
  201.         /* 使能 时钟 */
  202.         RCC_APB2PeriphclockCmd(SSD_CS_RCCAPB | SSD_SDIN_RCCAPB | SSD_SCK_RCCAPB, ENABLE);

  203.         /* 设置 SCK 为推挽输出 */
  204.         GPIO_InitStructure.GPIO_Pin = SSD_SCK_GPIO;
  205.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  206.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  207.         GPIO_Init(SSD_SCK_PORT, &GPIO_InitStructure);
  208.        
  209.         /* 设置 SDIN 为推挽输出 */
  210.         GPIO_InitStructure.GPIO_Pin = SSD_SDIN_GPIO;
  211.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  212.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  213.         GPIO_Init(SSD_SDIN_PORT, &GPIO_InitStructure);
  214.        
  215.         /* 设置 CS 为推挽输出 */
  216.         GPIO_InitStructure.GPIO_Pin = SSD_CS_GPIO;
  217.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  218.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  219.         GPIO_Init(SSD_CS_PORT, &GPIO_InitStructure);
  220.         #endif
  221.        
  222.         SSD_CS_INIT();
  223.         SSD_SDIN_INIT();
  224.         SSD_SCK_INIT();
  225.        
  226.         /* 设置 CS 为高 复位 */
  227.         SSD_CS_1();
  228.         SSD_SCK_1();
  229.         SSD_SDIN_1();
  230. }

  231. /*
  232. *********************************************************************************************************
  233. *        函 数 名: OLED_WriteCmd
  234. *        功能说明: 向ssd1306发送一字节命令
  235. *        形    参:命令字
  236. *        返 回 值: 无
  237. *********************************************************************************************************
  238. */
  239. static void OLED_WriteCmd(uint8_t _ucCmd)
  240. {
  241.         uint8_t i;

  242.         SSD_CS_0();

  243.         SSD_SCK_0();
  244.         SSD_SDIN_0();        /* 0 表示后面传送的是命令 1表示后面传送的数据 */
  245.         SSD_SCK_1();

  246.         for (i = 0; i < 8; i++)
  247.         {
  248.                 if (_ucCmd & 0x80)
  249.                 {
  250.                         SSD_SDIN_1();
  251.                 }
  252.                 else
  253.                 {
  254.                         SSD_SDIN_0();
  255.                 }
  256.                 SSD_SCK_0();
  257.                 _ucCmd <<= 1;
  258.                 SSD_SCK_1();
  259.         }

  260.         SSD_CS_1();
  261. }

  262. /*
  263. *********************************************************************************************************
  264. *        函 数 名: OLED_WriteData
  265. *        功能说明: 向SSD1306发送一字节数据
  266. *        形    参:命令字
  267. *        返 回 值: 无
  268. *********************************************************************************************************
  269. */
  270. static void OLED_WriteData(uint8_t _ucData)
  271. {
  272.         uint8_t i;

  273.         SSD_CS_0();

  274.         SSD_SCK_0();
  275.         SSD_SDIN_1();        /* 0 表示后面传送的是命令 1表示后面传送的数据 */
  276.         SSD_SCK_1();

  277.         for (i = 0; i < 8; i++)
  278.         {
  279.                 if (_ucData & 0x80)
  280.                 {
  281.                         SSD_SDIN_1();
  282.                 }
  283.                 else
  284.                 {
  285.                         SSD_SDIN_0();
  286.                 }
  287.                 SSD_SCK_0();
  288.                 _ucData <<= 1;
  289.                 SSD_SCK_1();
  290.         }

  291.         SSD_CS_1();
  292. }

  293. /*
  294. *********************************************************************************************************
  295. *        函 数 名: OLED_InitHard
  296. *        功能说明: 初始化OLED屏
  297. *        形    参:无
  298. *        返 回 值: 无
  299. *********************************************************************************************************
  300. */
  301. void OLED_Init(void)
  302. {
  303.         OLEDInitPort();
  304.        
  305.         OledDispInitOS();
  306.        
  307.         /* 上电延迟 */
  308.         DispDly_uS(5000);
  309.        
  310.         OledDispLock();
  311.        
  312. #if 1
  313.          /* 模块厂家提供初始化代码 */
  314.         OLED_WriteCmd(0xAE);        /* 关闭OLED面板显示(休眠) */
  315.         OLED_WriteCmd(0x00);        /* 设置列地址低4bit */
  316.         OLED_WriteCmd(0x10);        /* 设置列地址高4bit */
  317.         OLED_WriteCmd(0x40);        /* 设置起始行地址(低5bit 0-63), 硬件相关*/

  318.         OLED_WriteCmd(0x81);        /* 设置对比度命令(双字节命令),第1个字节是命令,第2个字节是对比度参数0-255 */
  319.         OLED_WriteCmd(0xCF);        /* 设置对比度参数 */

  320.         OLED_WriteCmd(0xA1);        /* A0 :列地址0映射到SEG0; A1 :列地址127映射到SEG0 */
  321.         OLED_WriteCmd(0xA6);        /* A6 : 设置正常显示模式; A7 : 设置为反显模式 */

  322.         OLED_WriteCmd(0xA8);        /* 设置COM路数 */
  323.         OLED_WriteCmd(0x3F);        /* 1 ->(63+1)路 */

  324.         OLED_WriteCmd(0xD3);        /* 设置显示偏移(双字节命令)*/
  325.         OLED_WriteCmd(0x00);        /* 无偏移 */

  326.         OLED_WriteCmd(0xD5);        /* 设置显示时钟分频系数/振荡频率 */
  327.         OLED_WriteCmd(0x80);        /* 设置分频系数,高4bit是分频系数,低4bit是振荡频率 */

  328.         OLED_WriteCmd(0xD9);        /* 设置预充电周期 */
  329.         OLED_WriteCmd(0xF1);        /* [3:0],PHASE 1; [7:4],PHASE 2; */

  330.         OLED_WriteCmd(0xDA);        /* 设置COM脚硬件接线方式 */
  331.         OLED_WriteCmd(0x12);

  332.         OLED_WriteCmd(0xDB);        /* 设置 vcomh 电压倍率 */
  333.         OLED_WriteCmd(0x40);        /* [6:4] 000 = 0.65 x VCC; 0.77 x VCC (RESET); 0.83 x VCC  */

  334.         OLED_WriteCmd(0x8D);        /* 设置充电泵(和下个命令结合使用) */
  335.         OLED_WriteCmd(0x14);        /* 0x14 使能充电泵, 0x10 是关闭 */
  336.         OLED_WriteCmd(0xAF);        /* 打开OLED面板 */
  337. #else
  338.          /* 模块厂家提供初始化代码 悠景科技 UG-2864HSWEG01 Evaluation Kit User Guide.pdf */
  339.         OLED_WriteCmd(0xAE);        /* 关闭OLED面板显示(休眠) */
  340.         OLED_WriteCmd(0x00);        /* 设置列地址低4bit */
  341.         OLED_WriteCmd(0x10);        /* 设置列地址高4bit */
  342.        
  343. /*1、Set Mux ration*/
  344.         OLED_WriteCmd(0xA8);        /* 设置COM路数 */
  345.         OLED_WriteCmd(0x3F);        /* 1 ->(63+1)路 */
  346. /*2、Set Display offset*/
  347.         OLED_WriteCmd(0xD3);        /* 设置显示偏移(双字节命令)*/
  348.         OLED_WriteCmd(0x00);        /* 无偏移 */
  349. /*3、Set Display Start line  与Display offset 组合可以做来偏移效果,修改硬件上安装不足*/
  350.         OLED_WriteCmd(0x40);        /*0x40~0x7f 设置起始行地址(低5bit 0-63), 硬件相关 */
  351.         /*0x40         设置起始行地址0: RAM row 0 ->COM0
  352.           0X41  设置起始行地址1: RAM row 1 ->COM0        */       
  353. /*4、Set Segment re-map  SEG列-128   COM行-64*/
  354.         OLED_WriteCmd(0xA1);        /* 默认0xA0 :列地址0映射到SEG0; 0xA1 :列地址127映射到SEG0 */
  355. /*5、Set COM Output Scan Direction */
  356.         OLED_WriteCmd(0xC0);   /*0xc0 由下向上; 0XC8 由上向下  不设置或者默认值影响不大*/
  357. /*6、Set COM Pins hardware configuration*/       
  358.         OLED_WriteCmd(0xDA);        /* 设置COM脚硬件接线方式 */
  359.         OLED_WriteCmd(0x12);       
  360. /*7、Set Contrast Control*/
  361.         OLED_WriteCmd(0x81);        /* 设置对比度命令(双字节命令),第1个字节是命令,第2个字节是对比度参数0-255 */
  362.         OLED_WriteCmd(0xCF);        /* 设置对比度参数  0x00 ~0xff*/
  363. /*8、Set Normal Display*/
  364.         OLED_WriteCmd(0xA6);        /* A6 : 设置正常允灸J? A7 : 设置为反显模式 */          
  365. /*9、Set Osc Frequency*/                                                       
  366.         OLED_WriteCmd(0xD5);        /* 设置显示时钟分频系数/振荡频率 */
  367.         OLED_WriteCmd(0x80);        /* 设置分频系数,高4bit是分频系数,低4bit是振荡频率 */

  368.         OLED_WriteCmd(0xD9);        /* 设置预充电周期 */
  369.         OLED_WriteCmd(0xF1);        /* [3:0],PHASE 1; [7:4],PHASE 2; */

  370.         OLED_WriteCmd(0xDB);        /* 设置 vcomh 电压倍率 */
  371.         OLED_WriteCmd(0x40);        /* [6:4] 000 = 0.65 x VCC; [6:4] 010 =0.77 x VCC (RESET); [6:4] 01 =0.83 x VCC  */
  372. /*9、Enalbe charge pump regulator*/
  373.         OLED_WriteCmd(0x8D);        /* 设置充电泵(和下个命令结合使用) */
  374.         OLED_WriteCmd(0x14);        /* 0x14 使能充电泵, 0x10 是关闭 */
  375. /*10、Display On */
  376.         OLED_WriteCmd(0xAF);        /* 打开OLED面板 */
  377. #endif

  378.         OledDispUnlock();
  379. }

  380. /*
  381. *********************************************************************************************************
  382. *        函 数 名: OLED_DispOn
  383. *        功能说明: 打开显示
  384. *        形    参:无
  385. *        返 回 值: 无
  386. *********************************************************************************************************
  387. */
  388. void OLED_DispOn(void)
  389. {       
  390.         OledDispLock();
  391.        
  392.         OLED_WriteCmd(0x8D);        /* 设置充电泵(和下个命令结合使用) */
  393.         OLED_WriteCmd(0x14);        /* 0x14 使能充电泵, 0x10 是关闭 */
  394.         OLED_WriteCmd(0xAF);        /* 打开OLED面板 */
  395.        
  396.         OledDispUnlock();
  397. }

  398. /*
  399. *********************************************************************************************************
  400. *        函 数 名: OLED_DispOff
  401. *        功能说明: 关闭显示
  402. *        形    参:无
  403. *        返 回 值: 无
  404. *********************************************************************************************************
  405. */
  406. void OLED_DispOff(void)
  407. {       
  408.         OledDispLock();

  409.         OLED_WriteCmd(0x8D);        /* 设置充电泵(和下个命令结合使用)*/
  410.         OLED_WriteCmd(0x10);        /* 0x14 使能充电泵,0x10 是关闭 */
  411.         OLED_WriteCmd(0xAE);        /* 打开OLED面板 */
  412.        
  413.         OledDispUnlock();
  414. }

  415. /*---------  void OLED_DispContrast(unsigned char val)  -----
  416. 形式参数:val对比度参数  0X00 ~ 0XFF                                            
  417. 返回值:void
  418. 函数描述:设置对比度
  419. ------------------------------------------*/
  420. void OLED_DispContrast(uint8_t val)
  421. {       
  422.         OledDispLock();
  423.        
  424.         OLED_WriteCmd(0x81);        /* 设置对比度命令(双字节命令),第1个字节是命令,第2个字节是对比度参数0-255 */
  425.         OLED_WriteCmd(val);        /* 设置对比度参数  0x00 ~0xff*/
  426.        
  427.         OledDispUnlock();
  428. }

  429. void  OledDispClrScr (void)
  430. {

  431. }

  432. /*
  433. *********************************************************************************************************
  434. *        函 数 名: OLED_PutPixel
  435. *        功能说明: 画1个像素
  436. *        形    参:
  437. *                        tsX,tsY : 像素坐标
  438. *                        tcColor  :像素颜色
  439. *        返 回 值: 无
  440. *********************************************************************************************************
  441. */
  442. #if 0
  443. void OLED_PutPixel(uint16_t tsX, uint16_t tsY, uint8_t tcColor)
  444. {
  445.         uint8_t ucValue;
  446.         uint8_t ucPageAddr;
  447.         uint8_t ucColAddr;
  448.        
  449.         #ifdef TRUN_180_EN
  450.         ucPageAddr = tsY / 8;
  451.         ucColAddr = 127 - tsX;
  452.         #else
  453.         ucPageAddr = 7 - tsY / 8;
  454.         ucColAddr = tsX;
  455.         #endif
  456.        
  457.         OledDispLock();
  458.        
  459.         OLED_WriteCmd (0xB0 + ucPageAddr);                                        /* 设置页地址(0~7) */
  460.         OLED_WriteCmd (0x00 + (ucColAddr & 0x0F));                        /* 设置列地址的低地址 */
  461.         OLED_WriteCmd (0x10 + ((ucColAddr >> 4) & 0x0F));        /* 设置列地址的高地址 */
  462.         OLED_WriteData(ucValue);
  463.        
  464.         OledDispUnlock();

  465. }
  466. #else

  467. /* 使用缓冲区的概念,减少对硬件的频繁操作*/

  468. /* 12864 OLED的显存镜像,占用1K字节. 共8行,每行128像素 */
  469. static uint8_t stcGRAM[8][128];
  470. void OLED_PutPixel(uint16_t tsX, uint16_t tsY, uint8_t tcColor)
  471. {
  472.         uint8_t ucValue;
  473.         uint8_t ucPageAddr;
  474.         uint8_t ucColAddr;
  475.         uint8_t mflag=false; //如果数据相同不用更新数据
  476. #ifdef TRUN_180_EN
  477.         const uint8_t aOrTab[8]  = {0x01, 0x02, 0x04, 0x08,0x10,0x20,0x40,0x80};
  478.         const uint8_t aAndTab[8] = {0xFE, 0xFD, 0xFB, 0xF7,0xEF,0xDF,0xBF,0x7F};

  479.         ucPageAddr = tsY / 8;
  480.         ucColAddr = 127 - tsX;
  481. #else
  482.         const uint8_t aOrTab[8]  = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
  483.         const uint8_t aAndTab[8] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};

  484.         ucPageAddr = 7 - tsY / 8;
  485.         ucColAddr = tsX;
  486. #endif
  487.         OledDispLock();
  488.         ucValue = stcGRAM[ucPageAddr][ucColAddr];
  489.         if (tcColor == 0)
  490.         {
  491.                
  492.                 if( (ucValue&aAndTab[tsY % 8]) != ucValue )  //数据发生变化
  493.                 {       
  494.                         mflag=true;
  495.                         ucValue &= aAndTab[tsY % 8];
  496.                 }
  497.                
  498.         }
  499.         else
  500.         {       
  501.                 if( (ucValue|aOrTab[tsY % 8]) != ucValue )  //数据发生变化
  502.                 {       
  503.                         mflag=true;
  504.                         ucValue |= aOrTab[tsY % 8];
  505.                 }
  506.         }
  507.        
  508.         if( mflag==true )
  509.         {
  510.                 stcGRAM[ucPageAddr][ucColAddr] = ucValue;

  511.                 //if (stcUpdateEn == 1)
  512.                 {       
  513.                        
  514.                         OLED_WriteCmd (0xB0 + ucPageAddr);                                        /* 设置页地址(0~7) */
  515.                         OLED_WriteCmd (0x00 + (ucColAddr & 0x0F));                        /* 设置列地址的低地址 */
  516.                         OLED_WriteCmd (0x10 + ((ucColAddr >> 4) & 0x0F));        /* 设置列地址的高地址 */
  517.                         OLED_WriteData(ucValue);
  518.                        
  519.                 }
  520.         }
  521.        
  522.         OledDispUnlock();
  523. }
  524. #endif

  525. /*
  526. *********************************************************************************************************
  527. *        函 数 名: OLED_ClrScr
  528. *        功能说明: 清屏
  529. *        形    参:tcMode : 0 表示全黑; 0xFF表示全亮
  530. *        返 回 值: 无
  531. *********************************************************************************************************
  532. */
  533. void OLED_ClrScr(uint8_t tcMode)
  534. {
  535.         uint8_t i,j;
  536.        
  537.         OledDispLock();
  538.         for (i = 0 ; i < 8; i++)
  539.         {       
  540.                 OLED_WriteCmd (0xB0 + i);        /* 设置页地址(0~7) */
  541.                 OLED_WriteCmd (0x00);                /* 设置列地址的低地址 */
  542.                 OLED_WriteCmd (0x10);                /* 设置列地址的高地址 */
  543.                 for (j = 0 ; j < 128; j++)
  544.                 {
  545.                         stcGRAM[i][j] = tcMode;
  546.                         OLED_WriteData(stcGRAM[i][j]);
  547.                 }
  548.         }
  549.         OledDispUnlock();
  550. }
复制代码



wenuani 2017-11-18 15:28:06
对这方面很感兴趣,但是一些东西又不懂..
回复

举报

dvd1478 2017-11-19 10:27:55
wenuani 发表于 2017-11-18 15:28
对这方面很感兴趣,但是一些东西又不懂..

我也是很多东西都不懂,只能一步一步走啦~
回复

举报

雨的印记111 2017-12-23 16:54:56
牛逼的楼主  厉害了
回复

举报

只有小组成员才能发言,加入小组>>

629个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表