模塊如圖
1.jpg (659.23 KB, 下載次數(shù): 77)
下載附件
2020-4-28 13:43 上傳
壓縮包中共有三個程序:
分別為:軟件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文件中
0.jpg (482.87 KB, 下載次數(shù): 63)
下載附件
2020-4-28 14:15 上傳
51hei.png (263.05 KB, 下載次數(shù): 75)
下載附件
2020-4-28 14:57 上傳
單片機源程序如下:
- #include <intrins.h>
- #include "public.h"
- #include "OLED.h"
- #include "ASCII.h"
- #include "text.h"
- #include "port.h"
- //使用位操作加快SPI讀寫速度
- u8 bdata Byte_data;
- sbit Byte_data7=Byte_data^7;
- sbit Byte_data6=Byte_data^6;
- sbit Byte_data5=Byte_data^5;
- sbit Byte_data4=Byte_data^4;
- sbit Byte_data3=Byte_data^3;
- sbit Byte_data2=Byte_data^2;
- sbit Byte_data1=Byte_data^1;
- sbit Byte_data0=Byte_data^0;
- void OLED_delay500ms()//12.000MHz
- {
- u8 i,j,k;
- i=23;
- j=205;
- k=120;
- do
- {
- do
- {
- while (--k);
- }while (--j);
- }while (--i);
- }
- //MCU向OLED寫入一個字節(jié)(字節(jié)數(shù)據(jù),選擇字節(jié)為命令還是數(shù)據(jù))
- void MCU_write_OLED_Byte(u8 Byte,u8 command_or_data)
- {
- OLED_DC=command_or_data;
- OLED_CS=0;
- OLED_MOSI=1;
- Byte_data=Byte;
- OLED_CLK=0;OLED_MOSI=Byte_data7;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data6;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data5;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data4;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data3;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data2;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data1;OLED_CLK=1;
- OLED_CLK=0;OLED_MOSI=Byte_data0;OLED_CLK=1;
- OLED_MOSI=1;
- OLED_CS=1;
- }
- //光標的位置,0到7行,0到127列(行,列)
- void OLED_cursor_location(u8 row,u8 column)
- {
- MCU_write_OLED_Byte(0xB0+row,OLED_COMMAND);//設(shè)置行(0~7)
- MCU_write_OLED_Byte(0x10|(column&0xF0)>>4,OLED_COMMAND);//設(shè)置顯示位置大列(0~7)
- MCU_write_OLED_Byte(0x00|(column&0x0F),OLED_COMMAND);//設(shè)置顯示位置小列(0~7)
- }
- //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
- void OLED_set_memory_address_mode(u8 mode)
- {
- MCU_write_OLED_Byte(0x20,OLED_COMMAND);//設(shè)置內(nèi)存地址模式(使用水平地址模式或垂直地址模式)
- MCU_write_OLED_Byte(mode,OLED_COMMAND);//水平地址模式:0x00,垂直地址模式:0x01,頁地址模式:0x02
- MCU_write_OLED_Byte(0x21,OLED_COMMAND);//設(shè)置顯示位置列初始地址和終止地址
- MCU_write_OLED_Byte(0x00,OLED_COMMAND);//列初始地址
- MCU_write_OLED_Byte(0x7F,OLED_COMMAND);//列終止地址
- MCU_write_OLED_Byte(0x22,OLED_COMMAND);//設(shè)置顯示位置頁初始地址和終止地址
- MCU_write_OLED_Byte(0x00,OLED_COMMAND);//頁初始地址
- MCU_write_OLED_Byte(0x07,OLED_COMMAND);//頁終止地址
- }
- //清屏
- void OLED_clear()
- {
- u16 i;
- for(i=0;i<1024;++i) MCU_write_OLED_Byte(0x00,OLED_DATA);
- }
- //打印BMP圖片(圖片數(shù)組,選擇圖片的取模方式(水平取模:0x00或垂直取模:0x01),是否反色(填0或1))
- void OLED_print_BMP(u8 *p,u8 mode,u8 invert_color)
- {
- u16 i;
- OLED_set_memory_address_mode(mode);
- if(invert_color) for(i=0;i<1024;++i) MCU_write_OLED_Byte(~*(p+i),OLED_DATA);
- else for(i=0;i<1024;++i) MCU_write_OLED_Byte(*(p+i),OLED_DATA);
- }
- //OLED打印單個字符(行(0到3),列(0到15),字符,是否反色(填0或1))
- void OLED_print_char(u8 row,u8 column,u8 _char,u8 invert_color)
- {
- u8 i;
- if(invert_color)
- {
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(2*row,8*column);
- for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(2*row+1,8*column);
- for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i+8],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
- }
- else
- {
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(2*row,8*column);
- for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(2*row+1,8*column);
- for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i+8],OLED_DATA);//因為ASCII碼0到31位去除了,所以減32
- }
- }
- //OLED打印單個文字(行(0到3),列(0到15),單個所在文字的數(shù)組,是否反色(填0或1))
- void OLED_print_single_word(u8 row,u8 column,u8 *word,u8 invert_color)
- {
- u16 i;
- u8 j;
- for(i=0;i<(sizeof(text))/35;++i)
- {
- if((*word==text[i].name[0])&&(*(word+1)==text[i].name[1]))//對比漢字區(qū)碼位碼
- {
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(2*row,8*column);
- for(j=0;j<32;++j)
- {
- if(j==16) OLED_cursor_location(2*row+1,8*column);//光標的位置,0到7行,0到127列(行,列)
- if(invert_color) MCU_write_OLED_Byte(~text[i].array[j],OLED_DATA);
- else MCU_write_OLED_Byte(text[i].array[j],OLED_DATA);
- }
- }
- }
- }
- //OLED打印文本(行(0到3),列(0到15),所打印的文本,是否反色(填0或1))
- void OLED_print_text(u8 row,u8 column,u8 *p,u8 invert_color)
- {
- //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
- OLED_set_memory_address_mode(0x00);
- while(*p!='\0')
- {
- if(*p&0x80)//判斷是否為漢字
- {
- //OLED打印單個文字(行(0到3),列(0到15),單個所在文字的數(shù)組,是否反色(填0或1))
- OLED_print_single_word(row,column,p,invert_color);
- p=p+2;
- column=column+2;
- }
- else
- {
- //OLED打印單個字符(行(0到3),列(0到15),字符,是否反色(填0或1))
- OLED_print_char(row,column,*p,invert_color);
- ++p;
- ++column;
- }
-
- if(*p&0x80)//判斷下一個字符是中文還是英文,防止在末尾顯示的位置不夠
- {
- if(column>=15)
- {
- ++row;
- column=0;
- }
- }
- else
- {
- if(column==16)
- {
- ++row;
- column=0;
- }
- }
-
- if(row==4) return;//第四行不存在,顯示到第四行直接退出(從第零行開始算)
- }
- }
- //初始化OLED(內(nèi)存地址模式默認使用水平地址模式,可在初始化程序中更改)
- void OLED_init()
- {
- OLED_RES=1;
- OLED_delay500ms();//延時函數(shù)
- OLED_RES=0;
- OLED_delay500ms();//延時函數(shù)
- OLED_RES=1;
-
- MCU_write_OLED_Byte(0xAE,OLED_COMMAND);//關(guān)閉顯示
- MCU_write_OLED_Byte(0x00,OLED_COMMAND);//設(shè)置低列地址
- MCU_write_OLED_Byte(0x10,OLED_COMMAND);//設(shè)置高列地址
- MCU_write_OLED_Byte(0x40,OLED_COMMAND);//設(shè)置顯示起始行
-
- MCU_write_OLED_Byte(0xB0,OLED_COMMAND);//設(shè)置頁地址
- MCU_write_OLED_Byte(0x81,OLED_COMMAND);//
- MCU_write_OLED_Byte(0xFF,OLED_COMMAND);//
-
- MCU_write_OLED_Byte(0xA1,OLED_COMMAND);//設(shè)置細分重映射(0xA1正常,0xA0左右反置)
- MCU_write_OLED_Byte(0xA6,OLED_COMMAND);//設(shè)置正常/反向(0xA6正常顯示,0xA7反向顯示)
- MCU_write_OLED_Byte(0xA8,OLED_COMMAND);//設(shè)置多路比率
- MCU_write_OLED_Byte(0x3F,OLED_COMMAND);
- MCU_write_OLED_Byte(0xC8,OLED_COMMAND);//設(shè)置列輸出掃描方向(0xC8正常,0xC0上下反置)
- MCU_write_OLED_Byte(0xD3,OLED_COMMAND);//設(shè)置顯示偏移(垂直偏移)
- MCU_write_OLED_Byte(0x00,OLED_COMMAND);
- MCU_write_OLED_Byte(0xD5,OLED_COMMAND);//設(shè)置顯示時鐘分頻
- MCU_write_OLED_Byte(0x80,OLED_COMMAND);
- MCU_write_OLED_Byte(0xD9,OLED_COMMAND);//設(shè)置預(yù)充電周期
- MCU_write_OLED_Byte(0xF1,OLED_COMMAND);//將預(yù)充電設(shè)置為15個時鐘加上其放電設(shè)置為1個時鐘
- MCU_write_OLED_Byte(0xDA,OLED_COMMAND);//設(shè)置COM口硬件配置
- MCU_write_OLED_Byte(0x12,OLED_COMMAND);//啟用備用COM向?qū)渲?br />
- MCU_write_OLED_Byte(0xDB,OLED_COMMAND);//設(shè)置Vcomh取消選擇等級
- MCU_write_OLED_Byte(0x30,OLED_COMMAND);//
- MCU_write_OLED_Byte(0x8D,OLED_COMMAND);//充電凹凸設(shè)置
- MCU_write_OLED_Byte(0x14,OLED_COMMAND);//在顯示期間啟用血漿泵
-
- //光標的位置,0到7行,0到127列(行,列)
- OLED_cursor_location(0,0);
-
- //設(shè)置內(nèi)存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
- OLED_set_memory_address_mode(0x00);
-
- //清屏
- OLED_clear();
-
- MCU_write_OLED_Byte(0xAF,OLED_COMMAND);//開啟顯示
- }
復(fù)制代碼
51hei.png (5.12 KB, 下載次數(shù): 73)
下載附件
2020-4-28 14:58 上傳
所有資料51hei提供下載:
0.96寸12864OLED(SSD1306)模塊.rar
(313.5 KB, 下載次數(shù): 423)
2020-4-28 14:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
鏈接:游客,本帖隱藏的內(nèi)容需要積分高于 1 才可瀏覽,您當前積分為 0
今天閑逛帖子,無意之中找到上述問題解決方法,實測有效
http://www.zg4o1577.cn/bbs/dpj-42047-1.html
http://www.zg4o1577.cn/bbs/dpj-5399-1.html |