找回密码
 立即注册

QQ登录

只需一步,快速开始

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

2.4寸oled模块 SSD1309单片机驱动程序

[复制链接]
跳转到指定楼层
楼主
  1. #include "oled.h"
  2. #include "oledfont.h"           
  3. //OLED的显存
  4. //存放格式如下.
  5. //[0]0 1 2 3 ... 127        
  6. //[1]0 1 2 3 ... 127        
  7. //[2]0 1 2 3 ... 127        
  8. //[3]0 1 2 3 ... 127        
  9. //[4]0 1 2 3 ... 127        
  10. //[5]0 1 2 3 ... 127        
  11. //[6]0 1 2 3 ... 127        
  12. //[7]0 1 2 3 ... 127                           
  13. void delay_ms(unsigned int ms)
  14. {                        
  15.         unsigned int a;
  16.         while(ms)
  17.         {
  18.                 a=1800;
  19.                 while(a--);
  20.                 ms--;
  21.         }
  22.         return;
  23. }

  24. //反显函数
  25. void OLED_ColorTurn(u8 i)
  26. {
  27.         if(i==0)
  28.                 {
  29.                         OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
  30.                 }
  31.         if(i==1)
  32.                 {
  33.                         OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
  34.                 }
  35. }

  36. //屏幕旋转180度
  37. void OLED_DisplayTurn(u8 i)
  38. {
  39.         if(i==0)
  40.                 {
  41.                         OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
  42.                         OLED_WR_Byte(0xA1,OLED_CMD);
  43.                 }
  44.         if(i==1)
  45.                 {
  46.                         OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
  47.                         OLED_WR_Byte(0xA0,OLED_CMD);
  48.                 }
  49. }


  50. //延时
  51. void IIC_delay(void)
  52. {
  53.         u8 t=1;
  54.         while(t--);
  55. }

  56. //起始信号
  57. void I2C_Start(void)
  58. {
  59.         OLED_SDA_Set();
  60.         OLED_SCL_Set();
  61.         IIC_delay();
  62.         OLED_SDA_Clr();
  63.         IIC_delay();
  64.         OLED_SCL_Clr();
  65.          
  66. }

  67. //结束信号
  68. void I2C_Stop(void)
  69. {
  70.         OLED_SDA_Clr();
  71.         OLED_SCL_Set();
  72.         IIC_delay();
  73.         OLED_SDA_Set();
  74. }

  75. //等待信号响应
  76. void I2C_WaitAck(void) //测数据信号的电平
  77. {
  78.         OLED_SDA_Set();
  79.         IIC_delay();
  80.         OLED_SCL_Set();
  81.         IIC_delay();
  82.         OLED_SCL_Clr();
  83.         IIC_delay();
  84. }

  85. //写入一个字节
  86. void Send_Byte(u8 dat)
  87. {
  88.         u8 i;
  89.         for(i=0;i<8;i++)
  90.         {
  91.                 OLED_SCL_Clr();//将时钟信号设置为低电平
  92.                 if(dat&0x80)//将dat的8位从最高位依次写入
  93.                 {
  94.                         OLED_SDA_Set();
  95.     }
  96.                 else
  97.                 {
  98.                         OLED_SDA_Clr();
  99.     }
  100.                 IIC_delay();
  101.                 OLED_SCL_Set();
  102.                 IIC_delay();
  103.                 OLED_SCL_Clr();
  104.                 dat<<=1;
  105.   }
  106. }

  107. //发送一个字节
  108. //向SSD1309写入一个字节。
  109. //mode:数据/命令标志 0,表示命令;1,表示数据;
  110. void OLED_WR_Byte(u8 dat,u8 mode)
  111. {
  112.         I2C_Start();
  113.         Send_Byte(0x78);
  114.         I2C_WaitAck();
  115.         if(mode){Send_Byte(0x40);}
  116.   else{Send_Byte(0x00);}
  117.         I2C_WaitAck();
  118.         Send_Byte(dat);
  119.         I2C_WaitAck();
  120.         I2C_Stop();
  121. }

  122. //坐标设置

  123. void OLED_Set_Pos(u8 x, u8 y)
  124. {
  125.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  126.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  127.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  128. }            
  129. //开启OLED显示   
  130. void OLED_Display_On(void)
  131. {
  132.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  133.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  134.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  135. }
  136. //关闭OLED显示     
  137. void OLED_Display_Off(void)
  138. {
  139.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  140.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  141.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  142. }                                            
  143. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
  144. void OLED_Clear(void)  
  145. {  
  146.         u8 i,n;                    
  147.         for(i=0;i<8;i++)  
  148.         {  
  149.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  150.                 OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  151.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  152.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  153.         } //更新显示
  154. }

  155. //在指定位置显示一个字符,包括部分字符
  156. //x:0~127
  157. //y:0~63                                 
  158. //sizey:选择字体 6x8  8x16
  159. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey)
  160. {              
  161.         u8 c=0,sizex=sizey/2;
  162.         u16 i=0,size1;
  163.         if(sizey==8)size1=6;
  164.         else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2);
  165.         c=chr-' ';//得到偏移后的值
  166.         OLED_Set_Pos(x,y);
  167.         for(i=0;i<size1;i++)
  168.         {
  169.                 if(i%sizex==0&&sizey!=8) OLED_Set_Pos(x,y++);
  170.                 if(sizey==8) OLED_WR_Byte(asc2_0806[c][i],OLED_DATA);//6X8字号
  171.                 else if(sizey==16) OLED_WR_Byte(asc2_1608[c][i],OLED_DATA);//8x16字号
  172. //                else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//用户添加字号
  173.                 else return;
  174.         }
  175. }
  176. //m^n函数
  177. u32 oled_pow(u8 m,u8 n)
  178. {
  179.         u32 result=1;         
  180.         while(n--)result*=m;   
  181.         return result;
  182. }                                 
  183. //显示数字
  184. //x,y :起点坐标
  185. //num:要显示的数字
  186. //len :数字的位数
  187. //sizey:字体大小                  
  188. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 sizey)
  189. {                 
  190.         u8 t,temp,m=0;
  191.         u8 enshow=0;
  192.         if(sizey==8)m=2;
  193.         for(t=0;t<len;t++)
  194.         {
  195.                 temp=(num/oled_pow(10,len-t-1))%10;
  196.                 if(enshow==0&&t<(len-1))
  197.                 {
  198.                         if(temp==0)
  199.                         {
  200.                                 OLED_ShowChar(x+(sizey/2+m)*t,y,' ',sizey);
  201.                                 continue;
  202.                         }else enshow=1;
  203.                 }
  204.                  OLED_ShowChar(x+(sizey/2+m)*t,y,temp+'0',sizey);
  205.         }
  206. }
  207. //显示一个字符号串
  208. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 sizey)
  209. {
  210.         u8 j=0;
  211.         while (chr[j]!='\0')
  212.         {               
  213.                 OLED_ShowChar(x,y,chr[j++],sizey);
  214.                 if(sizey==8)x+=6;
  215.                 else x+=sizey/2;
  216.         }
  217. }
  218. //显示汉字
  219. void OLED_ShowChinese(u8 x,u8 y,u8 no,u8 sizey)
  220. {
  221.         u16 i,size1=(sizey/8+((sizey%8)?1:0))*sizey;
  222.         for(i=0;i<size1;i++)
  223.         {
  224.                 if(i%sizey==0) OLED_Set_Pos(x,y++);
  225.                 if(sizey==16) OLED_WR_Byte(Hzk[no][i],OLED_DATA);//16x16字号
  226. //                else if(sizey==xx) OLED_WR_Byte(xxx[c][i],OLED_DATA);//用户添加字号
  227.                 else return;
  228.         }                                
  229. }


  230. //显示图片
  231. //x,y显示坐标
  232. //sizex,sizey,图片长宽
  233. //BMP:要显示的图片
  234. void OLED_DrawBMP(u8 x,u8 y,u8 sizex, u8 sizey,u8 BMP[])
  235. {         
  236.   u16 j=0;
  237.         u8 i,m;
  238.         sizey=sizey/8+((sizey%8)?1:0);
  239.         for(i=0;i<sizey;i++)
  240.         {
  241.                 OLED_Set_Pos(x,i+y);
  242.     for(m=0;m<sizex;m++)
  243.                 {      
  244.                         OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  245.                 }
  246.         }
  247. }



  248. //初始化                                    
  249. void OLED_Init(void)
  250. {
  251.         OLED_RES_Clr();
  252.   delay_ms(200);
  253.         OLED_RES_Set();
  254.         
  255.         OLED_WR_Byte(0xFD,OLED_CMD);
  256.         OLED_WR_Byte(0x12,OLED_CMD);
  257.         OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  258.         OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  259.         OLED_WR_Byte(0xA0,OLED_CMD);
  260.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  261.         OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  262.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  263.         OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  264.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  265.         OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  266.         OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  267.         OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  268.         OLED_WR_Byte(0x12,OLED_CMD);
  269.         OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  270.         OLED_WR_Byte(0x7F,OLED_CMD);// Set SEG Output Current Brightness
  271.         OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  272.         OLED_WR_Byte(0x82,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  273.         OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  274.         OLED_WR_Byte(0x34,OLED_CMD);//Set VCOM Deselect Level
  275.         OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  276.         OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  277.         OLED_Clear();
  278.         OLED_WR_Byte(0xAF,OLED_CMD);
  279. }

复制代码


以上4个文件下载: 2.42OLED显示屏51程序.zip (6.67 KB, 下载次数: 50)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1056016 发表于 2022-12-6 14:47 | 只看该作者
不错的例程
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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