找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

2.4寸oled模塊 SSD1309單片機(jī)驅(qū)動程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:629252 發(fā)表于 2022-3-28 12:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
  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. //反顯函數(shù)
  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. //屏幕旋轉(zhuǎn)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);//反轉(zhuǎn)顯示
  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. //結(jié)束信號
  68. void I2C_Stop(void)
  69. {
  70.         OLED_SDA_Clr();
  71.         OLED_SCL_Set();
  72.         IIC_delay();
  73.         OLED_SDA_Set();
  74. }

  75. //等待信號響應(yīng)
  76. void I2C_WaitAck(void) //測數(shù)據(jù)信號的電平
  77. {
  78.         OLED_SDA_Set();
  79.         IIC_delay();
  80.         OLED_SCL_Set();
  81.         IIC_delay();
  82.         OLED_SCL_Clr();
  83.         IIC_delay();
  84. }

  85. //寫入一個字節(jié)
  86. void Send_Byte(u8 dat)
  87. {
  88.         u8 i;
  89.         for(i=0;i<8;i++)
  90.         {
  91.                 OLED_SCL_Clr();//將時鐘信號設(shè)置為低電平
  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. //發(fā)送一個字節(jié)
  108. //向SSD1309寫入一個字節(jié)。
  109. //mode:數(shù)據(jù)/命令標(biāo)志 0,表示命令;1,表示數(shù)據(jù);
  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. //坐標(biāo)設(shè)置

  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. //關(guān)閉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. //清屏函數(shù),清完屏,整個屏幕是黑色的!和沒點亮一樣!!!         
  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);    //設(shè)置頁地址(0~7)
  150.                 OLED_WR_Byte (0x00,OLED_CMD);      //設(shè)置顯示位置—列低地址
  151.                 OLED_WR_Byte (0x10,OLED_CMD);      //設(shè)置顯示位置—列高地址   
  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函數(shù)
  177. u32 oled_pow(u8 m,u8 n)
  178. {
  179.         u32 result=1;         
  180.         while(n--)result*=m;   
  181.         return result;
  182. }                                 
  183. //顯示數(shù)字
  184. //x,y :起點坐標(biāo)
  185. //num:要顯示的數(shù)字
  186. //len :數(shù)字的位數(shù)
  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顯示坐標(biāo)
  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. }

復(fù)制代碼


以上4個文件下載: 2.42OLED顯示屏51程序.zip (6.67 KB, 下載次數(shù): 54)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1056016 發(fā)表于 2022-12-6 14:47 | 只看該作者
不錯的例程
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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