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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機0.96寸OLED12864(IIC接口和SPI接口)模塊測試程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:658665 發(fā)表于 2020-4-28 14:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
模塊如圖


壓縮包中共有三個程序:
分別為:軟件IIC,軟件SPI和硬件SPI

軟件IIC用于IIC接口的OLED模塊
使用STC89C516單片機和STC12C5A60S2單片機,12MHz晶振,測試通過

軟件SPI和硬件SPI用于SPI接口的OLED模塊
軟件SPI使用STC89C516單片機和STC12C5A60S2單片機,12MHz晶振,測試通過
硬件SPI使STC12C5A60S2單片機,12MHz晶振,測試通過
注意:在用硬件SPI程序時留意單片機是否有硬件SPI(STC89C516單片機無硬件SPI)

程序功能:
1.顯示128*64圖片,圖片可以列行取模和列取模,可反色顯示
2.支持漢字英文混合顯示,漢字應(yīng)先用取模軟件取模,,可反色顯示
注意:漢字只可以用列行取模,取模后數(shù)據(jù)存放在OLED文件夾中的text.h文件中





單片機源程序如下:
  1. #include <intrins.h>
  2. #include "public.h"
  3. #include "OLED.h"
  4. #include "ASCII.h"
  5. #include "text.h"
  6. #include "port.h"

  7. //使用位操作加快SPI讀寫速度
  8. u8 bdata Byte_data;
  9. sbit Byte_data7=Byte_data^7;
  10. sbit Byte_data6=Byte_data^6;
  11. sbit Byte_data5=Byte_data^5;
  12. sbit Byte_data4=Byte_data^4;
  13. sbit Byte_data3=Byte_data^3;
  14. sbit Byte_data2=Byte_data^2;
  15. sbit Byte_data1=Byte_data^1;
  16. sbit Byte_data0=Byte_data^0;

  17. void OLED_delay500ms()//12.000MHz
  18. {
  19.         u8 i,j,k;

  20.         i=23;
  21.         j=205;
  22.         k=120;
  23.         do
  24.         {
  25.                 do
  26.                 {
  27.                         while (--k);
  28.                 }while (--j);
  29.         }while (--i);
  30. }

  31. //MCU向OLED寫入一個字節(jié)(字節(jié)數(shù)據(jù),選擇字節(jié)為命令還是數(shù)據(jù))
  32. void MCU_write_OLED_Byte(u8 Byte,u8 command_or_data)
  33. {
  34.         OLED_DC=command_or_data;
  35.         OLED_CS=0;
  36.         OLED_MOSI=1;
  37.         Byte_data=Byte;
  38.         OLED_CLK=0;OLED_MOSI=Byte_data7;OLED_CLK=1;
  39.         OLED_CLK=0;OLED_MOSI=Byte_data6;OLED_CLK=1;
  40.         OLED_CLK=0;OLED_MOSI=Byte_data5;OLED_CLK=1;
  41.         OLED_CLK=0;OLED_MOSI=Byte_data4;OLED_CLK=1;
  42.         OLED_CLK=0;OLED_MOSI=Byte_data3;OLED_CLK=1;
  43.         OLED_CLK=0;OLED_MOSI=Byte_data2;OLED_CLK=1;
  44.         OLED_CLK=0;OLED_MOSI=Byte_data1;OLED_CLK=1;
  45.         OLED_CLK=0;OLED_MOSI=Byte_data0;OLED_CLK=1;
  46.         OLED_MOSI=1;
  47.         OLED_CS=1;
  48. }

  49. //光標的位置,0到7行,0到127列(行,列)
  50. void OLED_cursor_location(u8 row,u8 column)
  51. {
  52.         MCU_write_OLED_Byte(0xB0+row,OLED_COMMAND);//設(shè)置行(0~7)
  53.         MCU_write_OLED_Byte(0x10|(column&0xF0)>>4,OLED_COMMAND);//設(shè)置顯示位置大列(0~7)
  54.         MCU_write_OLED_Byte(0x00|(column&0x0F),OLED_COMMAND);//設(shè)置顯示位置小列(0~7)
  55. }

  56. //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  57. void OLED_set_memory_address_mode(u8 mode)
  58. {
  59.         MCU_write_OLED_Byte(0x20,OLED_COMMAND);//設(shè)置內(nèi)存地址模式(使用水平地址模式或垂直地址模式)
  60.         MCU_write_OLED_Byte(mode,OLED_COMMAND);//水平地址模式:0x00,垂直地址模式:0x01,頁地址模式:0x02
  61.         MCU_write_OLED_Byte(0x21,OLED_COMMAND);//設(shè)置顯示位置列初始地址和終止地址
  62.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//列初始地址
  63.         MCU_write_OLED_Byte(0x7F,OLED_COMMAND);//列終止地址
  64.         MCU_write_OLED_Byte(0x22,OLED_COMMAND);//設(shè)置顯示位置頁初始地址和終止地址
  65.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//頁初始地址
  66.         MCU_write_OLED_Byte(0x07,OLED_COMMAND);//頁終止地址
  67. }

  68. //清屏
  69. void OLED_clear()
  70. {  
  71.         u16 i;
  72.         for(i=0;i<1024;++i) MCU_write_OLED_Byte(0x00,OLED_DATA);
  73. }

  74. //打印BMP圖片(圖片數(shù)組,選擇圖片的取模方式(水平取模:0x00或垂直取模:0x01),是否反色(填0或1))
  75. void OLED_print_BMP(u8 *p,u8 mode,u8 invert_color)
  76. {
  77.         u16 i;
  78.         OLED_set_memory_address_mode(mode);
  79.         if(invert_color) for(i=0;i<1024;++i) MCU_write_OLED_Byte(~*(p+i),OLED_DATA);
  80.         else for(i=0;i<1024;++i) MCU_write_OLED_Byte(*(p+i),OLED_DATA);
  81. }

  82. //OLED打印單個字符(行(0到3),列(0到15),字符,是否反色(填0或1))
  83. void OLED_print_char(u8 row,u8 column,u8 _char,u8 invert_color)
  84. {
  85.         u8 i;
  86.         if(invert_color)
  87.         {
  88.                 //光標的位置,0到7行,0到127列(行,列)
  89.                 OLED_cursor_location(2*row,8*column);
  90.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
  91.                 //光標的位置,0到7行,0到127列(行,列)
  92.                 OLED_cursor_location(2*row+1,8*column);
  93.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i+8],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
  94.         }
  95.         else
  96.         {
  97.                 //光標的位置,0到7行,0到127列(行,列)
  98.                 OLED_cursor_location(2*row,8*column);
  99.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
  100.                 //光標的位置,0到7行,0到127列(行,列)
  101.                 OLED_cursor_location(2*row+1,8*column);
  102.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i+8],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
  103.         }
  104. }

  105. //OLED打印單個文字(行(0到3),列(0到15),單個所在文字的數(shù)組,是否反色(填0或1))
  106. void OLED_print_single_word(u8 row,u8 column,u8 *word,u8 invert_color)
  107. {
  108.         u16 i;
  109.         u8 j;
  110.         for(i=0;i<(sizeof(text))/35;++i)
  111.         {
  112.                 if((*word==text[i].name[0])&&(*(word+1)==text[i].name[1]))//對比漢字區(qū)碼位碼
  113.                 {
  114.                         //光標的位置,0到7行,0到127列(行,列)
  115.                         OLED_cursor_location(2*row,8*column);
  116.                         for(j=0;j<32;++j)
  117.                         {
  118.                                 if(j==16) OLED_cursor_location(2*row+1,8*column);//光標的位置,0到7行,0到127列(行,列)
  119.                                 if(invert_color) MCU_write_OLED_Byte(~text[i].array[j],OLED_DATA);
  120.                                 else MCU_write_OLED_Byte(text[i].array[j],OLED_DATA);
  121.                         }
  122.                 }
  123.         }
  124. }

  125. //OLED打印文本(行(0到3),列(0到15),所打印的文本,是否反色(填0或1))
  126. void OLED_print_text(u8 row,u8 column,u8 *p,u8 invert_color)
  127. {
  128.         //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  129.         OLED_set_memory_address_mode(0x00);
  130.         while(*p!='\0')
  131.         {
  132.                 if(*p&0x80)//判斷是否為漢字
  133.                 {
  134.                         //OLED打印單個文字(行(0到3),列(0到15),單個所在文字的數(shù)組,是否反色(填0或1))
  135.                         OLED_print_single_word(row,column,p,invert_color);
  136.                         p=p+2;
  137.                         column=column+2;
  138.                 }
  139.                 else
  140.                 {
  141.                         //OLED打印單個字符(行(0到3),列(0到15),字符,是否反色(填0或1))
  142.                         OLED_print_char(row,column,*p,invert_color);
  143.                         ++p;
  144.                         ++column;
  145.                 }
  146.                
  147.                 if(*p&0x80)//判斷下一個字符是中文還是英文,防止在末尾顯示的位置不夠
  148.                 {
  149.                         if(column>=15)
  150.                         {
  151.                                 ++row;
  152.                                 column=0;
  153.                         }
  154.                 }
  155.                 else
  156.                 {
  157.                         if(column==16)
  158.                         {
  159.                                 ++row;
  160.                                 column=0;
  161.                         }
  162.                 }
  163.                
  164.                 if(row==4) return;//第四行不存在,顯示到第四行直接退出(從第零行開始算)
  165.         }
  166. }

  167. //初始化OLED(內(nèi)存地址模式默認使用水平地址模式,可在初始化程序中更改)
  168. void OLED_init()
  169. {
  170.         OLED_RES=1;
  171.         OLED_delay500ms();//延時函數(shù)
  172.         OLED_RES=0;
  173.         OLED_delay500ms();//延時函數(shù)
  174.         OLED_RES=1;
  175.         
  176.         MCU_write_OLED_Byte(0xAE,OLED_COMMAND);//關(guān)閉顯示
  177.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//設(shè)置低列地址
  178.         MCU_write_OLED_Byte(0x10,OLED_COMMAND);//設(shè)置高列地址
  179.         MCU_write_OLED_Byte(0x40,OLED_COMMAND);//設(shè)置顯示起始行
  180.         
  181.         MCU_write_OLED_Byte(0xB0,OLED_COMMAND);//設(shè)置頁地址
  182.         MCU_write_OLED_Byte(0x81,OLED_COMMAND);//
  183.         MCU_write_OLED_Byte(0xFF,OLED_COMMAND);//
  184.         
  185.         MCU_write_OLED_Byte(0xA1,OLED_COMMAND);//設(shè)置細分重映射(0xA1正常,0xA0左右反置)
  186.         MCU_write_OLED_Byte(0xA6,OLED_COMMAND);//設(shè)置正常/反向(0xA6正常顯示,0xA7反向顯示)
  187.         MCU_write_OLED_Byte(0xA8,OLED_COMMAND);//設(shè)置多路比率
  188.         MCU_write_OLED_Byte(0x3F,OLED_COMMAND);
  189.         MCU_write_OLED_Byte(0xC8,OLED_COMMAND);//設(shè)置列輸出掃描方向(0xC8正常,0xC0上下反置)
  190.         MCU_write_OLED_Byte(0xD3,OLED_COMMAND);//設(shè)置顯示偏移(垂直偏移)
  191.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);
  192.         MCU_write_OLED_Byte(0xD5,OLED_COMMAND);//設(shè)置顯示時鐘分頻
  193.         MCU_write_OLED_Byte(0x80,OLED_COMMAND);
  194.         MCU_write_OLED_Byte(0xD9,OLED_COMMAND);//設(shè)置預(yù)充電周期
  195.         MCU_write_OLED_Byte(0xF1,OLED_COMMAND);//將預(yù)充電設(shè)置為15個時鐘加上其放電設(shè)置為1個時鐘
  196.         MCU_write_OLED_Byte(0xDA,OLED_COMMAND);//設(shè)置COM口硬件配置
  197.         MCU_write_OLED_Byte(0x12,OLED_COMMAND);//啟用備用COM向?qū)渲?br />
  198.         MCU_write_OLED_Byte(0xDB,OLED_COMMAND);//設(shè)置Vcomh取消選擇等級
  199.         MCU_write_OLED_Byte(0x30,OLED_COMMAND);//
  200.         MCU_write_OLED_Byte(0x8D,OLED_COMMAND);//充電凹凸設(shè)置
  201.         MCU_write_OLED_Byte(0x14,OLED_COMMAND);//在顯示期間啟用血漿泵
  202.         
  203.         //光標的位置,0到7行,0到127列(行,列)
  204.         OLED_cursor_location(0,0);
  205.         
  206.         //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  207.         OLED_set_memory_address_mode(0x00);
  208.         
  209.         //清屏
  210.         OLED_clear();
  211.         
  212.         MCU_write_OLED_Byte(0xAF,OLED_COMMAND);//開啟顯示
  213. }
復(fù)制代碼

所有資料51hei提供下載:
0.96寸12864OLED(SSD1306)模塊.rar (313.5 KB, 下載次數(shù): 423)

鏈接:
游客,本帖隱藏的內(nèi)容需要積分高于 1 才可瀏覽,您當前積分為 0


今天閑逛帖子,無意之中找到上述問題解決方法,實測有效

http://www.zg4o1577.cn/bbs/dpj-42047-1.html
http://www.zg4o1577.cn/bbs/dpj-5399-1.html

評分

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

查看全部評分

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

使用道具 舉報

來自 2#
ID:658665 發(fā)表于 2020-7-24 20:01 | 只看該作者
OLED模塊測試程序V1.1
1.合并了模擬I2C和模擬SPI,在OLED.h文件中選擇
2.其他細微調(diào)整
0.96寸OLED模塊V1.1.rar (97.31 KB, 下載次數(shù): 96)
鏈接:https://pan.baidu.com/s/1St3LAFnIHSbK2ZxEOaD-fA
提取碼:peng


0.96寸OLED模塊.rar

97.31 KB, 下載次數(shù): 58, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

板凳
ID:430492 發(fā)表于 2020-4-28 19:33 | 只看該作者
支持一下分享!!
回復(fù)

使用道具 舉報

地板
ID:688460 發(fā)表于 2020-5-2 11:03 | 只看該作者
感謝樓主的無私奉獻!謝謝了!
回復(fù)

使用道具 舉報

5#
ID:748788 發(fā)表于 2020-12-12 10:35 | 只看該作者
下載測試了iic的程序,效果不錯
回復(fù)

使用道具 舉報

6#
ID:582255 發(fā)表于 2021-1-30 21:21 | 只看該作者
有仿真或?qū)嵨锞秃昧?/td>
回復(fù)

使用道具 舉報

7#
ID:605142 發(fā)表于 2021-2-1 14:34 | 只看該作者
剛開始刷新好慢,我也沒動哪里,現(xiàn)在發(fā)瘋了,刷得飛快
回復(fù)

使用道具 舉報

8#
ID:372579 發(fā)表于 2021-2-12 18:07 來自手機 | 只看該作者
收藏一下備用
回復(fù)

使用道具 舉報

9#
ID:835142 發(fā)表于 2021-2-13 01:51 來自手機 | 只看該作者
實在是太感謝樓主的分享了  本來學習就是一件需要恒心與毅力的過程,在學習過程中 我個人覺得  還是要有好的例程來幫助研究,學習無數(shù)前輩在研究過程中的經(jīng)驗,加快了學習的進度,在理解完之后,獲得了繼續(xù)下去的動力,樓主這樣的 真的太好了,謝謝樓主無私的分享!
回復(fù)

使用道具 舉報

10#
ID:835142 發(fā)表于 2021-2-15 02:37 來自手機 | 只看該作者
hefq 發(fā)表于 2021-2-1 14:34
剛開始刷新好慢,我也沒動哪里,現(xiàn)在發(fā)瘋了,刷得飛快

請問一下 你的OLED仿真是怎么來的呀 我的protuce 中沒有oled的仿真
回復(fù)

使用道具 舉報

11#
ID:759755 發(fā)表于 2021-2-19 11:56 | 只看該作者
有bad apple的動畫程序嗎?
回復(fù)

使用道具 舉報

12#
ID:605142 發(fā)表于 2021-2-22 15:26 | 只看該作者
君陌233 發(fā)表于 2021-2-15 02:37
請問一下 你的OLED仿真是怎么來的呀 我的protuce 中沒有oled的仿真

可能版本不同,下8.11
回復(fù)

使用道具 舉報

13#
ID:605142 發(fā)表于 2021-2-22 15:46 | 只看該作者

SPI測試也是可以的,剛開始連錯線,以為D/C是MISO,
回復(fù)

使用道具 舉報

14#
ID:605142 發(fā)表于 2021-2-23 16:56 | 只看該作者

回復(fù)

使用道具 舉報

15#
ID:766985 發(fā)表于 2021-2-26 15:19 | 只看該作者
收藏了,謝謝樓主分享
回復(fù)

使用道具 舉報

16#
ID:856401 發(fā)表于 2021-3-26 12:29 來自手機 | 只看該作者
已經(jīng)調(diào)試成功,謝謝
回復(fù)

使用道具 舉報

17#
ID:143767 發(fā)表于 2021-3-27 12:10 | 只看該作者
hefq 發(fā)表于 2021-2-1 14:34
剛開始刷新好慢,我也沒動哪里,現(xiàn)在發(fā)瘋了,刷得飛快

請問,IIC的OLED在Proteus到哪里找?
回復(fù)

使用道具 舉報

18#
ID:958215 發(fā)表于 2021-8-2 02:03 | 只看該作者
感謝樓主的無私奉獻!謝謝了!
回復(fù)

使用道具 舉報

19#
ID:924711 發(fā)表于 2021-10-7 17:55 來自手機 | 只看該作者
hefq 發(fā)表于 2021-2-23 16:56

請問一下你這個oled屏在proteus上是叫什么,輸入什么名稱來搜的?
回復(fù)

使用道具 舉報

20#
ID:935610 發(fā)表于 2021-10-9 15:58 | 只看該作者
OLED編程還真有一些難度,需要搞懂里面的時序才行。
回復(fù)

使用道具 舉報

21#
ID:582255 發(fā)表于 2022-6-17 11:20 | 只看該作者
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
size啊,這個怎么解決啊
回復(fù)

使用道具 舉報

22#
ID:907675 發(fā)表于 2022-7-9 19:25 | 只看該作者
aktuan007 發(fā)表于 2022-6-17 11:20
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
size啊,這個怎么解決啊

應(yīng)該是代碼大小的限制吧
回復(fù)

使用道具 舉報

23#
ID:66287 發(fā)表于 2022-7-12 10:01 | 只看該作者
感謝樓主的無私奉獻!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91亚洲精品国偷拍自产在线观看 | 久久亚洲国产精品日日av夜夜 | 中文字幕在线观看视频网站 | 日本特黄a级高清免费大片 国产精品久久性 | 黄色电影在线免费观看 | 欧美一卡二卡在线 | 久久婷婷国产麻豆91 | 亚洲视频欧美视频 | 欧美精品在线一区二区三区 | 国产精品久久久久久久久久妞妞 | 在线国产视频 | 一区二区三区四区不卡 | 久久成人精品视频 | 国产精品久久久久久久久久久久午夜片 | 欧美综合一区二区三区 | 国产精品视频网 | 国产在线视频一区二区 | av三级 | 国产成人精品一区二区三区网站观看 | 国产色| 成年男女免费视频网站 | 精产国产伦理一二三区 | 国产视频精品在线 | 免费毛片www com cn | 国产香蕉视频在线播放 | 午夜精品在线观看 | 操亚洲| 国产精品久久久久久久久久免费看 | 中文字幕在线观看一区二区 | 国产精品视频一 | 香蕉超碰 | 91精品国产91久久久久久丝袜 | 国产一区三区在线 | 国产精品国产精品国产专区不蜜 | 91亚洲视频在线 | 久久99精品久久久久久 | 欧美精产国品一二三区 | 久久久久久久香蕉 | 久久久久久久久淑女av国产精品 | 久久久精品高清 | jav成人av免费播放 |