- #include "delay.h"
- #include "oled.h"
- #include "oledfont.h"
- #include "string.h"
- #include "math.h"
- #include "myiic.h"
-
- u8 OLED_GRAM[8][128];/*定義OLED顯存數組*/
-
- /*
- 函數功能: 向SSD1106寫入一個字節
- 函數參數: dat:要寫入的數據/命令
- cmd:數據/命令標志 0表示命令 1表示數據
- */
- void OLED_WR_Byte(u8 dat,u8 cmd)
- {
- IIC_Start(); //開始傳輸
- IIC_Send_Byte(0x78); //傳輸地址
- IIC_Wait_Ack(); //接收1306返回的確認信號
- if(cmd) IIC_Send_Byte(0x40); //發送控制字節,寫數據
- else IIC_Send_Byte(0x00); //發送控制字節,寫命令
- IIC_Wait_Ack(); //接收1306返回的確認信號
- IIC_Send_Byte(dat); //發送數據字節
- IIC_Wait_Ack(); //接收1306返回的確認信號
- IIC_Stop(); //結束傳輸
- }
-
- /*********************OLED初始化************************************/
- void OLED_Init(void)
- {
- IIC_Init();
- delay_ms(500); //初始化之前的延時很重要!
- OLED_WR_Byte(0xAE,OLED_CMD); //關閉顯示
- OLED_WR_Byte(0x00,OLED_CMD);//設置低列地址
- OLED_WR_Byte(0x10,OLED_CMD);//設置高列地址
- OLED_WR_Byte(0x40,OLED_CMD);//設置起始行地址,集映射RAM顯示起始行(0x00~0x3F)
- OLED_WR_Byte(0x81,OLED_CMD);//設置對比度控制寄存器
- OLED_WR_Byte(0xCF,OLED_CMD);//設置SEG輸出電流亮度
- OLED_WR_Byte(0xA1,OLED_CMD);//段重定義設置,bit0:0,0->0;1,0->127; 0xa0左右反置 0xa1正常
- OLED_WR_Byte(0xC8,OLED_CMD);//設置COM掃描方向;bit3:0,普通模式;1,重定義模式 COM[N-1]->COM0;N:驅動路數 0xc0上下反置 0xc8正常
- OLED_WR_Byte(0xA6,OLED_CMD);//設置正常顯示(設置顯示方式;bit0:1,反相顯示;0,正常顯示 )
- OLED_WR_Byte(0xA8,OLED_CMD);//設置驅動路數 設置多路復用比(1比64)
- OLED_WR_Byte(0x3F,OLED_CMD);//1/64 duty(默認0X3F(1/64))
- OLED_WR_Byte(0xD3,OLED_CMD);//設置顯示偏移位移映射RAM計數器(0x00~0x3F)
- OLED_WR_Byte(0x00,OLED_CMD);//-not offset
- OLED_WR_Byte(0xD5,OLED_CMD);//設置顯示時鐘分頻比/振蕩器頻率
- OLED_WR_Byte(0x80,OLED_CMD);//設置分頻比,設置時鐘為100幀/秒
- OLED_WR_Byte(0xD9,OLED_CMD);//設置預充電周期
- OLED_WR_Byte(0xF1,OLED_CMD);//設置預充15個時鐘,放電1個時鐘([3:0],PHASE 1;[7:4],PHASE 2;)
- OLED_WR_Byte(0xDA,OLED_CMD);//設置COM硬件引腳配置
- OLED_WR_Byte(0x12,OLED_CMD);//[5:4]配置
- OLED_WR_Byte(0xDB,OLED_CMD);//設置VCOMH 電壓倍率
- OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM 釋放電壓([6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;)
- OLED_WR_Byte(0x20,OLED_CMD);//設置頁面尋址模式(0x00/0x01/0x02)
- OLED_WR_Byte(0x02,OLED_CMD);//[1:0],00,列地址模式;01,行地址模式;10,頁地址模式;默認10;
- OLED_WR_Byte(0x8D,OLED_CMD);//設置充電泵啟用/禁用
- OLED_WR_Byte(0x14,OLED_CMD);//設置(0x10禁用,0x14啟用)
- OLED_WR_Byte(0xA4,OLED_CMD);// 全局顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏) (0xa4/0xa5)
- OLED_WR_Byte(0xA6,OLED_CMD);// 設置顯示方式;bit0:1,反相顯示;0,正常顯示 (0xa6/a7)
- OLED_WR_Byte(0xAF,OLED_CMD);//開啟顯示
- OLED_Clear();
- OLED_SetCursorAddrese(0,0);
- //printf("OLED Init OK !\n");
- }
- /*函數功能:開啟OLED顯示 */
- void OLED_Display_On(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令(設置電荷泵)
- OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON (開啟電荷泵)
- OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON(OLED喚醒)
- }
- /*函數功能:關閉OLED顯示*/
-
- void OLED_Display_Off(void)
- {
- OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 (設置電荷泵)
- OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF (關閉電荷泵)
- OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF (OLED休眠)
- }
-
-
- /*
- 函數功能:清屏函數,清完屏,整個屏幕是黑色的!
- 說明: 清屏就是向OLED里寫0
- 對于OLED屏,0就不顯示,1才會在屏幕上顯示出來一個點
- */
- void OLED_Clear(void)
- {
- u8 i,n;
- for(i=0;i<8;i++)
- {
- OLED_WR_Byte(0xB0+i,OLED_CMD);//設置頁地址(0~7)
- OLED_WR_Byte(0x00,OLED_CMD); //設置顯示位置―列低地址
- OLED_WR_Byte(0x10,OLED_CMD); //設置顯示位置―列高地址
- for(n=0;n<128;n++)
- {
- OLED_WR_Byte(0x00,OLED_DATA);
- }
- }
- }
- /*
- 函數功能:在顯存數組上畫一個點
- 函數參數:x,y為點的橫縱坐標 c為這個點的亮滅(1亮0滅)
- 參數范圍:x 0~128 y 0~8
- 每一個數據是 低位在前,高位在后
- */
- void OLED_Draw_Point(u8 x,u8 y,u8 c)
- {
- u8 page,addr;
- page = y/8; //顯存的頁地址
- addr = y%8; //顯存的一個字節數據中c所在的位置
- if(c) OLED_GRAM[page ][ x] |= 1<<addr;
- else OLED_GRAM[page ][ x] &= ~(1<<addr);
- }
-
- /*
- 函數功能: 設置光標位置
- 函數參數: x列的起始位置(0~127)
- y頁的起始位置(0~7)
- 比如: 0x8 高4位0000 低4位1000
- */
- void OLED_SetCursorAddrese(u8 x,u8 y)
- {
- OLED_WR_Byte(0xB0+y,OLED_CMD); //設置頁地址
- //第6列顯示數據 6被分成2個4位(高位和低位)。
- OLED_WR_Byte((x&0xF0)>>4|0x10,OLED_CMD);//設置列高起始地址(半字節)
- OLED_WR_Byte((x&0x0F)|0x00,OLED_CMD); //設置列低起始地址(半字節)
- }
- /*****************************************************
- ** 函數名稱:OLED_VerticalDisplay
- ** 函數功能:實現OLED垂直滾動范圍配置
- ** 參 數:1.toprow:設置滾動起始行
- ** 2.scrollrow:設置滾動行數
- ** 注意:toprow+scrollrow<64
- ** 函數返回:無
- ******************************************************/
- void OLED_VerticalDisplay(u8 toprow,u8 scrollrow)
- {
- OLED_WR_Byte(SET_VERTICAL_SCROLL_AREA,OLED_CMD);
- OLED_WR_Byte(toprow,OLED_CMD);
- OLED_WR_Byte(scrollrow,OLED_CMD);
- }
-
- /*****************************************************
- ** 函數名稱:OledScrollStop
- ** 函數功能:關閉滾屏功能
- ******************************************************/
- void OledScrollStop(void)
- {
- OLED_WR_Byte(DEACTIVATE_SCROLL,OLED_CMD);
- }
-
- /*
- 函數功能: 按頁清屏 (0~7)
- */
- void OLED_PageClear(u8 page)
- {
- u8 j;
- OLED_WR_Byte(0xB0+page,OLED_CMD); //設置頁地址
- OLED_WR_Byte(0x10,OLED_CMD); //設置列高起始地址(半字節)
- OLED_WR_Byte(0x00,OLED_CMD); //設置列低起始地址(半字節)
- for(j=0;j<128;j++)
- {
- OLED_WR_Byte(0,OLED_DATA); //寫數據
- }
- }
-
- /*
- 函數功能:更新顯存到OLED屏幕上*/
- void OLED_Refresh_Screen(void)
- {
- u8 page,list; //定義頁地址和列地址
- for(page=0;page<8;page++)
- {
- OLED_WR_Byte(0xB0+page,OLED_CMD); //設置頁地址(0~7)
- OLED_WR_Byte(0x00,OLED_CMD); //設置顯示位置―列低地址
- OLED_WR_Byte(0x10,OLED_CMD); //設置顯示位置―列高地址
- for(list=0;list<128;list++)
- {
- OLED_WR_Byte(OLED_GRAM[page ][list],OLED_DATA);
- }
- }
- memset(OLED_GRAM,0,sizeof(OLED_GRAM)); /*清空顯存數組*/
- }
-
- u8 Oled_Display(u8 x ,u8 y ,u8 width , u8 height)
- {
- u8 i,j;
- if(width>128) width=128;
- if(height>64) height=64;
- /*1. OLED顯示屏初始化*/
- OLED_Clear(); //清屏
- for(i=0;i<height/8;i++)
- {
- OLED_WR_Byte(0xB0+i,OLED_CMD); //設置頁地址(0~7)
- OLED_WR_Byte(0x00,OLED_CMD); //設置顯示位置―列低地址
- OLED_WR_Byte(0x10,OLED_CMD); //設置顯示位置―列高地址
- for(j=0;j<width;j++)
- {
- // OLED_WR_Byte(BMP[i][j],OLED_DATA);
- }
- }
- delay_ms(10);
- return 0;
- }
-
-
- void OLED_DisplayString(u8 x,u8 y,u8 width,u8 height,u8 *str)
- {
- u8 addr=0,i;
- u16 font=0;
- while(*str!='\0') //連續顯示
- {
- //取模從空格開始的,計算下標
- //寫8*16ASCII字符的上半部分
- if(*str >= ' '&& *str <= '~') //顯示英文
- {
- addr=*str-' '; //取模從空格開始的,計算下標
- //寫8*16ASCII字符的上半部分
- OLED_SetCursorAddrese(x,y); //設置光標的位置
- for(i=0;i<width/2;i++) //橫向寫width列
- {
- OLED_WR_Byte(ASCII_8_16[addr][i],OLED_DATA);
- }
- //寫8*16ASCII字符的下半部分
- OLED_SetCursorAddrese(x,y+1); //設置光標的位置
- for(i=0;i<width/2;i++) //橫向寫width列
- {
- OLED_WR_Byte(ASCII_8_16[addr][i+width/2],OLED_DATA);
- }
- str++;//繼續顯示下一個字符
- x+=width/2; //在下一個位置繼續顯示數據
- }
- else //顯示中文
- {
- OLED_SetCursorAddrese(x,y); //設置光標的位置
- font=((*str)<<8)|(*(str+1));
- switch(font)
- {
- case 0xCEC2:addr=0;break;//溫
- case 0xCAAA:addr=1;break;//濕
- case 0xB6C8:addr=2;break;//度
- case 0xCAFD:addr=3;break;//數
- case 0xBEDD:addr=4;break;//據
- case 0xB3C9:addr=5;break;//成
- case 0xB9A6:addr=6;break;//功
- case 0xB7A2:addr=7;break;//發
- case 0xCBCD:addr=8;break;//送
- case 0xC1AC:addr=9;break;//連
- case 0xBDD3:addr=10;break;//接
- case 0xB7FE:addr=11;break;//服
- case 0xCEF1:addr=12;break;//務
- case 0xC6F7:addr=13;break;//器
- case 0xC9CF:addr=14;break;//上
- case 0xCFC2:addr=15;break;//下
- case 0xCFDE:addr=16;break;//限
- case 0xD6B5:addr=17;break;//值
- case 0xC9E8:addr=18;break;//設
- case 0xD6C3:addr=19;break;//置
- case 0xB4AB:addr=20;break;//傳
- case 0xD6DC:addr=21;break;//周
- case 0xC6DA:addr=22;break;//期
- case 0xBFD8:addr=23;break;//控
- case 0xD6C6:addr=24;break;//制
- case 0xB2CE:addr=25;break;//參
- case 0xD7DC:addr=26;break;//總
- case 0xB1ED:addr=27;break;//表
- case 0xB1B8:addr=28;break;//備
- case 0xCDF8:addr=29;break;//網
- case 0xC2E7:addr=30;break;//絡
- case 0xD0C5:addr=31;break;//信
- case 0xCFA2:addr=32;break;//息
- case 0xCAA7:addr=33;break;//失
- case 0xB0DC:addr=34;break;//敗
- case 0xB1A3:addr=35;break;//保
- case 0xB4E6:addr=36;break;//存
- case 0xB9FD:addr=37;break;//過
- case 0xB8DF:addr=38;break;//高
- case 0xA1E6:addr=39;break;//℃
- case 0xD0C7:addr=40;break;//星
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 全部代碼51hei下載地址:
IIC實驗.7z
(202.64 KB, 下載次數: 25)
2020-10-15 22:50 上傳
點擊文件名下載附件
已實現 下載積分: 黑幣 -5
|