摘要:顯示模塊如果還沒(méi)有看過(guò)協(xié)議的,請(qǐng)移步先看下面這篇文章協(xié)議好的,現(xiàn)在我們進(jìn)入正題向寄存器地址寫入一個(gè)的數(shù)據(jù)開啟發(fā)送設(shè)備地址讀寫控制,采用宏定義方式一般地址為,不行就嘗試下傳入?yún)?shù),為寄存器參數(shù),根據(jù)手冊(cè),寫入命令寄
如果還沒(méi)有看過(guò)I2C 協(xié)議的,請(qǐng)移步先看下面這篇文章
好的,現(xiàn)在我們進(jìn)入正題
?
void I2C_WriteByte(uint8_t addr,uint8_t data){ i2c_Start(); //開啟 協(xié)議 //0x78 轉(zhuǎn)化為 2進(jìn)制 0111 1110 再或上一個(gè) 0 | 1 的值,表示地址最后一位為讀寫控制指令 i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR); //發(fā)送地址 和 讀寫控制指令 if (i2c_WaitAck() != 0) { goto cmd_fail; } i2c_SendByte(addr); //發(fā)送對(duì)應(yīng)寄存器,判斷為0x00發(fā)送命令,還是0x40發(fā)送數(shù)據(jù) if (i2c_WaitAck() != 0) { goto cmd_fail; } i2c_SendByte(data); //對(duì)應(yīng)寄存器為 0x00,該data為命令,對(duì)應(yīng)寄存器為0x40,該data為數(shù)據(jù) if (i2c_WaitAck() != 0) { goto cmd_fail; } i2c_Stop(); //最后 停止協(xié)議cmd_fail: i2c_Stop();}
?
void WriteCmd(unsigned char I2C_Command){ I2C_WriteByte(0x00, I2C_Command);}void WriteDat(unsigned char I2C_Data){ I2C_WriteByte(0x40, I2C_Data);}
?
這邊代碼直接使用網(wǎng)上的,如果非要自己編寫,請(qǐng)查看 OLED 模塊使用手冊(cè),某寶一般都會(huì)提供,可能為 全英文文檔,沒(méi)錯(cuò),博主看不懂!
void OLED_Init(void){ delay_ms(1000); // 1s,一定要延時(shí),防止錯(cuò)誤 WriteCmd(0xAE); //display off WriteCmd(0x20); //Set Memory Addressing Mode WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 WriteCmd(0xc8); //Set COM Output Scan Direction WriteCmd(0x00); //---set low column address WriteCmd(0x10); //---set high column address WriteCmd(0x40); //--set start line address WriteCmd(0x81); //--set contrast control register WriteCmd(0xff); //亮度調(diào)節(jié) 0x00~0xff WriteCmd(0xa1); //--set segment re-map 0 to 127 WriteCmd(0xa6); //--set normal display WriteCmd(0xa8); //--set multiplex ratio(1 to 64) WriteCmd(0x3F); // WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content WriteCmd(0xd3); //-set display offset WriteCmd(0x00); //-not offset WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency WriteCmd(0xf0); //--set divide ratio WriteCmd(0xd9); //--set pre-charge period WriteCmd(0x22); // WriteCmd(0xda); //--set com pins hardware configuration WriteCmd(0x12); WriteCmd(0xdb); //--set vcomh WriteCmd(0x20); //0x20,0.77xVcc WriteCmd(0x8d); //--set DC-DC enable WriteCmd(0x14); // WriteCmd(0xaf); //--turn on oled panel}
?
void OLED_SetPos(unsigned char x, unsigned char y) { WriteCmd(0xb0+y); //設(shè)置頁(yè)坐標(biāo) WriteCmd(((x&0xf0)>>4)|0x10); //設(shè)置 列 高四位地址 WriteCmd((x&0x0f)|0x01); //設(shè)置 列 低四位地址 }
?
函數(shù)作用:填充每一頁(yè),實(shí)現(xiàn)全亮,全滅的操作
void OLED_Fill(unsigned char fill_Data){ unsigned char m,n; for(m=0;m<8;m++) { WriteCmd(0xb0+m); //page0-page7 WriteCmd(0x00); //第四位起始地址 WriteCmd(0x10); //高四位起始地址 for(n=0;n<128;n++) //每頁(yè)水平坐標(biāo)為 0 - 127 { WriteDat(fill_Data); //寫入數(shù)據(jù) 0x00 為全滅,0xff為全亮 } }}
?
采用 字符庫(kù)軟件生成 16 進(jìn)制數(shù),放入數(shù)組中
判斷是采用 6*8 數(shù)組還是 8*16 數(shù)組
空格的 ascll 碼為 32 ,需要減去,這樣才能得到正確的數(shù)字,字母,符號(hào)等
如果為 6*8 的 ascll 碼,每個(gè) x 就為 6,所以判斷一下 如果同一行后面不能準(zhǔn)確顯示,就換行,再顯示該字符
設(shè)置字符起點(diǎn),寫入對(duì)應(yīng)數(shù)據(jù),數(shù)據(jù)為字符軟件生成的字符。
case2 表示 8*16 的字符,一行 16 位 16進(jìn)制數(shù)代表某一個(gè)英文字符,8*16 代表列數(shù)為 8 個(gè),也就是每一行應(yīng)該輸出 8 個(gè) 16進(jìn)制數(shù),總共輸出兩行,先使用 ascall 碼找到英文字符對(duì)應(yīng)的所在位置,再設(shè)置 起點(diǎn)坐標(biāo),由于一次繪制 8 個(gè) 16進(jìn)制數(shù),所以 x+=8; j++ 表示開始下一個(gè)字符
?
就是類似于
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize){ unsigned char c = 0,i = 0,j = 0; switch(TextSize) { case 1: { while(ch[j] != "/0") { c = ch[j] - 32; if(x > 126) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<6;i++) WriteDat(F6x8[c][i]); x += 6; j++; } }break; case 2: { while(ch[j] != "/0") { c = ch[j] - 32; if(x > 120) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i]); OLED_SetPos(x,y+1); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i+8]); x += 8; j++; } }break; }}
?
與上面 字符串 case 2 中顯示相同
這邊的字符串?dāng)?shù)組為 12*12 ,一個(gè)漢字為 1個(gè) 2*12點(diǎn)陣,所以 addr 為 24*N
void OLED_ShowCN8(unsigned char x, unsigned char y, unsigned char N){ unsigned char wm=0; unsigned int adder=24*N; OLED_SetPos(x , y); for(wm = 0;wm < 12;wm++) { WriteDat(F12x12[adder]); adder += 1; } OLED_SetPos(x,y + 1); for(wm = 0;wm < 12;wm++) { WriteDat(F12x12[adder]); adder += 1; }}
?第一次嘗試編寫博客,若是有什么建議,歡迎批評(píng)指出。
?后續(xù)會(huì)逐步分塊更新,并會(huì)在最后一篇文章上傳源代碼。
?若是該文章對(duì)你有作用或是覺(jué)得文章寫得還行,幫忙點(diǎn)點(diǎn)贊,三連!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121621.html
摘要:負(fù)責(zé)對(duì)電能檢測(cè)模塊下發(fā)收集指令,以及對(duì)電能檢測(cè)模塊響應(yīng)的數(shù)據(jù)進(jìn)行處理,一方面對(duì)接收的單相數(shù)據(jù)進(jìn)行轉(zhuǎn)換后驅(qū)動(dòng)屏幕對(duì)相關(guān)數(shù)據(jù)進(jìn)行顯示,另一方面對(duì)單相數(shù)據(jù)進(jìn)行重新打包并通過(guò)串口對(duì)以太網(wǎng)模塊進(jìn)行數(shù)據(jù)傳輸。 ...
摘要:任務(wù)要求使用提供的未完成的工程進(jìn)行開發(fā)。設(shè)備上電后,板上的亮,滅。 基于hal庫(kù)下LoRa模塊獲取光照值 傳感器數(shù)據(jù)讀取與控制功能開發(fā) 基于hal庫(kù)下LoRa模...
摘要:對(duì)應(yīng)代碼為讀取口線狀態(tài)拉低總線發(fā)送信號(hào)根據(jù)上方時(shí)序圖可以知道在為高電平期間,發(fā)送數(shù)據(jù),發(fā)送次數(shù)據(jù),數(shù)據(jù)為被拉高,被拉低,數(shù)據(jù)為,被拉低。 I2C 協(xié)議 I2C 簡(jiǎn)要...
摘要:當(dāng)溫度感應(yīng)器感應(yīng)到設(shè)備主體內(nèi)部的溫度高于設(shè)定值時(shí),此時(shí)溫度設(shè)定器會(huì)控制風(fēng)機(jī)進(jìn)行啟動(dòng),對(duì)內(nèi)部進(jìn)行散熱處理,低于設(shè)定值時(shí)停止。設(shè)定的時(shí)間間隔溫度閾值,當(dāng)前溫度由顯示,表示工作狀態(tài)。為繼電器,,,供電。必須手動(dòng)清除,否則將持續(xù)引發(fā)中斷。 目錄 一、 設(shè)計(jì)要求 二、 總體設(shè)計(jì)和系統(tǒng)框圖 三、設(shè)計(jì)...
閱讀 1635·2021-09-30 09:47
閱讀 3650·2021-09-22 15:05
閱讀 2872·2021-08-30 09:44
閱讀 3641·2019-08-30 15:55
閱讀 1395·2019-08-30 13:08
閱讀 1353·2019-08-29 16:40
閱讀 572·2019-08-29 12:45
閱讀 1410·2019-08-29 11:25