找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3612|回复: 0
收起左侧

GD32E230 SPI方式驱动SSD1306源码 128*64 OLED屏

[复制链接]
ID:877801 发表于 2021-1-18 16:35 | 显示全部楼层 |阅读模式
      几年前用蓝牙芯片开发一个项目,买了SmartRF开发板,上面带一个12864的OLED屏,最近在做一个IIC的OLED屏的项目,把这套板子找出来打算先把显示的目录系统做了。简单撇了一眼资料,写的IIC的驱动例程,可看程序不对呀,驱动方式明明是SPI的,怎么就IIC的例程呢?于是我找原理图看了一下果然没有开漏的两个上拉电阻。找找原来用过的配套软件,没找到,只好拿一块前阵子调试GDE230的板子往上怼了。      好了,万事俱备了,老铁,上吧!把程序移植到GD32E上,没仿真,直接上,结果啥也没有显示。我坐在电脑前想了半天,想这个仿SIP的程序很简单呀,51时我就写个,做PIC690和917时,LPC2000时,包括当初做STM32时都写过,不可能不好用呀!于是我搬出好久未用的用示波器测了测波形,两个板子对比了一下,结果发现GD32E230的做CLK的那个引脚没有输出。血的教训告诉我,用过的板子一定做好记录,要不就直接扔了,太耽误事了!

       好了,这个程序是直接移植过来的,能实现数字,英文,汉字和图片的显示,显示字符的程序我修改了一下,加上了反显,上程序!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

单片机源程序如下:
  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        //写命令
  23. //#define OLED_DATA 1        //写数据

  24. //OLED控制用函数
  25. void OLED_WrDat(unsigned char dat);//写数据
  26. void OLED_WrCmd(unsigned char cmd);//写命令
  27. void OLED_SetPos(unsigned char x, unsigned char y);//设置起始点坐标
  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)//写数据
  53. {
  54.         unsigned char i, temp=0;
  55.         OLED_DC_Set();
  56.         for(i=0;i<8;i++) //发送一个八位数据
  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)//写命令
  75. {
  76.           unsigned char i, temp=0;
  77.           OLED_DC_Clr();
  78.     for(i=0;i<8;i++) //发送一个八位数据
  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)//设置起始点坐标
  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的库: version 2018-06-19, V1.0.0, firmware for GD32E230
  287. KEIL MDK 5.27.1.0
复制代码
全部程序51hei下载地址:
OLED_Display - 模拟SPI.zip (220.23 KB, 下载次数: 63)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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