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

QQ登錄

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

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

多功能數(shù)顯溫濕度計(jì)_0.96吋OLED顯示單片機(jī)源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
繼昨天發(fā)的一個(gè)貼,都是多功能數(shù)顯溫濕度計(jì),但是該貼用到的時(shí)OLED顯示,這個(gè)不僅可以顯示數(shù)字和字符,而且還可以顯示漢字和圖片,當(dāng)然本設(shè)計(jì)并未顯示圖片,圖片的顯示太耗內(nèi)存了,具體的顯示效果如下面兩張圖片。



這個(gè)圖片是開(kāi)機(jī)畫(huà)面,經(jīng)過(guò)大概5s中后切換到下一個(gè)界面,也就是下一張圖。


這個(gè)界面主要顯示日期、時(shí)間、溫度以及濕度

       具體的源代碼在附件里面。
       源代碼中有一部分代碼被注銷(xiāo)了,這包括了顯示圖片的代碼和字庫(kù)以及顯示字符串的函數(shù),如果需要顯示圖片和字符串的話可以取消注釋?zhuān){(diào)用顯示圖片的函數(shù)。
      注意一個(gè)問(wèn)題,由于本設(shè)計(jì)使用的是15W4k58s4單片機(jī)晶振先用內(nèi)部晶振115200,如果使用89C82請(qǐng)注意程序中對(duì)時(shí)間有要求的地方,如DS1302的時(shí)序。

單片機(jī)源程序如下:

  1. #include "OLED_0.96_spi.h"

  2. /**************************************
  3. 功能描述:延時(shí)函數(shù)
  4. 入口參數(shù):uint x ,該值為1時(shí),延時(shí)1ms
  5. 返回值:無(wú)
  6. ***************************************/
  7. void delay_ms(uint16_t x)
  8. {  
  9.         uint16_t j,i;   
  10.         for(j=0;j<x;j++)   
  11.         {   
  12.                 for(i=0;i<1100;i++);   
  13.         }  
  14. }       

  15. /******************************************************************************
  16. * 描  述 : 向OLED寫(xiě)入1字節(jié)數(shù)據(jù)
  17. * 入  參 : dat:數(shù)據(jù);mode:=0:寫(xiě)入命令,=1:寫(xiě)入數(shù)據(jù)
  18. * 返回值 : 無(wú)
  19. ******************************************************************************/
  20. void OLED_WrByte(uint8_t dat,uint8_t mode)     
  21. {
  22.     uint8_t i=8, temp=0;
  23.    
  24.     if(mode == OLED_WR_CMD)LCD_DC = 0;
  25.     else LCD_DC = 1;
  26.       
  27.     for(i=0; i<8; i++) //發(fā)送一個(gè)八位數(shù)據(jù)
  28.     {
  29.         LCD_SCL = 0;  
  30.         
  31.         temp = dat&0x80;
  32.         if (temp == 0)
  33.         {
  34.             LCD_SDA = 0;
  35.         }
  36.         else
  37.         {
  38.             LCD_SDA = 1;
  39.         }
  40.         dat <<= 1;
  41.                                 LCD_SCL = 1;                        
  42.     }
  43. }

  44. /******************************************************************************
  45. * 描  述 : 設(shè)置坐標(biāo)
  46. * 入  參 : x:x坐標(biāo);y:y坐標(biāo)
  47. * 返回值 : 無(wú)
  48. ******************************************************************************/
  49. void OLED_Set_Pos(uint8_t x, uint8_t y)
  50. {
  51.     OLED_WrByte((0xb0+y),OLED_WR_CMD);
  52.     OLED_WrByte(((x&0xf0)>>4)|0x10,OLED_WR_CMD);
  53.     OLED_WrByte((x&0x0f)|0x01,OLED_WR_CMD);
  54. }

  55. /******************************************************************************
  56. * 描  述 : LCD初始化
  57. * 入  參 : 無(wú)
  58. * 返回值 : 無(wú)
  59. ******************************************************************************/
  60. void OLED_Fill(uint8_t dat)
  61. {
  62.     uint8_t y,x;
  63.     for(y=0;y<8;y++)
  64.     {
  65.         OLED_WrByte(0xb0+y,OLED_WR_CMD);//設(shè)置頁(yè)地址(0~7)
  66.         OLED_WrByte(0x02,OLED_WR_CMD); //設(shè)置顯示位置—列低地址
  67.         OLED_WrByte(0x10,OLED_WR_CMD); //設(shè)置顯示位置—列高地址
  68.         for(x=0; x<X_WIDTH; x++)
  69.             OLED_WrByte(dat,OLED_WR_DAT);
  70.     }
  71. }

  72. /******************************************************************************
  73. * 描  述 : 指定位置顯示一個(gè)字符
  74. * 入  參 : x:列0~127;y:頁(yè)地址0~7;
  75. * 返回值 : 無(wú)
  76. ******************************************************************************/
  77. void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr)
  78. {             
  79.   uint8_t c=0,i=0;       
  80.   
  81.   c = chr-' ';//得到偏移后的值                       
  82.   if(x > Max_Column-1)
  83.   {
  84.     x = 0;
  85.     y = y+2;
  86.   }

  87.   OLED_Set_Pos(x,y);       
  88.   for(i=0; i<8; i++)OLED_WrByte(F8X16[c*16+i],OLED_WR_DAT);
  89.   OLED_Set_Pos(x,y+1);
  90.   for(i=0;i<8;i++)OLED_WrByte(F8X16[c*16+i+8],OLED_WR_DAT);
  91. }

  92. /******************************************************************************
  93. * 描  述 : 顯示8*16一組標(biāo)準(zhǔn)ASCII字符串
  94. * 入  參 : x:列0~127;y:頁(yè)地址0~7;
  95. * 返回值 : 無(wú)
  96. ******************************************************************************/
  97. //void LCD_P8x16Str(uint8_t x, uint8_t y,uint8_t ch[])
  98. //{
  99. //  uint8_t c=0,i=0,j=0;
  100. //   
  101. //  while (ch[j] != '\0')
  102. //  {   
  103. //    c = ch[j]-32;
  104. //    if(x>120){x=0;y++;}
  105. //    OLED_Set_Pos(x,y);   
  106. //    for(i=0; i<8; i++)OLED_WrByte(F8X16[c*16+i],OLED_WR_DAT);         
  107. //    OLED_Set_Pos(x,y+1);   
  108. //    for(i=0;i<8;i++) OLED_WrByte(F8X16[c*16+i+8],OLED_WR_DAT);        
  109. //    x += 8;
  110. //    j++;
  111. //  }
  112. //}

  113. /******************************************************************************
  114. * 描  述 : 顯示漢字
  115. * 入  參 : x:列0~127;y:頁(yè)地址0~7;
  116. * 返回值 : 無(wú)
  117. ******************************************************************************/
  118. void LCD_P16x16Ch(uint8_t x, uint8_t y, uint8_t N)
  119. {
  120.     uint8_t wm=0;
  121.     unsigned int adder=32*N;        
  122.     OLED_Set_Pos(x , y);
  123.     for(wm = 0;wm < 16;wm++)               
  124.     {
  125.         OLED_WrByte(F16x16[adder],OLED_WR_DAT);   
  126.         adder += 1;
  127.     }      
  128.     OLED_Set_Pos(x,y + 1);
  129.     for(wm = 0;wm < 16;wm++)         
  130.     {
  131.         OLED_WrByte(F16x16[adder],OLED_WR_DAT);
  132.         adder += 1;
  133.     }           
  134. }

  135. /******************************************************************************
  136. * 描  述 : 顯示BMP圖片128×64
  137. * 入  參 : 起始點(diǎn)坐標(biāo)(x,y),x的范圍0~127,y為頁(yè)的范圍0~7
  138. * 返回值 : 無(wú)
  139. ******************************************************************************/
  140. //void OLED_DrawBMP(uint8_t x0, uint8_t y0,uint8_t x1, uint8_t y1,const uint8_t BMP[])
  141. //{        
  142. //  uint16_t j=0;
  143. //  uint8_t x,y;
  144. //  
  145. //  if((y1 % 8) == 0) y = y1/8;      
  146. //  else y = y1/8+1;
  147. //  for(y=y0;y<y1;y++)
  148. //  {
  149. //    OLED_Set_Pos(x0,y);
  150. //    for(x=x0; x<x1; x++)
  151. //    {      
  152. //      OLED_WrByte(BMP[j++],OLED_WR_DAT);                   
  153. //    }
  154. //  }
  155. //}

  156. /******************************************************************************
  157. * 描  述 : LCD初始化
  158. * 入  參 : 無(wú)
  159. * 返回值 : 無(wú)
  160. ******************************************************************************/
  161. void OLED_Init(void)     
  162. {  
  163.     //P0DIR &= ~0x04;           //配置P0.2為輸出
  164.           //P1DIR &= ~0x70;           //配置P1.4 P1.5 P1.6為輸出
  165.     delay_ms(10);
  166.           LCD_CS=1;
  167.           delay_ms(10);
  168.     LCD_CS=0;
  169.    
  170.     delay_ms(200);

  171.     OLED_WrByte(0xae,OLED_WR_CMD);//--turn off oled panel
  172.     OLED_WrByte(0x00,OLED_WR_CMD);//---set low column address
  173.     OLED_WrByte(0x10,OLED_WR_CMD);//---set high column address
  174.     OLED_WrByte(0x40,OLED_WR_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  175.     OLED_WrByte(0x81,OLED_WR_CMD);//--set contrast control register
  176.     OLED_WrByte(0xcf,OLED_WR_CMD); // Set SEG Output Current Brightness
  177.        
  178.     OLED_WrByte(0xa1,OLED_WR_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  179.     OLED_WrByte(0xc8,OLED_WR_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  180.     OLED_WrByte(0xa6,OLED_WR_CMD);//--set normal display
  181.     OLED_WrByte(0xa8,OLED_WR_CMD);//--set multiplex ratio(1 to 64)
  182.     OLED_WrByte(0x3f,OLED_WR_CMD);//--1/64 duty
  183.        
  184.     OLED_WrByte(0xd3,OLED_WR_CMD);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
  185.     OLED_WrByte(0x00,OLED_WR_CMD);//-not offset
  186.                
  187.     OLED_WrByte(0xd5,OLED_WR_CMD);//--set display clock divide ratio/oscillator frequency
  188.     OLED_WrByte(0x80,OLED_WR_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  189.     OLED_WrByte(0xd9,OLED_WR_CMD);//--set pre-charge period
  190.                
  191.     OLED_WrByte(0xf1,OLED_WR_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  192.                 //OLED_WrByte(0x22,OLED_WR_CMD);
  193.     OLED_WrByte(0xda,OLED_WR_CMD);//--set com pins hardware configuration
  194.     OLED_WrByte(0x12,OLED_WR_CMD);
  195.     OLED_WrByte(0xdb,OLED_WR_CMD);//--set vcomh
  196.                
  197.     OLED_WrByte(0x40,OLED_WR_CMD);//Set VCOM Deselect Level
  198.                
  199.     OLED_WrByte(0x20,OLED_WR_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  200.     OLED_WrByte(0x02,OLED_WR_CMD);//
  201.     OLED_WrByte(0x8d,OLED_WR_CMD);//--set Charge Pump enable/disable
  202.     OLED_WrByte(0x14,OLED_WR_CMD);//--set(0x10) disable
  203.     OLED_WrByte(0xa4,OLED_WR_CMD);// Disable Entire Display On (0xa4/0xa5)
  204.     OLED_WrByte(0xa6,OLED_WR_CMD);// Disable Inverse Display On (0xa6/a7)
  205.     OLED_WrByte(0xaf,OLED_WR_CMD);//--turn on oled panel
  206.     OLED_Fill(0xff);  //初始清屏
  207.     OLED_Set_Pos(0,0);     
  208. }
  209. /*********************************END FILE*************************************/
復(fù)制代碼


所有資料51hei提供下載:
OLED_0.96_spi顯示.zip (8.22 MB, 下載次數(shù): 120)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:302183 發(fā)表于 2018-4-20 21:31 | 只看該作者
請(qǐng)問(wèn)OLED顯示的X,Y坐標(biāo)怎么設(shè)置?
回復(fù)

使用道具 舉報(bào)

板凳
ID:104846 發(fā)表于 2018-7-24 16:38 | 只看該作者
不錯(cuò),很給力
回復(fù)

使用道具 舉報(bào)

地板
ID:425233 發(fā)表于 2018-11-17 17:06 | 只看該作者
樓主,你用的漢字取模參數(shù)都是多少啊
回復(fù)

使用道具 舉報(bào)

5#
ID:741154 發(fā)表于 2020-5-14 22:52 來(lái)自手機(jī) | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報(bào)

6#
ID:757780 發(fā)表于 2020-5-21 21:28 來(lái)自手機(jī) | 只看該作者
關(guān)于OLED的內(nèi)容很全,很有幫助
回復(fù)

使用道具 舉報(bào)

7#
ID:757780 發(fā)表于 2020-5-21 21:28 來(lái)自手機(jī) | 只看該作者
感覺(jué)分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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