[原创] 【TI首届低功耗设计大赛】+ 初试 SPI 驱动的 OLED

azhiking   2014-11-18 21:08 楼主
使用MSP430FR5969 驱动SPI接口的OLED。OLED采用SSD1603的驱动芯片。 先上图: IMG_20141105_131104.jpg IMG_20141105_131125.jpg 显示了中文字符和ASCII码 IMG_20141105_131114.jpg 初步测试了一下,OLED的功耗与其亮度,显示的字符数量等关系比较大, 当全部关闭的时候,有uA级别的电流消耗。 到目前为止还有画点的驱动尚未完成。下一步还需要完成菜单的制作。 本帖最后由 azhiking 于 2014-11-18 21:08 编辑

回复评论 (4)

  1. static VOID DRV_SSD1306_SendCmd(UBYTE ucCmd)
  2. {
  3.         /* 选择指令通道 */
  4.         SSD1306_SelectCmd();
  5.         /* 选通LCD模块 */
  6.         SSD1306_ActiveLcdSpiCS();
  7.         /* 发送命令 */
  8.         SSD1306_Send(ucCmd);
  9.         /* 封锁LCD模块 */
  10.         SSD1306_InactiveLcdSpiCS();
  11.         SSD1306_SelectData();
  12. }
  1. static VOID DRV_SSD1306_SendData(UBYTE ucData)
  2. {
  3.         /* 选择数据通道 */
  4.         SSD1306_SelectData();
  5.         /* 选通LCD模块 */
  6.         SSD1306_ActiveLcdSpiCS();
  7.         /* 发送命令 */
  8.         SSD1306_Send(ucData);
  9.         /* 封锁LCD模块 */
  10.         SSD1306_InactiveLcdSpiCS();
  11.         SSD1306_SelectData();
  12. }
  1. static VOID DRV_SSD1306_SetContrast(UBYTE ucData)
  2. {
  3.         DRV_SSD1306_SendCmd(0x81);                        // Set Contrast Control
  4.         DRV_SSD1306_SendCmd(ucData);                        //   Default => 0x7F
  5. }
  1. static VOID DRV_SSD1306_SetStartPage(UBYTE ucData)
  2. {
  3.         DRV_SSD1306_SendCmd(0xB0 | ucData);                        //   Default => 0xB0 (0x00)
  4. }
  1. static VOID DRV_SSD1306_SetStartLine(UBYTE ucData)
  2. {
  3.         DRV_SSD1306_SendCmd(0x40 | ucData);                        // Set Display Start Line
  4.                                                 //   Default => 0x40 (0x00)
  5. }
  1. static VOID DRV_SSD1306_SetStartColumn(UBYTE ucData)
  2. {
  3.     // Set Lower Column Start Address for Page Addressing Mode
  4.         DRV_SSD1306_SendCmd(0x00 + (ucData % 16));                        //   Default => 0x00
  5.         // Set Higher Column Start Address for Page Addressing Mode
  6.         DRV_SSD1306_SendCmd(0x10 + (ucData / 16));                        //   Default => 0x00
  7. }
  1. static VOID DRV_SSD1306_SetDisplayOnOff(UBYTE ucData)       
  2. {
  3.         DRV_SSD1306_SendCmd(0xAE | ucData);                        // Set Display On/Off
  4.                                                 //   Default => 0xAE
  5.                                                 //     0xAE (0x00) => Display Off
  6.                                                 //     0xAF (0x01) => Display On
  7. }
  1. static VOID DRV_SSD1306_SetEntireDisplay(UBYTE ucData)
  2. {
  3.         DRV_SSD1306_SendCmd(0xA4 | ucData);                        // Set Entire Display On / Off
  4.                                                 //   Default => 0xA4
  5.                                                 //     0xA4 (0x00) => Normal Display
  6.                                                 //     0xA5 (0x01) => Entire Display On
  7. }
  1. static VOID DRV_SSD1306_SetInverseDisplay(UBYTE ucData)
  2. {
  3.         DRV_SSD1306_SendCmd(0xA6 | ucData);                        // Set Inverse Display On/Off
  4.                                                 //   Default => 0xA6
  5.                                                 //     0xA6 (0x00) => Normal Display
  6.                                                 //     0xA7 (0x01) => Inverse Display On
  7. }
  1. static VOID DRV_SSD1306_FillRam(UBYTE ucData)
  2. {
  3.         UBYTE ucLoopi,ucLoopj;

  4.         for(ucLoopi = 0; ucLoopi < 8; ucLoopi++)
  5.         {
  6.             DRV_SSD1306_SetStartPage(ucLoopi);
  7.             DRV_SSD1306_SetStartColumn(0x00);
  8.             for(ucLoopj = 0; ucLoopj < 128; ucLoopj++)
  9.             {
  10.                 DRV_SSD1306_SendData(ucData);
  11.             }
  12.         }   
  13. }
  1. void DRV_SSD1306_FillBlock(UBYTE ucData, UBYTE a, UBYTE b, UBYTE c, UBYTE d)
  2. {
  3.     UBYTE ucLoopi,ucLoopj;
  4.        
  5.         for(ucLoopi = a; ucLoopi <(b+1) ; ucLoopi++)
  6.         {
  7.                 DRV_SSD1306_SetStartPage(ucLoopi);
  8.                 DRV_SSD1306_SetStartColumn(c);

  9.                 for(ucLoopj = 0;ucLoopj < d; ucLoopj++)
  10.                 {
  11.                         DRV_SSD1306_SendData(ucData);
  12.                 }
  13.         }
  14. }


点赞  2015-1-6 00:10
  1. void DRV_SSD1306_Sleep(UBYTE a)
  2. {
  3.         switch(a)
  4.         {
  5.                 case 0:
  6.                         DRV_SSD1306_SetDisplayOnOff(0x00);
  7.                         DRV_SSD1306_SetEntireDisplay(0x01);
  8.                         break;
  9.                 case 1:
  10.                         DRV_SSD1306_SetEntireDisplay(0x00);
  11.                         DRV_SSD1306_SetDisplayOnOff(0x01);
  12.                         break;
  13.         }
  14. }
  1. UWORD DRV_SSD1306_Init(VOID)

  2. {
  3.     /* 拉低复位脚 */
  4.     BSP_ActiveLcdRst();
  5.     BSP_UsDelay(100);
  6.     BSP_InactiveLcdRst();

  7.     DRV_SSD1306_SetDisplayOnOff(0x00); // Display Off (0x00/0x01)

  8.     DRV_SSD1306_SendCmd(0xD5); // Set Clock as 100 Frames/Sec
  9.     DRV_SSD1306_SendCmd(0x80);

  10.     DRV_SSD1306_SendCmd(0xA8); // 1/64 Duty (0x0F~0x3F)
  11.     DRV_SSD1306_SendCmd(0x3F);

  12.     DRV_SSD1306_SendCmd(0xD3);// Shift Mapping RAM Counter (0x00~0x3F)
  13.     DRV_SSD1306_SendCmd(0x00);

  14.     DRV_SSD1306_SendCmd(0x40 | 0x00);// Set Mapping RAM Display Start Line (0x00~0x3F)  
  15.    
  16.     DRV_SSD1306_SendCmd(0x8D);// Enable Embedded DC/DC Converter (0x00/0x04)
  17.     DRV_SSD1306_SendCmd(0x10 | 0x04);
  18.    
  19.     DRV_SSD1306_SendCmd(0x20);// Set Page Addressing Mode (0x00/0x01/0x02)
  20.     DRV_SSD1306_SendCmd(0x02);
  21.    
  22.     DRV_SSD1306_SendCmd(0xA0 | 0x01);// Set SEG/Column Mapping (0x00/0x01)
  23.    
  24.     DRV_SSD1306_SendCmd(0xC0 | 0x08);// Set COM/Row Scan Direction (0x00/0x08)
  25.    
  26.     DRV_SSD1306_SendCmd(0xDA);
  27.     DRV_SSD1306_SendCmd(0x02 | 0x10);// Set Sequential Configuration (0x00/0x10)

  28.     DRV_SSD1306_SetContrast(0xCF);  // Set SEG Output Current
  29.    
  30.     DRV_SSD1306_SendCmd(0xD9);  // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  31.     DRV_SSD1306_SendCmd(0xF1);

  32.     DRV_SSD1306_SendCmd(0xDB);  // Set VCOM Deselect Level
  33.     DRV_SSD1306_SendCmd(0x40);
  34.    
  35.     DRV_SSD1306_SetEntireDisplay(0x00);  // Disable Entire Display On (0x00/0x01)
  36.    
  37.     DRV_SSD1306_SetInverseDisplay(0x00);  // Disable Inverse Display On (0x00/0x01)

  38.     /* set contrast */
  39.     DRV_SSD1306_SetContrast(Brightness);
  40.    
  41.     /* 清除显示缓冲区 */
  42.     DRV_SSD1306_FillRam(0x00);
  43.    
  44.     DRV_SSD1306_SetDisplayOnOff(0x01);   // Display On (0x00/0x01)
  45.    
  46.     //DRV_SSD1306_FillRam(0xFF);
  47.     return SYS_NO_ERROR;
  48. }


点赞  2015-1-6 00:12
工作电流多大?
点赞  2015-1-30 12:46
全开的话大概十几个mA
点赞  2015-1-30 14:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复