找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6419|回復: 1
收起左側(cè)

基于STM32F4系列單片機的OLED驅(qū)動程序源碼

[復制鏈接]
ID:382792 發(fā)表于 2018-8-5 13:54 | 顯示全部樓層 |閱讀模式
自己在驅(qū)動oled的時候找了很多資料,看了很多示例代碼?傆X得那些代碼兼容性很好,但是作為單片機初學者來說
過于冗雜。所以自己整理了一下。加上了一點自己想法,寫了這個精簡版得oled驅(qū)動程序。

實物圖如下:
A1DC94A86FBDEA723F8E0BD831446953.jpg 0.jpg

單片機源程序如下:
  1. /*
  2.         STM32F429               
  3.         這個是基于9.6 oled的驅(qū)動程序
  4.         僅供學習參考,代碼較為簡單,未進行注釋
  5.         交流聯(lián)系方式 1452912499@qq.com
  6. #       
  7. */

  8. #include "bsp_SPI.h"

  9. uint32_t time;
  10. uint8_t OLED_GRAM[8][128];

  11. extern uint8_t font[94][16];

  12. void SPI_Config(void)
  13. {
  14.         GPIO_InitTypeDef GP;
  15.        
  16.         RCC_AHB1PeriphClockCmd(SPI_NSS_CLK|SPI_SCK_CLK|SPI_MOSI_CLK|SPI_DC_CLK|SPI_REST_CLK,ENABLE);
  17.        
  18.        
  19.         GP.GPIO_Mode =GPIO_Mode_OUT;
  20.         GP.GPIO_OType = GPIO_OType_PP;
  21.         GP.GPIO_PuPd = GPIO_PuPd_UP;
  22.         GP.GPIO_Speed = GPIO_Speed_50MHz;
  23.        
  24.        
  25.         GP.GPIO_Pin = SPI_NSS_Pin;
  26.         GPIO_Init(SPI_NSS_Port,&GP);

  27.        
  28.         GP.GPIO_Pin = SPI_REST_Pin;
  29.         GPIO_Init(SPI_REST_Port,&GP);

  30.        
  31.         GP.GPIO_Pin = SPI_DC_Pin;
  32.         GPIO_Init(SPI_DC_Port,&GP);

  33.        
  34.         GP.GPIO_Pin = SPI_SCK_Pin;
  35.         GPIO_Init(SPI_SCK_Port,&GP);

  36.        
  37.         GP.GPIO_Pin = SPI_MOSI_Pin;
  38.         GPIO_Init(SPI_MOSI_Port,&GP);
  39.        
  40.         DC_HIGH
  41.         CS_HIGH
  42.         DATA_HIGH
  43.         CLK_HIGH
  44.        
  45. }


  46. void OLED_Config(void)
  47. {
  48.        

  49.        
  50.         SysTick_Init();

  51.         Rest_HIGH
  52.         Delay_us(10000);
  53.         Rest_LOW//初始化
  54.         Delay_us(10000);
  55.         Rest_HIGH
  56.        
  57.   Write(0xAE,CMD);//--turn off oled panel
  58.         Write(0x00,CMD);//---set low column address
  59.         Write(0x10,CMD);//---set high column address
  60.         Write(0x40,CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  61.         Write(0x81,CMD);//--set contrast control register
  62.         Write(0xCF,CMD); // Set SEG Output Current Brightness
  63.         Write(0xA1,CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  64.         Write(0xC8,CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  65.         Write(0xA6,CMD);//--set normal display
  66.         Write(0xA8,CMD);//--set multiplex ratio(1 to 64)
  67.         Write(0x3f,CMD);//--1/64 duty
  68.         Write(0xD3,CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  69.         Write(0x00,CMD);//-not offset
  70.         Write(0xd5,CMD);//--set display clock divide ratio/oscillator frequency
  71.         Write(0x80,CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  72.         Write(0xD9,CMD);//--set pre-charge period
  73.         Write(0xF1,CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  74.         Write(0xDA,CMD);//--set com pins hardware configuration
  75.         Write(0x12,CMD);
  76.         Write(0xDB,CMD);//--set vcomh
  77.         Write(0x40,CMD);//Set VCOM Deselect Level
  78.         Write(0x20,CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  79.         Write(0x02,CMD);//
  80.         Write(0x8D,CMD);//--set Charge Pump enable/disable
  81.         Write(0x14,CMD);//--set(0x10) disable
  82.         Write(0xA4,CMD);// Disable Entire Display On (0xa4/0xa5)
  83.         Write(0xA6,CMD);// Disable Inverse Display On (0xa6/a7)
  84.         Write(0xAF,CMD);//--turn on oled panel
  85.        
  86.         OLED_Clear();
  87. }

  88. void Updata(void)
  89. {
  90.        
  91.        
  92.         uint8_t i,n;
  93.   for(i=0;i<8;i++)
  94.   {
  95.         Write(0xb0+i,CMD);
  96.         Write(0x00,CMD);
  97.         Write(0x10,CMD);
  98.         for(n=0;n<128;n++){Write(OLED_GRAM[i][n],DATA);}
  99.   }
  100. }


  101. void Write(uint8_t data,uint8_t x)
  102. {
  103.         uint8_t i;
  104.         if(x)
  105.         {
  106.                 DC_HIGH
  107.         }
  108.         else
  109.         {
  110.                 DC_LOW
  111.         }
  112.         CS_LOW
  113. for(i=0;i<8;i++)
  114.         {
  115.                 CLK_LOW
  116.                 if(data&0x80)
  117.                         DATA_HIGH
  118.                 else
  119.                         DATA_LOW
  120.                 CLK_HIGH
  121.                 data<<=1;  
  122.         }
  123.         CS_HIGH
  124.         DC_HIGH
  125. }

  126. void OLED_Clear(void)
  127. {
  128.        
  129.         uint8_t i,n;       
  130.   for(i=0;i<8;i++)
  131.   {
  132.         Write(0xb0+i,CMD);
  133.         Write(0x00,CMD);
  134.         Write(0x10,CMD);
  135.         for(n=0;n<128;n++)Write(0x00,DATA);
  136.   }
  137.        

  138. }


  139. void ConPart(uint8_t x,uint8_t y,uint8_t *map)
  140. {
  141.         uint8_t y2;
  142.         for(y2 =0;y2<8&&y2+y<128;y2++)
  143.         {
  144.                                 OLED_GRAM[x][y2+y] = *(map+y2);
  145.         }
  146. ……………………

  147. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
OLED-429模擬SPI.rar (4.2 MB, 下載次數(shù): 113)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:517861 發(fā)表于 2019-8-28 11:16 | 顯示全部樓層
看起來很厲害的樣子
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表