娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月14日(星期二)

正在發生

2019年01月14日 | 51 軟件模擬SPI驅動OLED

發布者:MysticalSoul 來源: eefocus關鍵字:軟件模擬SPI  驅動OLED 手機看文章 掃描二維碼
隨時隨地手機看文章

1.OLED簡介


OLED,即有機發光二極管(Organic Light-Emitting Diode),又稱為有機電激光顯示(Organic Electroluminesence Display, OELD)。OLED由于同時具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優異之特性,被認為是下一代的平面顯示器新興應用技術。


OLED顯示技術具有自發光的特性,采用非常薄的有機材料涂層和玻璃基板,當有電流通過時,這些有機材料就會發光,而且OLED顯示屏幕可視角度大,并且能夠節省電能。


2.OLED模塊簡介


本文采用中景園的 0.96 寸的OLED顯示模塊。原理圖如下:


這里寫圖片描述


2.1模塊特點:


1)0.96 寸 OLED 有黃藍,白,藍三種顏色可選;其中黃藍是屏上 1/4 部分為黃光,下 3/4 為藍;而且是固定區域顯示固定顏色,顏色和顯示區域均不能修改;白光則為純白,也就是黑底白字;藍色則為純藍,也就是黑底藍字。


2)分辨率為 128*64;


3)多種接口方式;OLED 裸屏總共種接口包括:6800、8080 兩種并行接口方式、3 線或 4 線的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根線就可以控制 OLED 了),這五種接口是通過屏上的 BS0~BS2 來配置的。


2.2模塊接口:


接口 功能

GND 電源地

VCC 電源正(3~5.5V)

D0 OLED 的 D0 腳,在 SPI 和 IIC 通信中為時鐘管腳

D1 OLED 的 D1 腳,在 SPI 和 IIC 通信中為數據管腳

RES OLED 的 RES#腳,用來復位(低電平復位)

DC OLED 的 D/C#E 腳,數據和命令控制管腳

CS OLED 的 CS#腳,片選管腳


2.3 OLED 驅動 IC:


本屏所用的驅動 IC 為 SSD1306;其具有內部升壓功能;所以在設計的時候不需要再專一設計升壓電路;屏也可以選用外部升壓,。SSD1306 的每頁包含了128 個字節,總共 8 頁,這樣剛好是128*64 的點陣大小。


這里寫圖片描述


2.4 OLED 驅動方式:


此模塊支持四線 SPI、三線 SPI、IIC 接口和 6800、8080 并口方式,模塊的通信接口是通過 BS0,BS1,BS2 三個管腳來配置。


這里寫圖片描述

2.5 SSD1306的命令


這里寫圖片描述


0X81:設置對比度。包含兩個字節,第一個0X81為命令,隨后發送的一個字節為要設置的對比度的值。這個值設置得越大屏幕就越亮。


0XAE,0XAF: 0XAE為關閉顯示命令;0XAF為開啟顯示命令。


0X8D:包含2個字節,第一個為命令字,第二個為設置值,第二個字節的BIT2表示電荷泵的開關狀態,該位為1,則開啟電荷泵,為0則關閉。在模塊初始化的時候,這個必須要開啟,否則是看不到屏幕顯示的。 


命令0XB0~B7:用于設置頁地址,其低三位的值對應著GRAM的頁地址。


0X00~0X0F:用于設置顯示時的起始列地址低四位。 

0X10~0X1F:用于設置顯示時的起始列地址高四位。


3.實現程序


3.1 模擬SPI


時序:


這里寫圖片描述


對應時序圖實現程序:


程序:


sbit OLED_SCL=P3^0;//時鐘 D0(SCLK)

sbit OLED_SDIN=P3^1;//D1(MOSI) 數據

sbit OLED_RST =P3^2;//復位

sbit OLED_DC =P3^3;//數據/命令控制

sbit OLED_CS=P3^4; //片選


//Function:向OLED設備寫入一個字節

//Input:dat:寫入的數據/命令;cmd:寫入的是數據或命令判斷

//cmd=0:寫入命令;cmd=1:寫入數據(DC為高:數據;DC為低:命令)

//Output:無

//Return:無

//Others:無

void Spi_Write_Byte(uchar dat,uchar cmd)

{

    uchar len;


    if(cmd)

        OLED_DC = 1;

    else

        OLED_DC = 0;

    OLED_CS = 0;

    for(len=0;len<8;len++)

    {

        OLED_SCL = 0;//低電平開始采樣數據

        if(dat&0x80)

            OLED_SDIN = 1;

        else

            OLED_SDIN = 0;

        OLED_SCL = 1;

        dat = dat<<1;

    }

    OLED_CS = 1;

    OLED_DC = 1;

}



顯示部分實現:


#include "oled_display.h"

#include "oled_font.h"



//Function:設置顯示坐標

//Input:x:橫坐標;y:縱坐標

//Output:無

//Return:無

//Others:無

void OLED_Set_Pos(uchar x,uchar y)

{

    Spi_Write_Byte(0xb0+y,OLED_CMD);//列偏移

    Spi_Write_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//行高四位地址

    Spi_Write_Byte((x&0x0f)|0X01,OLED_CMD);//行低四位地址

}


//Function:開啟OLED顯示

//Input:無

//Output:無

//Return:無

//Others:無

void OLED_Display_On(void)

{

    Spi_Write_Byte(0X8D,OLED_CMD);//設置DCDC

    Spi_Write_Byte(0X14,OLED_CMD);//打開DCDC

    Spi_Write_Byte(0XAF,OLED_CMD);//打開OLED

}


//Function:關閉OLED顯示

//Input:無

//Output:無

//Return:無

//Others:無

void OLED_Display_Off(void)

{

    Spi_Write_Byte(0X8D,OLED_CMD);//設置DCDC

    Spi_Write_Byte(0X10,OLED_CMD);//關閉DCDC

    Spi_Write_Byte(0XAE,OLED_CMD);//關閉OLED

}


//Function:清屏

//Input:無

//Output:無

//Return:無

//Others:無

void OLED_Display_Clear(void)

{

    uchar page,len;


    for(page=0;page<8;page++)

    {

        Spi_Write_Byte(0xB0+page,OLED_CMD);//設置頁地址(0--7)

        Spi_Write_Byte(0X00,OLED_CMD);//設置顯示位置—列低地址

        Spi_Write_Byte(0X10,OLED_CMD); //設置顯示位置—列高地址


        for(len=0;len<128;len++)

            Spi_Write_Byte(0,OLED_DATA);//寫入0;屏熄滅

    }

}

//Function:在指定位置顯示一個字符,包括部分字符

    //x:0~127;y:0~63;size:選擇字體 16/12 

//Input:x:橫坐標;y:縱坐標;str:顯示的字符

//Output:無

//Return:無

//Others:無               

void OLED_Display_Onechar(uchar x,uchar y,uchar str)

{

    uchar i=0,ret=0;

    //ret = str -32;

    ret = str - ' ';//得到偏移后的值,對ASCLL碼進行一個減法.即在二維數組里找它的位置  

    if(x>Max_Column-1)

    {

        x = 0;

        y = y + 2;//針對16號的字符

    }

    if(SIZE == 16 )

    {

        OLED_Set_Pos(x,y);

        //16的字體分成兩部分寫入

        for(i=0;i<8;i++)

            Spi_Write_Byte(F8X16[ret*16+i],OLED_DATA);

        OLED_Set_Pos(x,y+1);

        for(i=0;i<8;i++)

            Spi_Write_Byte(F8X16[ret*16+i+8],OLED_DATA);

    }

    else{

        OLED_Set_Pos(x,y+1);

        for(i=0;i<6;i++)

            Spi_Write_Byte(F6x8[ret][i],OLED_DATA);

    }

}


//Function:顯示字符串

//Input:x:橫坐標;y:縱坐標;str:顯示的字符串

//Output:無

//Return:無

//Others:無

void OLED_Display_String(uchar x,uchar y,uchar *str)

{

    uchar i=0;


    while(str[i]!='\0')

    {

        OLED_Display_Onechar(x,y,str[i]);

        x += 8;

        if(x>120)

        {

            x = 0;

            y += 2;

        }

        i++;

    }

}


//Function:顯示中文

//Input:x:橫坐標;y:縱坐標;no:顯示的字的序號

//Output:無

//Return:無

//Others:無

void OLED_Display_Chinese(uchar x,uchar y,uchar no)

{

    uchar ch,addr=0;


    OLED_Set_Pos(x,y);

    for(ch=0;ch<16;ch++)//數組行列尋址

    {

        Spi_Write_Byte(TEST[2*no][ch],OLED_DATA);

        addr += 1;

    }

    OLED_Set_Pos(x,y+1);

    for(ch=0;ch<16;ch++)

    {

        Spi_Write_Byte(TEST[2*no+1][ch],OLED_DATA);

        addr += 1;

    }


}


//Function:顯示圖片

//Input:x0,x1:橫坐標;y0,y1:縱坐標;BMP:顯示的圖片

//注意:y1<8,頁尋址模式

//Output:無

//Return:無

//Others:無

void OLED_Display_Picture(uchar x0,uchar y0,uchar x1,uchar y1,uchar BMP[])

{

    uchar x,y;

    uint i=0;


    if(y1%8==0)

        y = y1 / 8;

    else

        y = y1 /8 + 1;

    for(y=y0;y

    {

        OLED_Set_Pos(x0,y);

        for(x=x0;x

        {

            Spi_Write_Byte(BMP[i++],OLED_DATA);

        }

    }

}


//計算m的n次方

uint OLED_Pow(uchar m,uchar n)

{

    uint ret = 1;

    while(n--)

        ret *= m;

    return ret;

}


//Function:顯示數字

//Input:x:橫坐標;1:縱坐標;num:顯示的數字:len:數字長度;size_num:數字字體

//Output:無

//Return:無

//Others:無

void OLED_Display_Num(uchar x,uchar y,uint num,uchar len,uchar size_num)

{

    uchar t,temp;

    uchar enshow = 0;


    for(t=0;t

    {

        temp = (num/OLED_Pow(10,len-t-1))%10;//把顯示的數字一位一位取出來

        if(enshow==0&&t<(len-1))

        {

            if(temp==0)

            {

                OLED_Display_Onechar(x+(size_num/2)*t,y,' ');

                continue;

            }

            else

                enshow = 1;

        }

        OLED_Display_Onechar(x+(size_num/2)*t,y,temp+'0');

    }

}


//初始化SSD1306

void OLED_Init(void)

{

    OLED_RST = 1;

    delay_ms(200);

    OLED_RST = 0;

    delay_ms(200);

    OLED_RST = 1; 


    Spi_Write_Byte(0xAE,OLED_CMD);//關閉OLED

    Spi_Write_Byte(0x00,OLED_CMD);//設置列低位地址

    Spi_Write_Byte(0x10,OLED_CMD);//設置列高位地址

    Spi_Write_Byte(0x40,OLED_CMD);//設置起始行地址及映射RAM顯示起始行 (0x00~0x3F)

    Spi_Write_Byte(0x81,OLED_CMD);//對比度設置

    Spi_Write_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness

    Spi_Write_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常

    Spi_Write_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常

    Spi_Write_Byte(0xA6,OLED_CMD);//設置顯示方式;bit0:1,反相顯示;0,正常顯示

    Spi_Write_Byte(0xA8,OLED_CMD);//設置驅動路數(1 to 64)

    Spi_Write_Byte(0x3f,OLED_CMD);//--1/64 duty

    Spi_Write_Byte(0xD3,OLED_CMD);//-設置顯示偏移(0x00~0x3F)

    Spi_Write_Byte(0x00,OLED_CMD);//-not offset

    Spi_Write_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency

    Spi_Write_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec

    Spi_Write_Byte(0xD9,OLED_CMD);//--set pre-charge period

    Spi_Write_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

    Spi_Write_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration

    Spi_Write_Byte(0x12,OLED_CMD);

    Spi_Write_Byte(0xDB,OLED_CMD);//--set vcomh

    Spi_Write_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level

    Spi_Write_Byte(0x20,OLED_CMD);//設置頁地址模式(0x00/0x01/0x02)

    Spi_Write_Byte(0x02,OLED_CMD);//

    Spi_Write_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable

    Spi_Write_Byte(0x14,OLED_CMD);//--set(0x10) disable

    Spi_Write_Byte(0xA4,OLED_CMD);//禁用顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏)(0xa4/0xa5)

    Spi_Write_Byte(0xA6,OLED_CMD);// 不使用反向顯示 (0xa6/a7) 

    Spi_Write_Byte(0xAF,OLED_CMD);//打開顯示


    Spi_Write_Byte(0xAF,OLED_CMD); /*display ON*/

    OLED_Display_Clear();

    OLED_Set_Pos(0,0);  

}  


斷斷續續總算寫完了,歡迎大家積極討論,互相學習。


關鍵字:軟件模擬SPI  驅動OLED 引用地址:51 軟件模擬SPI驅動OLED

上一篇:C51 GPIO口模擬IIC讀寫24CXX
下一篇:51通過IO口模擬IIC實現AT24C02的讀寫

推薦閱讀

作為國內最早大規模推廣新能源車的車企,比亞迪新能源車的產銷規模不但在國內持續領跑,而且已經連續三年排名全球銷量第一。截止2017年底,比亞迪在全球新能源汽車市場的份額占比已經達到13%。?在剛剛過去的2017年,比亞迪在中國的新能源汽車市場中的動作很大,拆分電池動力市場、成立新合資公司、云軌建成通車、獲得大巴訂單、請來了奧迪前設計總監,設...
對于雷軍來說,2019年對小米手機依然充滿變數,因為大家換機的需求在降低,5G網絡還沒有真正成為刺激需求的主要動力。  近日,雷軍接受外媒采訪時候表示,公司現在正專注于向高端市場推進,并同時向歐洲擴張,停止進軍美國市場。他并未概述避開美國市場的原因。美國是全球最大經濟體,曾經被小米視為前景廣闊的市場,但是對中國公司越來越不友...
據Gsmarena報道,13年前的今天,蘋果公司發布了第一代iPhone手機。分析師預計,2020財年(截至今年9月底)結束后,iPhone推出后13年來累計銷量將達到近20億部。  據彭博社所調查的8位分析師的平均預期,8位不同的市場分析師相信,蘋果公司會在2020年完成第20億部蘋果iPhone手機銷售。分析師表示蘋果有望在今年銷售1.95億部蘋果iPhone手機,遠遠超...
根據Gartner的初步結果,繼2019年下降12%之后,2020年全球半導體收入反彈至4498億美元,較2019年增長7.3%。Gartner研究副總裁Andrew Norwood表示:“2020年初,人們預計新冠疫情將對所有終端設備市場產生負面影響,但實際影響很小。汽車,工業和消費市場的某些領域受到企業和消費者支出減少的打擊。但是,居家的日子極大地增加了家庭和在線學習時間,從...

史海拾趣

問答坊 | AI 解惑

中國3G前景撲朔迷離

中國3G前景撲朔迷離 2006-7-14     中國的3G進程總是撲朔迷離,今年牌照可能再次難產的消息再一次讓中外廠商頗為擔心和憂慮。日前在杭州舉行的TD-SCDMA終端及應用研討會上,國內外致力于TD-SCDMA發展的專家對中國3G當前面臨的困難 ...…

查看全部問答∨

Atmel推出面向雙前刮水器系統的驅動IC,無需機械連接

Atmel Corporation日前宣布推出高度整合的ATA6026汽車驅動IC,這是即將推出的汽車驅動器家族的首個成員。ATA6026的設計基于Atmel高壓BCDMOS制程,采用了優化的通信接口,適合大容量直流電汽車應用產品,如擋風玻璃刮水器系統、門鎖或座位調節 ...…

查看全部問答∨

Altium Designer 6.8注冊文件

內含6.8與6.81注冊文件 …

查看全部問答∨

北京放狠話——大龍芯被迫常駐北京

replyreload += \',\' + 279205;Timson,如果您要查看本帖隱藏內容請回復…

查看全部問答∨

如何成為一名出色的技術及研發工程師

如此迥異的生活環境、社會環境所孕育的理論如果運用在人才的選、用上竟如此驚人的相似。還記得小時候,我們周圍有使用左手習慣的人吧,那時他們被稱為左撇子(其實這是一個帶有社會偏見的稱呼,因為社會上所有的設施、書寫及閱讀習慣都是為右手習慣 ...…

查看全部問答∨

LED照明前進困難重重???

LED照明,被譽為“第三次照明革命”,其節能環保等優點受到政府的高度重視、行業的追捧。但是在一片叫好聲中,LED仍然面臨核心技術缺失、行業標準缺失、價格居高不下、大面積推廣困難等種種問題。   技術上仍不完善   “還不是很成熟。”6月9 ...…

查看全部問答∨

急尋代筆,高報酬 vs2005里C++或C#,智能設備下,選pocket pc 2003 里寫系統

我有個畢業設計,想找人代寫 希望會的聯系我 QQ460580652 15929443577 要求是這樣的。要求是在 2009年6月10號前寫好 只要能按照要求運行就可以了。會的速度聯系我 藥品庫存管理信息系統         現本課題要求 ...…

查看全部問答∨

有人做過fpga上總線的IP核開發嗎?

要求簡單描述如下 1.自己編寫代碼,實現PLB總線(IBM的CoreConnect總線的一部分)的功能 2.再添加一個master,一個slave,實現功能 一直沒有頭緒,到這里來看看哈,望各位高手不吝賜教啊 問題如下: 1.有沒有什么IP核的集成,設計規范? 2.有 ...…

查看全部問答∨

關于Application Verifier

由于對軟件測試的需要,在網上google到MS出的Application Verifier,可是我只找到的PC版的。 哪位能提供Application Verifier for Windows CE版,不想要for mobile版的。 無限期待中......…

查看全部問答∨

3.2寸TFT驅動成功,效果還不錯。

轉接板PCB早就弄好了,現在終于有時間驅動了一下,效果還不錯。為《MP3+數碼相框+收音機+電子書》和《智能家居系統》的顯示提供方便了。                   [ 本帖最后由 zhaojun_xf ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 连云港市| 多伦县| 昌黎县| 海淀区| 贺州市| 武陟县| 喜德县| 宿州市| 鄂州市| 伽师县| 深泽县| 安平县| 云阳县| 阿瓦提县| 泗水县| 易门县| 桃园县| 会昌县| 准格尔旗| 吉木萨尔县| 盐边县| 仲巴县| 宜城市| 灵寿县| 修武县| 万山特区| 开阳县| 临江市| 苗栗市| 汉川市| 文水县| 和龙市| 定南县| 澎湖县| 虹口区| 岚皋县| 青冈县| 嘉禾县| 襄垣县| 云阳县| 岳池县|