久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32驅(qū)動(dòng)4針oled顯示英文和數(shù)字字符串源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:829800 發(fā)表于 2020-10-15 21:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include "delay.h"
  2. #include "oled.h"
  3. #include "oledfont.h"
  4. #include "string.h"
  5. #include "math.h"
  6. #include "myiic.h"

  7. u8 OLED_GRAM[8][128];/*定義OLED顯存數(shù)組*/

  8. /*
  9. 函數(shù)功能: 向SSD1106寫入一個(gè)字節(jié)
  10. 函數(shù)參數(shù): dat:要寫入的數(shù)據(jù)/命令
  11.           cmd:數(shù)據(jù)/命令標(biāo)志  0表示命令  1表示數(shù)據(jù)
  12. */
  13. void OLED_WR_Byte(u8 dat,u8 cmd)
  14. {
  15.         IIC_Start();                                                                //開始傳輸
  16.         IIC_Send_Byte(0x78);                                        //傳輸?shù)刂?br />
  17.         IIC_Wait_Ack();                                                        //接收1306返回的確認(rèn)信號(hào)
  18.         if(cmd) IIC_Send_Byte(0x40);        //發(fā)送控制字節(jié),寫數(shù)據(jù)
  19.         else IIC_Send_Byte(0x00);                //發(fā)送控制字節(jié),寫命令        
  20.         IIC_Wait_Ack();                                                        //接收1306返回的確認(rèn)信號(hào)
  21.         IIC_Send_Byte(dat);                                        //發(fā)送數(shù)據(jù)字節(jié)
  22.         IIC_Wait_Ack();                                                        //接收1306返回的確認(rèn)信號(hào)
  23.         IIC_Stop();                                                                        //結(jié)束傳輸
  24. }

  25. /*********************OLED初始化************************************/
  26. void OLED_Init(void)
  27. {
  28.         IIC_Init();
  29.         delay_ms(500);                                                                //初始化之前的延時(shí)很重要!
  30.         OLED_WR_Byte(0xAE,OLED_CMD); //關(guān)閉顯示
  31.         OLED_WR_Byte(0x00,OLED_CMD);//設(shè)置低列地址
  32.         OLED_WR_Byte(0x10,OLED_CMD);//設(shè)置高列地址
  33.         OLED_WR_Byte(0x40,OLED_CMD);//設(shè)置起始行地址,集映射RAM顯示起始行(0x00~0x3F)
  34.         OLED_WR_Byte(0x81,OLED_CMD);//設(shè)置對比度控制寄存器
  35.         OLED_WR_Byte(0xCF,OLED_CMD);//設(shè)置SEG輸出電流亮度
  36.         OLED_WR_Byte(0xA1,OLED_CMD);//段重定義設(shè)置,bit0:0,0->0;1,0->127; 0xa0左右反置 0xa1正常
  37.         OLED_WR_Byte(0xC8,OLED_CMD);//設(shè)置COM掃描方向;bit3:0,普通模式;1,重定義模式 COM[N-1]->COM0;N:驅(qū)動(dòng)路數(shù)   0xc0上下反置 0xc8正常
  38.         OLED_WR_Byte(0xA6,OLED_CMD);//設(shè)置正常顯示(設(shè)置顯示方式;bit0:1,反相顯示;0,正常顯示        )
  39.         OLED_WR_Byte(0xA8,OLED_CMD);//設(shè)置驅(qū)動(dòng)路數(shù) 設(shè)置多路復(fù)用比(1比64)
  40.         OLED_WR_Byte(0x3F,OLED_CMD);//1/64 duty(默認(rèn)0X3F(1/64))
  41.         OLED_WR_Byte(0xD3,OLED_CMD);//設(shè)置顯示偏移位移映射RAM計(jì)數(shù)器(0x00~0x3F)
  42.         OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  43.         OLED_WR_Byte(0xD5,OLED_CMD);//設(shè)置顯示時(shí)鐘分頻比/振蕩器頻率
  44.         OLED_WR_Byte(0x80,OLED_CMD);//設(shè)置分頻比,設(shè)置時(shí)鐘為100幀/秒
  45.         OLED_WR_Byte(0xD9,OLED_CMD);//設(shè)置預(yù)充電周期
  46.         OLED_WR_Byte(0xF1,OLED_CMD);//設(shè)置預(yù)充15個(gè)時(shí)鐘,放電1個(gè)時(shí)鐘([3:0],PHASE 1;[7:4],PHASE 2;)
  47.         OLED_WR_Byte(0xDA,OLED_CMD);//設(shè)置COM硬件引腳配置
  48.         OLED_WR_Byte(0x12,OLED_CMD);//[5:4]配置
  49.         OLED_WR_Byte(0xDB,OLED_CMD);//設(shè)置VCOMH 電壓倍率
  50.         OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM 釋放電壓([6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;)
  51.         OLED_WR_Byte(0x20,OLED_CMD);//設(shè)置頁面尋址模式(0x00/0x01/0x02)
  52.         OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,頁地址模式;默認(rèn)10;
  53.         OLED_WR_Byte(0x8D,OLED_CMD);//設(shè)置充電泵啟用/禁用
  54.         OLED_WR_Byte(0x14,OLED_CMD);//設(shè)置(0x10禁用,0x14啟用)
  55.         OLED_WR_Byte(0xA4,OLED_CMD);// 全局顯示開啟;bit0:1,開啟;0,關(guān)閉;(白屏/黑屏) (0xa4/0xa5)
  56.         OLED_WR_Byte(0xA6,OLED_CMD);// 設(shè)置顯示方式;bit0:1,反相顯示;0,正常顯示 (0xa6/a7)
  57.         OLED_WR_Byte(0xAF,OLED_CMD);//開啟顯示        
  58.         OLED_Clear();
  59.         OLED_SetCursorAddrese(0,0);
  60.         //printf("OLED Init OK !\n");
  61. }
  62. /*函數(shù)功能:開啟OLED顯示 */
  63. void OLED_Display_On(void)
  64. {
  65.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令(設(shè)置電荷泵)
  66.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON (開啟電荷泵)
  67.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON(OLED喚醒)
  68. }
  69. /*函數(shù)功能:關(guān)閉OLED顯示*/

  70. void OLED_Display_Off(void)
  71. {
  72.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令 (設(shè)置電荷泵)
  73.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF (關(guān)閉電荷泵)
  74.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF (OLED休眠)
  75. }


  76. /*
  77. 函數(shù)功能:清屏函數(shù),清完屏,整個(gè)屏幕是黑色的!  
  78. 說明: 清屏就是向OLED里寫0
  79.       對于OLED屏,0就不顯示,1才會(huì)在屏幕上顯示出來一個(gè)點(diǎn)
  80. */
  81. void OLED_Clear(void)  
  82. {  
  83.         u8 i,n;  
  84.         for(i=0;i<8;i++)
  85.         {
  86.                 OLED_WR_Byte(0xB0+i,OLED_CMD);//設(shè)置頁地址(0~7)
  87.                 OLED_WR_Byte(0x00,OLED_CMD);  //設(shè)置顯示位置―列低地址
  88.                 OLED_WR_Byte(0x10,OLED_CMD);  //設(shè)置顯示位置―列高地址
  89.                 for(n=0;n<128;n++)
  90.                 {
  91.                         OLED_WR_Byte(0x00,OLED_DATA);
  92.                 }
  93.         }
  94. }
  95. /*
  96. 函數(shù)功能:在顯存數(shù)組上畫一個(gè)點(diǎn)
  97. 函數(shù)參數(shù):x,y為點(diǎn)的橫縱坐標(biāo)   c為這個(gè)點(diǎn)的亮滅(1亮0滅)
  98. 參數(shù)范圍:x 0~128  y 0~8
  99. 每一個(gè)數(shù)據(jù)是 低位在前,高位在后
  100. */
  101. void OLED_Draw_Point(u8 x,u8 y,u8 c)
  102. {
  103.         u8 page,addr;
  104.         page = y/8; //顯存的頁地址
  105.         addr = y%8; //顯存的一個(gè)字節(jié)數(shù)據(jù)中c所在的位置
  106.         if(c) OLED_GRAM[page ][ x] |= 1<<addr;
  107.         else  OLED_GRAM[page ][ x] &= ~(1<<addr);
  108. }

  109. /*
  110. 函數(shù)功能: 設(shè)置光標(biāo)位置
  111. 函數(shù)參數(shù): x列的起始位置(0~127)
  112.                                   y頁的起始位置(0~7)
  113. 比如: 0x8  高4位0000   低4位1000
  114. */
  115. void OLED_SetCursorAddrese(u8 x,u8 y)
  116. {
  117.                 OLED_WR_Byte(0xB0+y,OLED_CMD);                                         //設(shè)置頁地址
  118.           //第6列顯示數(shù)據(jù)  6被分成2個(gè)4位(高位和低位)。
  119.                 OLED_WR_Byte((x&0xF0)>>4|0x10,OLED_CMD);//設(shè)置列高起始地址(半字節(jié))
  120.                 OLED_WR_Byte((x&0x0F)|0x00,OLED_CMD);   //設(shè)置列低起始地址(半字節(jié))                        
  121. }
  122. /*****************************************************
  123. ** 函數(shù)名稱:OLED_VerticalDisplay
  124. ** 函數(shù)功能:實(shí)現(xiàn)OLED垂直滾動(dòng)范圍配置
  125. ** 參    數(shù):1.toprow:設(shè)置滾動(dòng)起始行
  126. **           2.scrollrow:設(shè)置滾動(dòng)行數(shù)
  127. **           注意:toprow+scrollrow<64
  128. ** 函數(shù)返回:無
  129. ******************************************************/
  130. void OLED_VerticalDisplay(u8 toprow,u8 scrollrow)
  131. {
  132.         OLED_WR_Byte(SET_VERTICAL_SCROLL_AREA,OLED_CMD);
  133.         OLED_WR_Byte(toprow,OLED_CMD);
  134.         OLED_WR_Byte(scrollrow,OLED_CMD);
  135. }

  136. /*****************************************************
  137. ** 函數(shù)名稱:OledScrollStop
  138. ** 函數(shù)功能:關(guān)閉滾屏功能
  139. ******************************************************/
  140. void OledScrollStop(void)
  141. {
  142.         OLED_WR_Byte(DEACTIVATE_SCROLL,OLED_CMD);
  143. }

  144. /*
  145. 函數(shù)功能: 按頁清屏 (0~7)
  146. */
  147. void OLED_PageClear(u8 page)
  148. {
  149.                 u8 j;
  150.                 OLED_WR_Byte(0xB0+page,OLED_CMD); //設(shè)置頁地址
  151.                 OLED_WR_Byte(0x10,OLED_CMD);      //設(shè)置列高起始地址(半字節(jié))
  152.                 OLED_WR_Byte(0x00,OLED_CMD);      //設(shè)置列低起始地址(半字節(jié))
  153.                 for(j=0;j<128;j++)
  154.                 {
  155.                                 OLED_WR_Byte(0,OLED_DATA); //寫數(shù)據(jù)
  156.                 }
  157. }

  158. /*
  159. 函數(shù)功能:更新顯存到OLED屏幕上*/
  160. void OLED_Refresh_Screen(void)
  161. {
  162.         u8 page,list;  //定義頁地址和列地址
  163.         for(page=0;page<8;page++)
  164.         {
  165.                 OLED_WR_Byte(0xB0+page,OLED_CMD); //設(shè)置頁地址(0~7)
  166.                 OLED_WR_Byte(0x00,OLED_CMD);      //設(shè)置顯示位置―列低地址
  167.                 OLED_WR_Byte(0x10,OLED_CMD);      //設(shè)置顯示位置―列高地址
  168.                 for(list=0;list<128;list++)
  169.                 {
  170.                         OLED_WR_Byte(OLED_GRAM[page ][list],OLED_DATA);
  171.                 }
  172.         }
  173.         memset(OLED_GRAM,0,sizeof(OLED_GRAM));        /*清空顯存數(shù)組*/
  174. }

  175. u8 Oled_Display(u8 x ,u8 y ,u8 width , u8 height)
  176. {
  177.         u8 i,j;
  178.         if(width>128) width=128;
  179.         if(height>64) height=64;
  180.         /*1. OLED顯示屏初始化*/
  181.         OLED_Clear();        //清屏
  182.         for(i=0;i<height/8;i++)
  183.         {
  184.                 OLED_WR_Byte(0xB0+i,OLED_CMD); //設(shè)置頁地址(0~7)
  185.                 OLED_WR_Byte(0x00,OLED_CMD);      //設(shè)置顯示位置―列低地址
  186.                 OLED_WR_Byte(0x10,OLED_CMD);      //設(shè)置顯示位置―列高地址
  187.                 for(j=0;j<width;j++)
  188.                 {
  189. //                        OLED_WR_Byte(BMP[i][j],OLED_DATA);
  190.                 }
  191.         }
  192.         delay_ms(10);
  193.   return 0;
  194. }


  195. void OLED_DisplayString(u8 x,u8 y,u8 width,u8 height,u8 *str)
  196. {
  197.         u8 addr=0,i;
  198.         u16 font=0;
  199.         while(*str!='\0') //連續(xù)顯示
  200.         {
  201.                 //取模從空格開始的,計(jì)算下標(biāo)
  202.                 //寫8*16ASCII字符的上半部分
  203.                 if(*str >= ' '&& *str <= '~') //顯示英文
  204.                 {
  205.                         addr=*str-' '; //取模從空格開始的,計(jì)算下標(biāo)
  206.                         //寫8*16ASCII字符的上半部分
  207.                         OLED_SetCursorAddrese(x,y); //設(shè)置光標(biāo)的位置
  208.                         for(i=0;i<width/2;i++)      //橫向?qū)憌idth列
  209.                         {
  210.                                  OLED_WR_Byte(ASCII_8_16[addr][i],OLED_DATA);
  211.                         }
  212.                         //寫8*16ASCII字符的下半部分
  213.                         OLED_SetCursorAddrese(x,y+1); //設(shè)置光標(biāo)的位置
  214.                         for(i=0;i<width/2;i++)        //橫向?qū)憌idth列
  215.                         {
  216.                                  OLED_WR_Byte(ASCII_8_16[addr][i+width/2],OLED_DATA);
  217.                         }
  218.                         str++;//繼續(xù)顯示下一個(gè)字符
  219.                         x+=width/2; //在下一個(gè)位置繼續(xù)顯示數(shù)據(jù)                        
  220.                 }
  221.                 else //顯示中文
  222.                 {
  223.                         OLED_SetCursorAddrese(x,y); //設(shè)置光標(biāo)的位置
  224.                         font=((*str)<<8)|(*(str+1));
  225.                         switch(font)
  226.                         {
  227.                                 case 0xCEC2:addr=0;break;//溫
  228.                                 case 0xCAAA:addr=1;break;//濕
  229.                                 case 0xB6C8:addr=2;break;//度
  230.                                 case 0xCAFD:addr=3;break;//數(shù)
  231.                                 case 0xBEDD:addr=4;break;//據(jù)
  232.                                 case 0xB3C9:addr=5;break;//成
  233.                                 case 0xB9A6:addr=6;break;//功
  234.                                 case 0xB7A2:addr=7;break;//發(fā)
  235.                                 case 0xCBCD:addr=8;break;//送
  236.                                 case 0xC1AC:addr=9;break;//連
  237.                                 case 0xBDD3:addr=10;break;//接
  238.                                 case 0xB7FE:addr=11;break;//服
  239.                                 case 0xCEF1:addr=12;break;//務(wù)
  240.                                 case 0xC6F7:addr=13;break;//器
  241.                                 case 0xC9CF:addr=14;break;//上
  242.                                 case 0xCFC2:addr=15;break;//下
  243.                                 case 0xCFDE:addr=16;break;//限
  244.                                 case 0xD6B5:addr=17;break;//值
  245.                                 case 0xC9E8:addr=18;break;//設(shè)
  246.                                 case 0xD6C3:addr=19;break;//置
  247.                                 case 0xB4AB:addr=20;break;//傳
  248.                                 case 0xD6DC:addr=21;break;//周
  249.                                 case 0xC6DA:addr=22;break;//期
  250.                                 case 0xBFD8:addr=23;break;//控
  251.                                 case 0xD6C6:addr=24;break;//制
  252.                                 case 0xB2CE:addr=25;break;//參
  253.                                 case 0xD7DC:addr=26;break;//總
  254.                                 case 0xB1ED:addr=27;break;//表
  255.                                 case 0xB1B8:addr=28;break;//備
  256.                                 case 0xCDF8:addr=29;break;//網(wǎng)
  257.                                 case 0xC2E7:addr=30;break;//絡(luò)
  258.                                 case 0xD0C5:addr=31;break;//信
  259.                                 case 0xCFA2:addr=32;break;//息
  260.                                 case 0xCAA7:addr=33;break;//失
  261.                                 case 0xB0DC:addr=34;break;//敗
  262.                                 case 0xB1A3:addr=35;break;//保
  263.                                 case 0xB4E6:addr=36;break;//存
  264.                                 case 0xB9FD:addr=37;break;//過
  265.                                 case 0xB8DF:addr=38;break;//高
  266.                                 case 0xA1E6:addr=39;break;//℃
  267.                                 case 0xD0C7:addr=40;break;//星
  268. ……………………

  269. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
全部代碼51hei下載地址:
IIC實(shí)驗(yàn).7z (202.64 KB, 下載次數(shù): 25)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九亚洲 | 午夜免费 | 国产成人网 | 四虎在线播放 | 农村真人裸体丰满少妇毛片 | 国产精品久久久久久久久久免费看 | 国产欧美一区二区久久性色99 | www.v888av.com| 亚洲精品乱码久久久久久久久久 | 伊人超碰 | 欧美精品日韩 | 国产日韩欧美一区 | 国产精品美女久久久 | 欧美日韩综合 | 九九热在线免费观看 | 99久久精品国产毛片 | 日韩精品一区在线 | 日本久久精品视频 | 久久久久国产精品免费免费搜索 | 97精品视频在线 | 久久人爽 | 人人精品 | 一级片在线观看 | 国产精品一区久久久 | 黄色毛片在线播放 | 91 在线 | 欧美精品一区二区在线观看 | 欧美男人天堂 | www日日日| 欧美理伦片在线播放 | 亚洲欧美一区在线 | 国产成人在线观看免费 | 午夜色婷婷 | 日韩欧美在线视频 | 亚洲午夜网 | 欧美性大战久久久久久久蜜臀 | av一二三区 | 天堂一区二区三区四区 | 久久九精品 | av在线免费播放 | 91精品久久久久久久 |