找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3466|回复: 0
打印 上一主题 下一主题
收起左侧

0.96寸OLED显示程序 模拟SPI驱动

[复制链接]
跳转到指定楼层
楼主
ID:253486 发表于 2019-1-26 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
驱动库如下:.h文件:
  1. #ifndef __OLED_H
  2. #define __OLED_H                                   
  3. #include "sys.h"
  4. #include "stdlib.h"                    

  5. #define SIZE 16
  6. #define XLevelL                0x00
  7. #define XLevelH                0x10
  8. #define Max_Column        128
  9. #define Max_Row                64
  10. #define        Brightness        0xFF
  11. #define X_WIDTH         128
  12. #define Y_WIDTH         64                                                              
  13. //-----------------OLED端口定义----------------                                             
  14. #define OLED_CS_Clr()  GPIO_ResetBits(GPIOB, GPIO_Pin_12)//CS
  15. #define OLED_CS_Set()  GPIO_SetBits(GPIOB, GPIO_Pin_12)

  16. #define OLED_DC_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_11)//DC
  17. #define OLED_DC_Set() GPIO_SetBits(GPIOB,GPIO_Pin_11)

  18. #define OLED_RST_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_14)//RES
  19. #define OLED_RST_Set() GPIO_SetBits(GPIOB, GPIO_Pin_14)

  20. #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB, GPIO_Pin_15)//DIN
  21. #define OLED_SDIN_Set() GPIO_SetBits(GPIOB, GPIO_Pin_15)

  22. #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_13)//CLK
  23. #define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_13)

  24.                      
  25. #define OLED_CMD  0        //写命令
  26. #define OLED_DATA 1        //写数据


  27. //OLED控制用函数
  28. void OLED_WR_Byte(u8 dat,u8 cmd);            
  29. void OLED_Display_On(void);
  30. void OLED_Display_Off(void);                           
  31. void OLED_GPIO_Init(void);
  32. void OLED_Init(void);
  33. void OLED_Clear(void);
  34. void OLED_DrawPoint(u8 x,u8 y,u8 t);
  35. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
  36. void OLED_ShowChar(u8 x,u8 y,u8 chr);
  37. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
  38. void OLED_ShowString(u8 x,u8 y, u8 *p);         
  39. void OLED_Set_Pos(unsigned char x, unsigned char y);
  40. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  41. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  42. #endif  
  43. ===================
  44. .c文件:

  45. #include "oled.h"
  46. #include "stdlib.h"
  47. #include "oledfont.h"           
  48. #include "delay.h"

  49. void OLED_GPIO_Init(void)
  50. {
  51.         GPIO_InitTypeDef  GPIO_InitStructure;
  52.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);                 
  53.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                          //推挽输出
  54.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                        //速度50MHz
  55.         
  56.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  57.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                                         
  58.          GPIO_SetBits(GPIOB, GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);        
  59.         
  60. }

  61. //OLED的显存
  62. //存放格式如下.
  63. //[0]0 1 2 3 ... 127        
  64. //[1]0 1 2 3 ... 127        
  65. //[2]0 1 2 3 ... 127        
  66. //[3]0 1 2 3 ... 127        
  67. //[4]0 1 2 3 ... 127        
  68. //[5]0 1 2 3 ... 127        
  69. //[6]0 1 2 3 ... 127        
  70. //[7]0 1 2 3 ... 127                           

  71. //向SSD1106写入一个字节。
  72. //dat:要写入的数据/命令
  73. //cmd:数据/命令标志 0,表示命令;1,表示数据;
  74. void OLED_WR_Byte(u8 dat,u8 cmd)
  75. {        
  76.         u8 i;                          
  77.         if(cmd)
  78.           OLED_DC_Set();
  79.         else
  80.           OLED_DC_Clr();                  
  81.         OLED_CS_Clr();
  82.         for(i=0;i<8;i++)
  83.         {                          
  84.                 OLED_SCLK_Clr();
  85.                 if(dat&0x80)
  86.                    OLED_SDIN_Set();
  87.                 else
  88.                    OLED_SDIN_Clr();
  89.                 OLED_SCLK_Set();
  90.                 dat<<=1;   
  91.         }                                                   
  92.         OLED_CS_Set();
  93.         OLED_DC_Set();            
  94. }


  95. void OLED_Set_Pos(unsigned char x, unsigned char y)
  96. {
  97.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  98.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  99.         OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
  100. }            

  101. //开启OLED显示   
  102. void OLED_Display_On(void)
  103. {
  104.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  105.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  106.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  107. }

  108. //关闭OLED显示     
  109. void OLED_Display_Off(void)
  110. {
  111.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  112.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  113.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  114. }                                            
  115. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
  116. void OLED_Clear(void)  
  117. {  
  118.         u8 i,n;                    
  119.         for(i=0;i<8;i++)  
  120.         {  
  121.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  122.                 OLED_WR_Byte (0x02,OLED_CMD);      //设置显示位置—列低地址
  123.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  124.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  125.         } //更新显示
  126. }

  127. //在指定位置显示一个字符,包括部分字符
  128. //x:0~127
  129. //y:0~63
  130. //mode:0,反白显示;1,正常显示                                 
  131. //size:选择字体 16/12
  132. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  133. {              
  134.         unsigned char c=0,i=0;        
  135.                 c=chr-' ';//得到偏移后的值                        
  136.                 if(x>Max_Column-1){x=0;y=y+2;}
  137.                 if(SIZE ==16)
  138.                         {
  139.                         OLED_Set_Pos(x,y);        
  140.                         for(i=0;i<8;i++)
  141.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  142.                         OLED_Set_Pos(x,y+1);
  143.                         for(i=0;i<8;i++)
  144.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  145.                         }
  146.                         else {        
  147.                                 OLED_Set_Pos(x,y+1);
  148.                                 for(i=0;i<6;i++)
  149.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  150.                                 
  151.                         }
  152. }

  153. //m^n函数
  154. u32 oled_pow(u8 m,u8 n)
  155. {
  156.         u32 result=1;         
  157.         while(n--)result*=m;   
  158.         return result;
  159. }                                 


  160. //显示2个数字
  161. //x,y :起点坐标         
  162. //len :数字的位数
  163. //size:字体大小
  164. //mode:模式        0,填充模式;1,叠加模式
  165. //num:数值(0~4294967295);                           
  166. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
  167. {                 
  168.         u8 t,temp;
  169.         u8 enshow=0;                                                   
  170.         for(t=0;t<len;t++)
  171.         {
  172.                 temp=(num/oled_pow(10,len-t-1))%10;
  173.                 if(enshow==0&&t<(len-1))
  174.                 {
  175.                         if(temp==0)
  176.                         {
  177.                                 OLED_ShowChar(x+(size/2)*t,y,' ');
  178.                                 continue;
  179.                         }else enshow=1;
  180.                           
  181.                 }
  182.                  OLED_ShowChar(x+(size/2)*t,y,temp+'0');
  183.         }
  184. }

  185. //显示一个字符号串
  186. void OLED_ShowString(u8 x,u8 y,u8 *chr)
  187. {
  188.         unsigned char j=0;
  189.         while (chr[j]!='\0')
  190.         {                OLED_ShowChar(x,y,chr[j]);
  191.                         x+=8;
  192.                 if(x>120){x=0;y+=2;}
  193.                         j++;
  194.         }
  195. }

  196. //显示汉字
  197. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  198. {                                 
  199.         u8 t,adder=0;
  200.         OLED_Set_Pos(x,y);        
  201.     for(t=0;t<16;t++)
  202.                 {
  203.                                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  204.                                 adder+=1;
  205.      }        
  206.                 OLED_Set_Pos(x,y+1);        
  207.     for(t=0;t<16;t++)
  208.                         {        
  209.                                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  210.                                 adder+=1;
  211.       }                                       
  212. }

  213. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  214. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  215. {         
  216. unsigned int j=0;
  217. unsigned char x,y;

  218.   if(y1%8==0) y=y1/8;      
  219.   else y=y1/8+1;
  220.         for(y=y0;y<y1;y++)
  221.         {
  222.                 OLED_Set_Pos(x0,y);
  223.     for(x=x0;x<x1;x++)
  224.             {      
  225.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  226.             }
  227.         }
  228. }

  229. //初始化SSD1306                                            
  230. void OLED_Init(void)
  231. {         
  232.         OLED_GPIO_Init();
  233.   OLED_RST_Set();
  234.         delay_ms(100);
  235.         OLED_RST_Clr();
  236.         delay_ms(100);
  237.         OLED_RST_Set();
  238.                                           
  239.         OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  240.         OLED_WR_Byte(0x02,OLED_CMD);//---set low column address
  241.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  242.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  243.         OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  244.         OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
  245.         OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  246.         OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  247.         OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  248.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  249.         OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  250.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  251.         OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  252.         OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  253.         OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  254.         OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  255.         OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  256.         OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  257.         OLED_WR_Byte(0x12,OLED_CMD);
  258.         OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  259.         OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  260.         OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  261.         OLED_WR_Byte(0x02,OLED_CMD);//
  262.         OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  263.         OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  264.         OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  265.         OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  266.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  267.         
  268.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  269.         OLED_Clear();
  270.         OLED_Set_Pos(0,0);         
  271. }  
复制代码

SIP方式OLED.7z

195.85 KB, 下载次数: 73, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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