找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4563|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

GD32E230 SPI方式驅(qū)動(dòng)SSD1306源碼 128*64 OLED屏

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:877801 發(fā)表于 2021-1-18 16:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      幾年前用藍(lán)牙芯片開(kāi)發(fā)一個(gè)項(xiàng)目,買(mǎi)了SmartRF開(kāi)發(fā)板,上面帶一個(gè)12864的OLED屏,最近在做一個(gè)IIC的OLED屏的項(xiàng)目,把這套板子找出來(lái)打算先把顯示的目錄系統(tǒng)做了。簡(jiǎn)單撇了一眼資料,寫(xiě)的IIC的驅(qū)動(dòng)例程,可看程序不對(duì)呀,驅(qū)動(dòng)方式明明是SPI的,怎么就IIC的例程呢?于是我找原理圖看了一下果然沒(méi)有開(kāi)漏的兩個(gè)上拉電阻。找找原來(lái)用過(guò)的配套軟件,沒(méi)找到,只好拿一塊前陣子調(diào)試GDE230的板子往上懟了。      好了,萬(wàn)事俱備了,老鐵,上吧!把程序移植到GD32E上,沒(méi)仿真,直接上,結(jié)果啥也沒(méi)有顯示。我坐在電腦前想了半天,想這個(gè)仿SIP的程序很簡(jiǎn)單呀,51時(shí)我就寫(xiě)個(gè),做PIC690和917時(shí),LPC2000時(shí),包括當(dāng)初做STM32時(shí)都寫(xiě)過(guò),不可能不好用呀!于是我搬出好久未用的用示波器測(cè)了測(cè)波形,兩個(gè)板子對(duì)比了一下,結(jié)果發(fā)現(xiàn)GD32E230的做CLK的那個(gè)引腳沒(méi)有輸出。血的教訓(xùn)告訴我,用過(guò)的板子一定做好記錄,要不就直接扔了,太耽誤事了!

       好了,這個(gè)程序是直接移植過(guò)來(lái)的,能實(shí)現(xiàn)數(shù)字,英文,漢字和圖片的顯示,顯示字符的程序我修改了一下,加上了反顯,上程序!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

單片機(jī)源程序如下:
  1. #ifndef __SSD1306_SPI_H
  2. #define        __SSD1306_SPI_H

  3. #include "gd32e230.h"
  4. /*******************************宏定義****************************************/
  5. #define XLevelL                        0x00
  6. #define XLevelH                        0x10
  7. #define XLevel                ((XLevelH&0x0F)*16+XLevelL)
  8. #define Max_Column            128
  9. #define Max_Row                        64
  10. #define        Brightness            0xCF
  11. #define X_WIDTH                 128
  12. #define Y_WIDTH                 64

  13. //-----------------OLED端口定義----------------

  14. #define OLED_CS_Clr() GPIO_BC(GPIOB) = GPIO_PIN_0
  15. #define OLED_CS_Set() GPIO_BOP(GPIOB) = GPIO_PIN_0      //接OLED模塊CS    B0

  16. #define OLED_DC_Clr() GPIO_BC(GPIOB) = GPIO_PIN_1
  17. #define OLED_DC_Set() GPIO_BOP(GPIOB) = GPIO_PIN_1      //接OLED模塊D/C  B1

  18. #define OLED_SDA_Clr() GPIO_BC(GPIOB) = GPIO_PIN_8
  19. #define OLED_SDA_Set() GPIO_BOP(GPIOB) = GPIO_PIN_8    //接OLED模塊MOSI  B8

  20. #define OLED_SCL_Clr() GPIO_BC(GPIOA) = GPIO_PIN_7
  21. #define OLED_SCL_Set() GPIO_BOP(GPIOA) = GPIO_PIN_7    //接OLED模塊的CLK  B9

  22. //#define OLED_CMD  0        //寫(xiě)命令
  23. //#define OLED_DATA 1        //寫(xiě)數(shù)據(jù)

  24. //OLED控制用函數(shù)
  25. void OLED_WrDat(unsigned char dat);//寫(xiě)數(shù)據(jù)
  26. void OLED_WrCmd(unsigned char cmd);//寫(xiě)命令
  27. void OLED_SetPos(unsigned char x, unsigned char y);//設(shè)置起始點(diǎn)坐標(biāo)
  28. void OLED_Fill(unsigned char bmp_dat);//全屏填充
  29. void OLED_CLS(void);//清屏
  30. void OLED_Init(void);//初始化
  31. void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[]);
  32. //void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char ch[]);
  33. void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char FB,unsigned char ch[]);
  34. void OLED_16x16CN(unsigned char x, unsigned char y, unsigned char N);
  35. void OLED_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]);

  36. #endif

  37. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. #include "SSD1306_SPI.h"
  39. #include "systick.h"
  40. #include "codetab.h"


  41. void delay(uint32_t nCount)
  42. {
  43.     unsigned int a;
  44.     while(nCount)
  45.     {
  46.         a=1800;
  47.         while(a--);
  48.         nCount--;
  49.     }
  50.     return;
  51. }

  52. void OLED_WrDat(unsigned char dat)//寫(xiě)數(shù)據(jù)
  53. {
  54.         unsigned char i, temp=0;
  55.         OLED_DC_Set();
  56.         for(i=0;i<8;i++) //發(fā)送一個(gè)八位數(shù)據(jù)
  57.     {
  58.         OLED_SCL_Clr();
  59.         temp = dat&0x80;
  60.         if (temp == 0)
  61.         {
  62.             OLED_SDA_Clr();
  63.         }
  64.         else
  65.         {
  66.             OLED_SDA_Set();
  67.         }
  68.                                 //delay_1ms(1U);
  69.         OLED_SCL_Set();            
  70.         dat<<=1;
  71.         //delay_1ms(1U);                                
  72.     }
  73. }

  74. void OLED_WrCmd(unsigned char cmd)//寫(xiě)命令
  75. {
  76.           unsigned char i, temp=0;
  77.           OLED_DC_Clr();
  78.     for(i=0;i<8;i++) //發(fā)送一個(gè)八位數(shù)據(jù)
  79.     {
  80.         OLED_SCL_Clr();
  81.         temp = cmd&0x80;
  82.         if (temp == 0)
  83.         {
  84.             OLED_SDA_Clr();
  85.         }
  86.         else
  87.         {
  88.             OLED_SDA_Set();
  89.         }
  90.         OLED_SCL_Set();
  91.         cmd<<=1;;                        
  92.     }            
  93. }

  94. void OLED_SetPos(unsigned char x, unsigned char y)//設(shè)置起始點(diǎn)坐標(biāo)
  95. {
  96.         OLED_WrCmd(0xb0 + y);
  97.         OLED_WrCmd(((x&0xf0)>>4)|0x10);
  98.         OLED_WrCmd((x&0x0f)|0x01);
  99. }

  100. void OLED_Fill(unsigned char bmp_dat)//全屏填充
  101. {
  102.         unsigned char y,x;
  103.         for(y=0;y<8;y++)
  104.         {
  105.                 OLED_WrCmd(0xb0+y);
  106.                 OLED_WrCmd(0x01);
  107.                 OLED_WrCmd(0x10);
  108.                 for(x=0;x<X_WIDTH;x++)
  109.                 {
  110.                         OLED_WrDat(bmp_dat);
  111.                 }
  112.         }
  113. }

  114. void OLED_CLS(void)//清屏
  115. {
  116.         OLED_Fill(0x00);
  117. }

  118. void OLED_Init(void)
  119. {
  120.           rcu_periph_clock_enable(RCU_GPIOB);
  121.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_0);
  122.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0);        
  123.           gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_1);
  124.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
  125.           gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_8);
  126.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);        
  127.                 rcu_periph_clock_enable(RCU_GPIOA);
  128.     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_7);
  129.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);        
  130.         
  131.           OLED_SCL_Set();
  132.           OLED_CS_Clr();
  133.           delay(100);
  134.           OLED_CS_Set();
  135.         
  136.     OLED_WrCmd(0xae);//--turn off oled panel
  137.     OLED_WrCmd(0x00);//---set low column address
  138.     OLED_WrCmd(0x10);//---set high column address
  139.     OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  140.     OLED_WrCmd(0x81);//--set contrast control register
  141.     OLED_WrCmd(0xcf); // Set SEG Output Current Brightness
  142.     OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  143.     OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  144.     OLED_WrCmd(0xa6);//--set normal display
  145.     OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  146.     OLED_WrCmd(0x3f);//--1/64 duty
  147.     OLED_WrCmd(0xd3);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
  148.     OLED_WrCmd(0x00);//-not offset
  149.     OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  150.     OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  151.     OLED_WrCmd(0xd9);//--set pre-charge period
  152.     OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  153.     OLED_WrCmd(0xda);//--set com pins hardware configuration
  154.     OLED_WrCmd(0x12);
  155.     OLED_WrCmd(0xdb);//--set vcomh
  156.     OLED_WrCmd(0x40);//Set VCOM Deselect Level
  157.     OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  158.     OLED_WrCmd(0x02);//
  159.     OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  160.     OLED_WrCmd(0x14);//--set(0x10) disable
  161.     OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  162.     OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  163.     OLED_WrCmd(0xaf);//--turn on oled panel
  164.     OLED_Fill(0xff);  //初始清屏
  165.                 delay(50);
  166.                 OLED_CLS();
  167.     OLED_SetPos(0,0);     
  168. }

  169. void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[])
  170. {
  171.         unsigned char c=0,i=0,j=0;
  172.         while (ch[j]!='\0')
  173.         {
  174.                 c = ch[j]-32;
  175.                 if(x>126)
  176.                 {
  177.                         x=0;y++;
  178.                 }
  179.                 OLED_SetPos(x,y);
  180.                 for(i=0;i<6;i++)
  181.                 {
  182.                         OLED_WrDat(F6x8[c][i]);
  183.                 }
  184.                 x+=6;
  185.                 j++;
  186.         }
  187. }

  188. void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char FB,unsigned char ch[])
  189. {
  190.         unsigned char c=0,i=0,j=0;
  191.         while (ch[j]!='\0')
  192.         {
  193.                 c =ch[j]-32;
  194.                 if(x>120)
  195.                 {
  196.                         x=0;y++;
  197.                 }
  198.                 OLED_SetPos(x,y);
  199.                 for(i=0;i<8;i++)
  200.                 {
  201.                         if(FB == 1) OLED_WrDat(~(F8X16[c*16+i]));
  202.                         else        OLED_WrDat(F8X16[c*16+i]);
  203.                 }
  204.                 OLED_SetPos(x,y+1);
  205.                 for(i=0;i<8;i++)
  206.                 {
  207.                         if(FB == 1) OLED_WrDat(~(F8X16[c*16+i+8]));
  208.                         else OLED_WrDat(F8X16[c*16+i+8]);
  209.                 }
  210.                 x+=8;
  211.                 j++;
  212.         }
  213. }

  214. void OLED_16x16CN(unsigned char x, unsigned char y, unsigned char N)
  215. {
  216.         unsigned char wm=0;
  217.         unsigned int adder=32*N;
  218.         OLED_SetPos(x , y);
  219.         for(wm = 0;wm < 16;wm++)
  220.         {
  221.                 OLED_WrDat(F16x16[adder]);
  222.                 adder += 1;
  223.         }
  224.         OLED_SetPos(x,y + 1);
  225.         for(wm = 0;wm < 16;wm++)
  226.         {
  227.                 OLED_WrDat(F16x16[adder]);
  228.                 adder += 1;
  229.         }
  230. }

  231. void OLED_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
  232. {
  233.         unsigned int j=0;
  234.         unsigned char x,y;
  235.         
  236.   if(y1%8==0)
  237.         {
  238.                 y=y1/8;
  239.         }
  240.   else
  241.                 y=y1/8+1;
  242.         for(y=y0;y<y1;y++)
  243.         {
  244.                 OLED_SetPos(x0,y);
  245.     for(x=x0;x<x1;x++)
  246.                 {
  247.                         OLED_WrDat(BMP[j++]);
  248.                 }
  249.         }
  250. }

  251. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  252. int main(void)
  253. {
  254.           extern const unsigned char BMP1[];
  255.           extern const unsigned char BMP_SETTING[];
  256.           extern const unsigned char BMP_POWEROFF[];
  257.           int32_t i = 0;
  258.           uint8_t key = 0;
  259.       /* system clocks configuration */
  260.        rcu_config();
  261.        /* systick configuration */
  262.        systick_config();  
  263.        /* GPIO configuration */
  264.        gpio_config();
  265.            /* UART configuration */
  266.                 COM_init(EVAL_COM);
  267.        /* OLED configuration */
  268.         OLED_Init();
  269. /*******************************************************************/
  270.     OLED_6x8Str(0,0,(uint8_t *)"123456789");
  271.     OLED_6x8Str(0,1,(uint8_t *)"abcdefgh");
  272.           delay_1ms(800U);        
  273.           OLED_BMP(0,0,128,8,(unsigned char *)BMP1);
  274.     while (1)
  275.                         {                          
  276.                       delay_1ms(100U);                                                
  277.                         }
  278. }

  279. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  280. MCU:GD32E230C8T6,72MHz
  281. OLED  SPI MODE
  282. OLED:   SmartRF V2.6的OLED屏
  283. 1           2     3     4         5      6
  284. GND   VCC   D0    D1    RST    DC
  285. 0V     3V3   PB9   PA7   PB0    PB1
  286. GD的庫(kù): version 2018-06-19, V1.0.0, firmware for GD32E230
  287. KEIL MDK 5.27.1.0
復(fù)制代碼
全部程序51hei下載地址:
OLED_Display - 模擬SPI.zip (220.23 KB, 下載次數(shù): 64)

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表