日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 21ic電子網(wǎng)
[導(dǎo)讀]雙十一,看淘寶一直給我發(fā)優(yōu)惠券,就買了一片OLED,0.96寸的,最后花費(fèi)了4.54元……

出品?21ic論壇?gaoyang9992006

網(wǎng)站:21ic.com


雙十一,看淘寶一直給我發(fā)優(yōu)惠券,就買了一片OLED,0.96寸的,最后花費(fèi)了4.54元。

大神教你如何用ML51單片機(jī)點(diǎn)亮



驅(qū)動(dòng)芯片是SSD1315


大神教你如何用ML51單片機(jī)點(diǎn)亮

大神教你如何用ML51單片機(jī)點(diǎn)亮

第一,驅(qū)動(dòng)不一樣,老款是SSD1306,新款的是SSD1315,新款沒(méi)有并口功能,但是模塊是IIC,不影響,程序一樣,電路一樣。

第二,新款玻璃比老款的小了一圈,沒(méi)用的玻璃邊減去了,省點(diǎn)OLED玻璃,因?yàn)椴AФ际侨毡具M(jìn)口,玻璃省了,價(jià)格要便宜一點(diǎn)。

第三,引腳順序不一樣,老款依次是VCC、GND、SCL、SDA,新款則是GND、VCC、SCL、SDA。

所以我為了圖便宜,買了新款的。只有4個(gè)管腳。

大神教你如何用ML51單片機(jī)點(diǎn)亮

第一步,點(diǎn)亮屏幕


得到一塊新的屏幕,最重要的就是看能否點(diǎn)亮,點(diǎn)亮了才能使用做各種顯示應(yīng)用。而這個(gè)店家沒(méi)有提供驅(qū)動(dòng)代碼,懶得自己寫啊,這種通用的肯定有,I2C很容易GPIO模擬,然后搜其他店家,有不少提供驅(qū)動(dòng)代碼的,下載了移植到我的ML51開發(fā)板上試試。下面鏈接是廠家提供的驅(qū)動(dòng)程序。


鏈接: https://pan.baidu.com/s/1jqHcX9fIyKdUirFoZ3qSCA 提取碼: mj6e 復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦為方便下載,提供其中源碼與取模軟件的本地下載,資料說(shuō)明看不看無(wú)所謂。


考慮到是I2C接口,如果用GPIO模擬,需要先設(shè)置為開漏模式,然后找到初始化代碼,增加配置開漏模式的四行代碼。

//對(duì)選用的管腳設(shè)置為開漏模式 MFP_P20_GPIO; MFP_P21_GPIO; P20_OPENDRAIN_MODE; P21_OPENDRAIN_MODE;

這里也可以看出我用的是P20與P21.


然后修改頭文件中的管腳定義

sbit OLED_SCL=P2^0;//SCLsbit OLED_SDA=P2^1;//SDAsbit OLED_RES =P2^2;//RES

因?yàn)槭褂肐2C,按照手冊(cè)說(shuō)明可以忽略RES。但是為了少修改一點(diǎn)內(nèi)容,就先這么隨意指定個(gè)管腳,不鏈接就是了。


通過(guò)取模軟件,可以取出你想要的漢字,放入如下數(shù)組。

unsigned char code Hzk[][32]={{0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0xFC,0x40,0x40,0x40,0x40,0x60,0xE0,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"中",0*/{0x00,0x00,0xF8,0x08,0x08,0x28,0x28,0x28,0xE8,0x28,0x28,0x38,0x28,0xF8,0x08,0x00,0x00,0x00,0x7F,0x20,0x20,0x29,0x29,0x29,0x2F,0x29,0x2F,0x2D,0x28,0x7F,0x00,0x00},/*"國(guó)",1*/{0x00,0x00,0x00,0xF0,0x20,0x20,0x20,0xFC,0x20,0x20,0x20,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x05,0x05,0x05,0x7F,0x45,0x45,0x45,0x4F,0x40,0x60,0x78,0x60},/*"電",2*/{0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xD0,0x30,0x30,0x10,0x08,0x80,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x21,0x21,0x41,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"子",3*/{0x00,0x00,0xF8,0x10,0x50,0x90,0x90,0x70,0x70,0x90,0xD0,0x70,0x30,0xF8,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x06,0x01,0x1E,0x08,0x06,0x03,0x4E,0x40,0x7F,0x00,0x00},/*"網(wǎng)",4*/};

主程序代碼如下所示

//#include "ML51.h" #include "oled.h"#include "bmp.h"int main(void){ unsigned char t=' '; OLED_Init();//初始化OLED OLED_ColorTurn(0);//0正常顯示,1 反色顯示 OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示while(1) { // OLED_DrawBMP(0,0,128,64,BMP1);// delay_ms(5);// OLED_Clear();// OLED_ShowChinese(0,0,0,16); OLED_ShowChinese(18,0,0,16);//中 OLED_ShowChinese(36,0,1,16);//國(guó) OLED_ShowChinese(54,0,2,16);//電 OLED_ShowChinese(72,0,3,16);//子 OLED_ShowChinese(90,0,4,16);//網(wǎng)// OLED_ShowChinese(108,0,6,16); OLED_ShowString(8,2,"bbs.21ic.com",16); OLED_ShowString(20,4,"2020/11/17",16); OLED_ShowString(0,6,"ASCII:",16);  OLED_ShowString(63,6,"CODE:",16); OLED_ShowChar(48,6,t,16); t++;if(t>'~')t=' '; OLED_ShowNum(103,6,t,3,16);// delay_ms(5);// OLED_Clear(); } }

接下來(lái)連接OLED的I2C接口與開發(fā)板,并使用開發(fā)板供電。
大神教你如何用ML51單片機(jī)點(diǎn)亮


燒錄后,效果如下圖所示。然后就可以利用這個(gè)框架只需要修改簡(jiǎn)單的幾個(gè)地方,就能實(shí)現(xiàn)OLED點(diǎn)亮了,可以用于其他的各種項(xiàng)目了。


最后獻(xiàn)上我修改后的工程。

大神教你如何用ML51單片機(jī)點(diǎn)亮

后面我再試試改成用硬件I2C收發(fā)器控制。


以上完成第一步點(diǎn)亮屏幕。

第二步,應(yīng)用到自己的項(xiàng)目中


如果需要顯示溫濕度的話,就可以利用這些函數(shù)組合出你要顯示的內(nèi)容,例如顯示“溫度:36.5℃”。


則需要先生成所需的漢字與符號(hào)字模。


unsigned char code Hzk[][32]={ {0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0xFC,0x40,0x40,0x40,0x40,0x60,0xE0,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"中",0*/{0x00,0x00,0xF8,0x08,0x08,0x28,0x28,0x28,0xE8,0x28,0x28,0x38,0x28,0xF8,0x08,0x00,0x00,0x00,0x7F,0x20,0x20,0x29,0x29,0x29,0x2F,0x29,0x2F,0x2D,0x28,0x7F,0x00,0x00},/*"國(guó)",1*/{0x00,0x00,0x00,0xF0,0x20,0x20,0x20,0xFC,0x20,0x20,0x20,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x05,0x05,0x05,0x7F,0x45,0x45,0x45,0x4F,0x40,0x60,0x78,0x60},/*"電",2*/{0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xD0,0x30,0x30,0x10,0x08,0x80,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x21,0x21,0x41,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"子",3*/{0x00,0x00,0xF8,0x10,0x50,0x90,0x90,0x70,0x70,0x90,0xD0,0x70,0x30,0xF8,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x06,0x01,0x1E,0x08,0x06,0x03,0x4E,0x40,0x7F,0x00,0x00},/*"網(wǎng)",4*/{0x00,0x80,0x80,0xC8,0x30,0x00,0x80,0x40,0x30,0x18,0x10,0x60,0xC0,0x80,0x80,0x80,0x00,0x00,0x00,0x3F,0x12,0x09,0x04,0x7F,0x44,0x44,0x42,0x43,0x42,0x78,0x60,0x00},/*"論",5*/{0x40,0x40,0x40,0xF8,0x40,0x60,0xC0,0x90,0x90,0x90,0x90,0x90,0x90,0x98,0xD0,0x80,0x00,0x10,0x10,0x1F,0x08,0x08,0x60,0x30,0x2C,0x27,0x23,0x25,0x28,0x30,0x60,0x00},/*"壇",6*/{0x00,0x00,0x00,0x18,0xF8,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",7*/ {0x00,0x40,0xC0,0x18,0x90,0x60,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x00,0x00,0x00,0x04,0x7C,0x7E,0x01,0x00,0x21,0x3E,0x22,0x3E,0x22,0x3E,0x23,0x3E,0x22,0x20},/*"溫",8*/{0x00,0x00,0x00,0xF0,0x90,0x90,0x90,0xF4,0x98,0x90,0x90,0xF0,0x90,0xD8,0x90,0x00,0x00,0x40,0x30,0x0F,0x40,0x44,0x44,0x4F,0x35,0x25,0x35,0x6F,0x64,0x40,0x40,0x00},/*"度",9*/
{0x00,0x40,0xC0,0x98,0x60,0x00,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x00,0x04,0x04,0x7E,0x01,0x20,0x24,0x3D,0x20,0x3F,0x20,0x20,0x3F,0x24,0x27,0x33,0x20},/*"濕",10*/{0x00,0x00,0x00,0xF0,0x90,0x90,0x90,0xF4,0x98,0x90,0x90,0xF0,0x90,0xD8,0x90,0x00,0x00,0x40,0x30,0x0F,0x40,0x44,0x44,0x4F,0x35,0x25,0x35,0x6F,0x64,0x40,0x40,0x00},/*"度",11*/
{0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",12*/ {0x00,0x00,0x78,0x48,0x78,0xC0,0xE0,0x10,0x08,0x08,0x08,0x08,0x10,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x08,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x00},/*"℃",13*/
};


最后顯示的效果如下圖所示,如果將溫度的數(shù)字通過(guò)讀取傳感器繼續(xù)更新,就可以看到實(shí)時(shí)的溫度了。


然后合理的利OLED廠家提供的庫(kù)函數(shù)組合。


//#include "ML51.h" #include "oled.h"#include "bmp.h"
int main(void){ char i=0; unsigned char t=' '; OLED_Init();//初始化OLED OLED_ColorTurn(0);//0正常顯示,1 反色顯示 OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示 while(1) {

//第一行顯示8個(gè)字符16*8==128for(i=0;i<8;i++)OLED_ShowChinese(i*16,0,i,16);//第二行顯示 溫度:OLED_ShowChinese(0,2,8,16);//溫OLED_ShowChinese(16,2,9,16);//度OLED_ShowChinese(32,2,12,16);//://在第二行,第四個(gè)字符位置顯示36OLED_ShowNum(48,2,36,2,16);OLED_ShowChar(66,2,'.',16);OLED_ShowNum(74,2,5,1,16);OLED_ShowChinese(90,2,13,16);//℃//在第三行顯示字符串OLED_ShowString(8,4,"bbs.21ic.com",16);//delay_ms(5); } }


大神教你如何用ML51單片機(jī)點(diǎn)亮


在使用中遇到了一個(gè)問(wèn)題,我在main.c和oled.h都引用了頭文件#include "ML51.h"? ? ? ??


導(dǎo)致編譯后報(bào)錯(cuò)重復(fù)定義。然后我刪除了main.c中的,重新設(shè)置了引用頭文件路徑,完美解決。


另外如果你修改了目錄,或者重建了目錄結(jié)構(gòu),需要在這里也修改一下,不然工程無(wú)法找到對(duì)應(yīng)的exe。


大神教你如何用ML51單片機(jī)點(diǎn)亮


..\Library\Startup\exe\hex2bin.exe??.\output\@L.hex


運(yùn)行該命令可以生成所需的hex文件。


第三步,添加其他的外設(shè)驅(qū)動(dòng),實(shí)現(xiàn)顯示檢測(cè)數(shù)據(jù)顯示功能


這里我使用的是ADC檢測(cè)溫度,然后通過(guò)該屏幕顯示。



已經(jīng)添加了NTC傳感器。效果非常好



大神教你如何用ML51單片機(jī)點(diǎn)亮

還有就是使用的GPIO,一定要初始化為GPIO模式的開漏模式,不然無(wú)法驅(qū)動(dòng)屏幕。


//***********************************************************************************************************// File Function: 通過(guò)ML51的GPIO P20、P21驅(qū)動(dòng)I2C顯示屏,通過(guò)P24_ADC_CH1測(cè)量NTC傳感器阻抗,然后換算成溫度顯示在I2C屏幕上//***********************************************************************************************************//#include "ML51.h"#include "oled.h"#include "NTC.h"

/*P20,P21接I2C的OLED屏幕SCL與SDA接口,P24接NTC傳感器接口,讀取溫度,并顯示在OLED上*/
void main (void){ unsigned int ADCRESULT; float Rval; float temp; // 定義溫度整數(shù)部分與小數(shù)部分 unsigned int temp_H,temp_L; char i=0;
ADC_Open(ADC_SINGLE,1); //Enable P24_ADC_CH1 ADC_ConvertTime(3,7);
//對(duì)選用的管腳設(shè)置為開漏模式 MFP_P20_GPIO; MFP_P21_GPIO; P20_OPENDRAIN_MODE; P21_OPENDRAIN_MODE;
OLED_Init();//初始化OLED OLED_ColorTurn(0);//0正常顯示,1 反色顯示 OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示
while(1) { set_ADCCON0_ADCS; // Software trig adc start while((ADCCON0|CLR_BIT7)==CLR_BIT7); // wait ADCF = 1; ADCRESULT = (ADCRH<<4)+ADCRL; Rval=1000*((ADCRESULT*6.2)/(4095-ADCRESULT)); temp=Res_to_Tem(Rval); temp_H=((unsigned int)(temp*10.0))/10; temp_L=((unsigned int)(temp*10.0))%10;
for(i=0;i<8;i++) OLED_ShowChinese(i*16,0,i,16); //第二行顯示 溫度: OLED_ShowChinese(0,2,8,16);//溫 OLED_ShowChinese(16,2,9,16);//度 OLED_ShowChinese(32,2,12,16);//:
//在第二行,第四個(gè)字符位置顯示36 OLED_ShowNum(48,2,temp_H,2,16); OLED_ShowChar(64,2,'.',16); OLED_ShowNum(72,2,temp_L,1,16);
OLED_ShowChinese(82,2,13,16);//℃ //在第三行顯示字符串 OLED_ShowString(8,4,"bbs.21ic.com",16); //在第4行顯示字符串// OLED_ShowString(8,6,"gaoyang9992006",16); OLED_ShowString(0,6,"0123456789123456",16); Timer2_Delay(24000000,128,5,100000); }
}


另外對(duì)于字符是使用的8*16的字模,所以每行可以顯示16個(gè)字符,共計(jì)可以顯示4行。

大神教你如何用ML51單片機(jī)點(diǎn)亮

這樣既可以驅(qū)動(dòng)屏幕,又可以通過(guò)ADC讀取分壓,換算成溫度,顯示到屏幕的預(yù)定位置了。


注意事項(xiàng):需要注意的是,如果多文件使用到同一個(gè)頭文件,應(yīng)避免重復(fù)引用,以免報(bào)錯(cuò)重定向,而將其中放到一處引用即可。通過(guò)該實(shí)例,大家可以學(xué)習(xí)到驅(qū)動(dòng)程序的移植方法,同時(shí)也可以讓大家注意到,可移植能力的重要性,以避免面對(duì)不同MCu時(shí)候重復(fù)工作,本項(xiàng)目中使用到的廠家的驅(qū)動(dòng)程序,即充分考慮了可移植性,只需要做最簡(jiǎn)單的底層映射即可正常使用。

大神教你如何用ML51單片機(jī)點(diǎn)亮

本文系21ic論壇網(wǎng)友gaoyang9992006原創(chuàng)



大神教你如何用ML51單片機(jī)點(diǎn)亮

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

21ic電子網(wǎng)

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉