亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

OLED 顯示模塊程序詳解

Wildcard / 1725人閱讀

摘要:顯示模塊如果還沒有看過協(xié)議的,請移步先看下面這篇文章協(xié)議好的,現(xiàn)在我們進入正題向寄存器地址寫入一個的數(shù)據(jù)開啟發(fā)送設(shè)備地址讀寫控制,采用宏定義方式一般地址為,不行就嘗試下傳入?yún)?shù),為寄存器參數(shù),根據(jù)手冊,寫入命令寄

OLED 顯示模塊

如果還沒有看過I2C 協(xié)議的,請移步先看下面這篇文章

?I2C協(xié)議

好的,現(xiàn)在我們進入正題
?

1. 向 OLED 寄存器地址寫入一個 byte 的數(shù)據(jù)

  • 開啟 I2C
  • 發(fā)送 OLED 設(shè)備地址 + 讀寫控制 (w - 0, r - 1)
    • #define OLED_I2C_WR 0 采用宏定義方式
      #define OLED_I2C_RD 1
  • 一般 OLED 地址為 0x78,不行就嘗試下 0x7A
  • 傳入?yún)?shù) addr,為寄存器參數(shù),根據(jù) OLED 手冊,0x00 - 寫入命令寄存器,0x40 - 寫入數(shù)據(jù)寄存器
  • 每一次發(fā)送數(shù)據(jù),I2C 都需要作出正確的應(yīng)答,0 為正確應(yīng)答,查看該函數(shù)具體實現(xiàn)請移步到I2C協(xié)議
  • 如果 OLED 設(shè)備未正確應(yīng)答,使用 goto 無條件轉(zhuǎn)移語句,將 I2C 協(xié)議停止掉。謹慎使用 goto 語句
void I2C_WriteByte(uint8_t addr,uint8_t data){		i2c_Start();			//開啟 協(xié)議	//0x78 轉(zhuǎn)化為 2進制 0111 1110 再或上一個 0 | 1 的值,表示地址最后一位為讀寫控制指令	i2c_SendByte(OLED_ADDRESS|OLED_I2C_WR);		//發(fā)送地址 和 讀寫控制指令		if (i2c_WaitAck() != 0)	{		goto cmd_fail;		}			i2c_SendByte(addr);				//發(fā)送對應(yīng)寄存器,判斷為0x00發(fā)送命令,還是0x40發(fā)送數(shù)據(jù)	if (i2c_WaitAck() != 0)	{		goto cmd_fail;		}		i2c_SendByte(data);				//對應(yīng)寄存器為 0x00,該data為命令,對應(yīng)寄存器為0x40,該data為數(shù)據(jù)	if (i2c_WaitAck() != 0)	{		goto cmd_fail;		}		i2c_Stop();						//最后 停止協(xié)議cmd_fail: 	i2c_Stop();}

?

2. 寫入命令函數(shù)和寫入數(shù)據(jù)函數(shù)

  • 由于我們基本上只使用 寫入命令 ,和寫入數(shù)據(jù)兩個寄存器地址,所以重新封裝下函數(shù),使其簡單方便
void WriteCmd(unsigned char I2C_Command){	I2C_WriteByte(0x00, I2C_Command);}void WriteDat(unsigned char I2C_Data){	I2C_WriteByte(0x40, I2C_Data);}

?

3. OLED 初始化

這邊代碼直接使用網(wǎng)上的,如果非要自己編寫,請查看 OLED 模塊使用手冊,某寶一般都會提供,可能為 全英文文檔,沒錯,博主看不懂!

void OLED_Init(void){	delay_ms(1000);		// 1s,一定要延時,防止錯誤		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}

?

4. 設(shè)置 OLED 光標起點

  • 參數(shù)解釋:
    • x ,坐標軸中的 水平 坐標,大小為 0 - 127
    • y,坐標軸中的 垂直 坐標,大小為 0 - 7
void OLED_SetPos(unsigned char x, unsigned char y) { 	WriteCmd(0xb0+y);				//設(shè)置頁坐標					WriteCmd(((x&0xf0)>>4)|0x10);   //設(shè)置 列 高四位地址	WriteCmd((x&0x0f)|0x01);		//設(shè)置 列 低四位地址		}

?

5. 全屏填充函數(shù)

函數(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++)	//每頁水平坐標為 0 - 127			{				WriteDat(fill_Data); //寫入數(shù)據(jù) 0x00 為全滅,0xff為全亮			}	}}

?

6. 顯示英文,數(shù)字字符

  1. 采用 字符庫軟件生成 16 進制數(shù),放入數(shù)組中

  2. 判斷是采用 6*8 數(shù)組還是 8*16 數(shù)組

  3. 空格的 ascll 碼為 32 ,需要減去,這樣才能得到正確的數(shù)字,字母,符號等

  4. 如果為 6*8 的 ascll 碼,每個 x 就為 6,所以判斷一下 如果同一行后面不能準確顯示,就換行,再顯示該字符

  5. 設(shè)置字符起點,寫入對應(yīng)數(shù)據(jù),數(shù)據(jù)為字符軟件生成的字符。

  6. case2 表示 8*16 的字符,一行 16 位 16進制數(shù)代表某一個英文字符,8*16 代表列數(shù)為 8 個,也就是每一行應(yīng)該輸出 8 個 16進制數(shù),總共輸出兩行,先使用 ascall 碼找到英文字符對應(yīng)的所在位置,再設(shè)置 起點坐標,由于一次繪制 8 個 16進制數(shù),所以 x+=8; j++ 表示開始下一個字符

?
就是類似于

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;	}}

?

7. 顯示中文字符

  • 與上面 字符串 case 2 中顯示相同

  • 這邊的字符串數(shù)組為 12*12 ,一個漢字為 1個 2*12點陣,所以 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;	}}

最后

?第一次嘗試編寫博客,若是有什么建議,歡迎批評指出。

?后續(xù)會逐步分塊更新,并會在最后一篇文章上傳源代碼。

?若是該文章對你有作用或是覺得文章寫得還行,幫忙點點贊,三連!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/121621.html

相關(guān)文章

  • 【RISC-V MCU 創(chuàng)新應(yīng)用】一種網(wǎng)絡(luò)型單相智能電表

    摘要:負責對電能檢測模塊下發(fā)收集指令,以及對電能檢測模塊響應(yīng)的數(shù)據(jù)進行處理,一方面對接收的單相數(shù)據(jù)進行轉(zhuǎn)換后驅(qū)動屏幕對相關(guān)數(shù)據(jù)進行顯示,另一方面對單相數(shù)據(jù)進行重新打包并通過串口對以太網(wǎng)模塊進行數(shù)據(jù)傳輸。 ...

    rockswang 評論0 收藏0
  • LoRa模塊獲取光照值

    摘要:任務(wù)要求使用提供的未完成的工程進行開發(fā)。設(shè)備上電后,板上的亮,滅。 基于hal庫下LoRa模塊獲取光照值 傳感器數(shù)據(jù)讀取與控制功能開發(fā) 基于hal庫下LoRa模...

    rozbo 評論0 收藏0
  • I2C 協(xié)議 代碼詳解

    摘要:對應(yīng)代碼為讀取口線狀態(tài)拉低總線發(fā)送信號根據(jù)上方時序圖可以知道在為高電平期間,發(fā)送數(shù)據(jù),發(fā)送次數(shù)據(jù),數(shù)據(jù)為被拉高,被拉低,數(shù)據(jù)為,被拉低。 I2C 協(xié)議 I2C 簡要...

    BakerJ 評論0 收藏0
  • MSP430單片機,OLED,獨立按鍵,DS18B20溫度傳感器,繼電器,抽風機,LED燈構(gòu)成的電子

    摘要:當溫度感應(yīng)器感應(yīng)到設(shè)備主體內(nèi)部的溫度高于設(shè)定值時,此時溫度設(shè)定器會控制風機進行啟動,對內(nèi)部進行散熱處理,低于設(shè)定值時停止。設(shè)定的時間間隔溫度閾值,當前溫度由顯示,表示工作狀態(tài)。為繼電器,,,供電。必須手動清除,否則將持續(xù)引發(fā)中斷。 目錄 一、 設(shè)計要求 二、 總體設(shè)計和系統(tǒng)框圖 三、設(shè)計...

    BingqiChen 評論0 收藏0

發(fā)表評論

0條評論

Wildcard

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<