久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5857|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于STM32F103的硬件SPI驅(qū)動OLED配置

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:763998 發(fā)表于 2020-6-5 21:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#define        OLED_CS     PBout(7)  //片選CS
#define        OLED_RST    PAout(4)  //復(fù)位RST
#define        OLED_DC     PAout(15) //數(shù)據(jù)控制選擇DC

/*******************************************************
*函數(shù)名:SPI2_Init
*功  能:SPI2初始化
*參  數(shù):無
*返  回:無
*備  注:主模式 、MSB、CLK空閑時高電平,第二時鐘邊沿開始
PB13/14/15
********************************************************/
void SPI2_Init(void)
{       
        /* 配置時鐘 */
        RCC->APB2ENR |= (1<<3);//PB時鐘使能
        RCC->APB1ENR |= (1<<14);//SPI2時鐘使能
        /* 配置GPIO */
        GPIOB->CRH&=0X000FFFFF;
        GPIOB->CRH|=0XBBB00000;        //PB13/14/15復(fù)用             
        GPIOB->ODR|=0X7<<13;           //PB13/14/15上拉
        /* 配置SPI */
        SPI2->CR1|=1<<9;                 //軟件nss管理(軟件操控CS片選引腳)
        SPI2->CR1|=1<<8;
        SPI2->CR1|=3<<3;                 //100: fPCLK/32
        SPI2->CR1|=1<<2;                 //SPI主機
        SPI2->CR1|=1<<1;                 //空閑模式下SCK為1 CPOL=1
        SPI2->CR1|=1<<0;                 //數(shù)據(jù)采樣從第二個時間邊沿開始,CPHA=1
        SPI2->CR1|=1<<6;                 //SPI設(shè)備使能
}

/*******************************************************
*函數(shù)名:SPI2_WriteReadByte
*功  能:SPI2讀寫一個字節(jié)
*參  數(shù):寫入字節(jié)
*返  回:讀出字節(jié)
*備  注:
********************************************************/
u8 SPI2_WriteReadByte(u8 data)
{
        //寫功能       
        while((SPI2->SR&1<<1)==0);//等待發(fā)送區(qū)空               
        SPI2->DR=data;        //發(fā)送一個byte
        //讀功能
        while((SPI2->SR&1<<0)==0) ;//等待接收完一個byte                                              
        return SPI2->DR;  //返回收到的數(shù)據(jù)       
}


/*******************************************************
*函數(shù)名:OLED_Init
*功  能:OLED初始化
*參  數(shù):無
*返  回:無
*備  注:
OLED_SCL   PB13(復(fù)位被SWJ占用)
OLED_MOSI  PB15
OLED_CS    PB7
OLED_DC    PA15
OLED_RST   PA4
********************************************************/
void OLED_Init (void)
{
        SPI2_Init();//SPI2初始化
       
        /* 時鐘配置 */
        RCC->APB2ENR |= (1<<2);//PA時鐘使能
        RCC->APB2ENR |= (1<<3);//PB時鐘使能       
        RCC->APB2ENR |= (1<<0);//AFIO時鐘使能
        /* 配置GPIO */
        AFIO->MAPR &=~ (7<<24);
        AFIO->MAPR |=  (2<<24); //復(fù)位后PB13被JTAG占用,關(guān)閉JTAG,使能SW
       
        //片選引腳CS  PB7通用推挽輸出
        GPIOB->CRL &=~((u32)0xF<<28);
        GPIOB->CRL |= (0x3<<28);
       
        //數(shù)據(jù)控制選擇DC  PA15通用推挽輸出
        GPIOA->CRH &=~((u32)0xF<<28);
        GPIOA->CRH |= (0x3<<(15-8)*4);
       
        //復(fù)位引腳RES  PA4通用推挽輸出
        GPIOA->CRL &= ~(0xF<<4*4);
        GPIOA->CRL |=  (0x3<<4*4);
               
        OLED_RST=0;//硬復(fù)位OLED
        OLED_RST=1;  

        //OLED配置
        OLED_WriteCMD(0xAE);//--turn off oled panel
        OLED_WriteCMD(0x02);//---SET low column address
        OLED_WriteCMD(0x10);//---SET high column address
        OLED_WriteCMD(0x40);//--SET start line address  SET Mapping RAM Display Start Line (0x00~0x3F)
        OLED_WriteCMD(0x81);//--SET contrast control register
        OLED_WriteCMD(0xCF);// SET SEG Output Current Brightness
        OLED_WriteCMD(0xA1);//--SET SEG/Column Mapping     0xa0左右反置 0xa1正常
        OLED_WriteCMD(0xC8);//SET COM/Row Scan Direction   0xc0上下反置 0xc8正常
        OLED_WriteCMD(0xA6);//--SET normal display
        OLED_WriteCMD(0xA8);//--SET multiplex ratio(1 to 64)
        OLED_WriteCMD(0x3f);//--1/64 duty
        OLED_WriteCMD(0xD3);//-SET display offSET        Shift Mapping RAM Counter (0x00~0x3F)
        OLED_WriteCMD(0x00);//-not offSET
        OLED_WriteCMD(0xd5);//--SET display clock divide ratio/oscillator frequency
        OLED_WriteCMD(0x80);//--SET divide ratio, SET Clock as 100 Frames/Sec
        OLED_WriteCMD(0xD9);//--SET pre-charge period
        OLED_WriteCMD(0xF1);//SET Pre-Charge as 15 Clocks & Discharge as 1 Clock
        OLED_WriteCMD(0xDA);//--SET com pins hardware configuration
        OLED_WriteCMD(0x12);
        OLED_WriteCMD(0xDB);//--SET vcomh
        OLED_WriteCMD(0x40);//SET VCOM Deselect Level
        OLED_WriteCMD(0x20);//-SET Page Addressing Mode
        OLED_WriteCMD(0x02);//0x02 頁地址模式, 0x00水平地址模式,0x01垂直地址模式
        OLED_WriteCMD(0x8D);//--SET Charge Pump enable/disable
        OLED_WriteCMD(0x14);//--SET(0x10) disable
        OLED_WriteCMD(0xA4);// Disable Entire Display On (0xa4/0xa5)
        OLED_WriteCMD(0xA6);// Disable Inverse Display On (0xa6/a7)
        OLED_WriteCMD(0xAF);//--turn on oled panel
        OLED_Clear();
}
/*******************************************************
*函數(shù)名:OLED_WriteCMD
*功  能:往OLED寫入指令
*參  數(shù):byte:要寫入命令   
*返  回:無
*備  注:
********************************************************/
void OLED_WriteCMD(u8 byte)
{
        OLED_CS=0;//片選
        OLED_DC=0;//數(shù)據(jù)指令線拉低,表示往CR寫入指令
        SPI2_WriteReadByte(byte);//傳輸一個字節(jié)數(shù)據(jù)
        OLED_CS=1;//取消片選
}

/*******************************************************
*函數(shù)名:OLED_WriteDATA
*功  能:往OLED寫入指令
*參  數(shù):byte:要寫入的數(shù)據(jù)   
*返  回:無
*備  注:
********************************************************/
void OLED_WriteDATA(u8 byte)
{
        OLED_CS=0;//片選
        OLED_DC=1;//數(shù)據(jù)指令線拉高,表示往DR寫入數(shù)據(jù)
        SPI2_WriteReadByte(byte);//傳輸一個字節(jié)數(shù)據(jù)
        OLED_CS=1;//取消片選
}

/*******************************************************
*函數(shù)名:OLED_SetPos
*功  能:OLED屏幕內(nèi)容起點地址設(shè)置函數(shù)
*參  數(shù):x -- 列地址(0-127)  y--頁地址 (0- 7)
*返  回:無
*備  注:OLED屏幕大小 128*8*8
命令(0xB0-0xB7)設(shè)置目標(biāo)顯示位置大行起始地址
命令(0x00-0x0F)設(shè)置列起始地址低四位
命令(0x10-0x17)設(shè)置列起始地址高四位

指令和地址整合成一個字節(jié)
指令(0x00)+1111 =0000  1111  
指令(0x10)+0111 =0001  0111
0x5F
********************************************************/
void OLED_SetPos(u16 x, u16 y)
{
        OLED_WriteCMD(0xB0+y);//發(fā)送行地址
        OLED_WriteCMD(0x00+x&0xf);//發(fā)送列地址低四位 0x64 &0xf  x%16
        OLED_WriteCMD(0x10+((x&0xf0)>>4));//發(fā)送列地址高四位 0x64 &0xf0==》0x60>>4   ===>0x6  x/16
}

/*******************************************************
*函數(shù)名:OLED_Clear
*功  能:清屏函數(shù)
*參  數(shù):無
*返  回:無
*備  注:OLED屏幕大小 128*8*8
********************************************************/
void OLED_Clear(void)
{
        u8 i,j;
        for(j=0;j<8;j++)
        {
                OLED_SetPos(0,j);
                for(i=0;i<128;i++)
                {
                        OLED_WriteDATA(0);
                }
        }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:522590 發(fā)表于 2021-3-2 14:46 | 只看該作者
仿真時一直處于循環(huán)  等待接收區(qū)空  是怎么回事?
回復(fù)

使用道具 舉報

板凳
ID:293612 發(fā)表于 2021-3-4 13:37 | 只看該作者
Gestrand 發(fā)表于 2021-3-2 14:46
仿真時一直處于循環(huán)  等待接收區(qū)空  是怎么回事?

我之前也出現(xiàn)過這個問題,我當(dāng)時是片選腳的位帶操作寫錯了導(dǎo)致的,你可以看看你是不是這種情況
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频网站在线看 | 天天干天天爱天天爽 | 米奇7777狠狠狠狠视频 | 婷婷免费在线 | 亚州精品天堂中文字幕 | 91视频亚洲 | 日日干干 | xx视频在线 | 欧美性另类| 欧美午夜精品理论片a级按摩 | 久久成| 日本亚洲精品 | 国产高潮av| 亚洲一区二区在线视频 | 深夜福利影院 | 国产在线永久免费 | 黄色片大全在线观看 | 成人亚洲性情网站www在线观看 | 日韩和的一区二区 | 欧美一区二区三区久久精品视 | 欧美一区二区三区在线免费观看 | 精品国产乱码久久久久久影片 | 亚洲精品一区二区网址 | 亚洲午夜精品一区二区三区他趣 | 日韩一区二区三区四区五区六区 | 亚洲三级在线观看 | 亚洲国产在 | 91色在线 | 97人人澡人人爽91综合色 | 亚洲国产精品99久久久久久久久 | 一区二区三区四区不卡视频 | 一级a性色生活片久久毛片波多野 | 天天干国产 | av性色全交蜜桃成熟时 | 一区二区三区欧美 | 日本三级线观看 视频 | 欧美色性 | 国户精品久久久久久久久久久不卡 | 国产视频一区二区 | 久久久久国产精品一区 | 国产精品久久av |