STM8 模擬I2C驅動0.91寸OLED屏
#define OLED_SCLK_Clr() GPIO_ResetBits(I2C_PORT, I2C_SDA_PIN )//SDA IIC介面的時鐘訊號
#define OLED_SCLK_Set() GPIO_SetBits(I2C_PORT, I2C_SDA_PIN )
#define OLED_SDIN_Clr() GPIO_ResetBits(I2C_PORT, I2C_SCL_PIN)//SCL IIC介面的資料訊號
#define OLED_SDIN_Set() GPIO_SetBits(I2C_PORT, I2C_SCL_PIN)
/**************************************************
* 函式名稱:Delay()
* 函式功能:簡單延時
* 輸入引數:nCount -計數時間
**************************************************/
void Delay(uint16_t nCount)
{
while (nCount != 0)
{
nCount--;
}
}
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
void IIC_Wait_Ack()
{
OLED_SCLK_Set() ;
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
// OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else
{
Write_IIC_Command(dat);
}
}
/**************************************************
* 函式名稱:OLED_WrDat()
* 函式功能:I2C向OLED傳送資料
**************************************************/
void OLED_WrDat(uint8_t IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WrDat32(uint8_t IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x20); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
/**************************************************
* 函式名稱:OLED_WrCmd()
* 函式功能:I2C向OLED傳送命令
**************************************************/
void OLED_WrCmd(uint8_t IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**************************************************
* 函式名稱:OLED_Set_Pos()
* 函式功能:OLED設定座標點
**************************************************/
void OLED_Set_Pos(uint8_t x, uint8_t y)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(((x&0xf0)>>4)|0x10);
OLED_WrCmd((x&0x0f)|0x01);
}
/**************************************************
* 函式名稱:OLED_Fill()
* 函式功能:OLED全屏寫入
**************************************************/
void OLED_Fill(uint8_t bmp_dat)
{
uint8_t y,x;
for(y=0;y<Y_WIDTH/4;y++)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
{OLED_WrDat(bmp_dat);}
}
}
/**************************************************
* 函式名稱:OLED_CLS()
* 函式功能:OLED清屏
**************************************************/
void OLED_CLS(void)
{
uint8_t y,x;
for(y=0;y<Y_WIDTH/4;y++)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
{OLED_WrDat(0x00);}
}
}
/**************************************************
* 函式名稱:OLED_Init()
* 函式功能:OLED初始化
**************************************************/
void OLED_Init(void)
{
Delay(500); //初始化之前的延時很重要!
OLED_WrCmd(0xAE);//--turn off oled panel 關閉顯示
OLED_WrCmd(0x00);//---set low column address
OLED_WrCmd(0x10);//---set high column address
OLED_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WrCmd(0x81);//--set contrast control register設定對比度
OLED_WrCmd(Brightness); // Set SEG Output Current Brightness 設定對比度
OLED_WrCmd(0xA0);//--Set SEG/Column Mapping 0xA0左右反置 0xA1正常(顯示前預設)
OLED_WrCmd(0xC0);//Set COM/Row Scan Direction 0xC0上下反置 0xC8正常
OLED_WrCmd(0xA6);//--set normal display
OLED_WrCmd(0xA8);//--set multiplex ratio(1 to 64)
OLED_WrCmd(0x3F);//--1/64 duty
OLED_WrCmd(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WrCmd(0x00);//-not offset
OLED_WrCmd(0xD5);//--set display clock divide ratio/oscillator frequency
OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WrCmd(0xD9);//--set pre-charge period
OLED_WrCmd(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WrCmd(0xDA);//--set com pins hardware configuration
OLED_WrCmd(0x12);
OLED_WrCmd(0xDB);//--set vcomh
OLED_WrCmd(0x40);//Set VCOM Deselect Level
OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WrCmd(0x02);//
OLED_WrCmd(0x8D);//--set Charge Pump enable/disable
OLED_WrCmd(0x14);//--set(0x10) disable
OLED_WrCmd(0xA4);// Disable Entire Display On 0xA4全顯 0xA5部分顯示
OLED_WrCmd(0xA6);// Disable Inverse Display On 0xA6正顯 0xA7反顯
OLED_WrCmd(0xAF);//--turn on oled panel 開啟顯示
OLED_Fill(0x00); //初始清屏
OLED_Set_Pos(0,0);
}
/**************************************************
* 函式名稱:OLED_Wakeup()
* 函式功能:將OLED從休眠中喚醒
**************************************************/
void OLED_Wakeup(void)
{
OLED_WrCmd(0X8D); //設定電荷泵
OLED_WrCmd(0X14); //開啟電荷泵
OLED_WrCmd(0XAF); //OLED喚醒
}
/**************************************************
* 函式名稱:OLED_Wakeup()
* 函式功能:OLED休眠,功耗不到10uA
**************************************************/
void OLED_Sleep(void)
{
OLED_WrCmd(0X8D); //設定電荷泵
OLED_WrCmd(0X10); //關閉電荷泵
OLED_WrCmd(0XAE); //OLED休眠
}
/**************************************************************************
* 函式名稱:OLED_ShowStr(uint8_t x, uint8_t y, uint8_t ch[], uint8_t TextSize)
* 函式功能:OLED顯示codetab.h中的ASCII字元,有6*8和8*16可選擇
* 輸入引數:x,y -- 起始點座標(x:0~127, y:0~7);
ch[] -- 要顯示的字串;
TextSize -- 字元大小(1:6*8 ; 2:8*16)
**************************************************************************/
void OLED_ShowStr(uint8_t x, uint8_t y, uint8_t ch[], uint8_t TextSize)
{
uint8_t 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_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WrDat(F6x8[c][i]);
x += 6;
j++;
}
}break;
case 2:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 120)
{
x = 0;
y++;
}
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WrDat(F8X16[c*16+i]);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WrDat(F8X16[c*16+i+8]);
x += 8;
j++;
}
}break;
}
}
/**************************************************************************
* 函式名稱:OLED_ShowCN(uint8_t x, uint8_t y, uint8_t N)
* 函式功能:顯示codetab.h中的漢字,16*16點陣
* 輸入引數:x,y -- 起始點座標(x:0~127, y:0~7);
tab16[] -- 漢字編碼表
N -- 漢字在codetab.h中的索引
**************************************************************************/
void OLED_ShowCN(uint8_t x, uint8_t y, uint8_t tab16[], uint8_t N)
{
uint8_t wm=0;
uint8_t adder=32*N;
OLED_Set_Pos(x, y);
for(wm = 0;wm < 16;wm++)
{
OLED_WrDat(tab16[adder]);
adder += 1;
}
OLED_Set_Pos(x,y+1);
for(wm = 0;wm < 16;wm++)
{
OLED_WrDat(tab16[adder]);
adder += 1;
}
}
/**************************************************************************
* 函式名稱:OLED_DrawBMP(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[])
* 函式功能:顯示BMP點陣圖
* 輸入引數:x0,y0 -- 起始點座標(x0:0~127, y0:0~7);
x1,y1 -- 起點對角線(結束點)的座標(x1:1~128,y1:1~8)
BMP[] -- 點陣圖編碼
**************************************************************************/
void OLED_ShowCN32(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[])
{
uint16_t j=0;
uint8_t x,y;
if(y1%8==0)
y = y1/8;
else
y = y1/8 + 1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WrDat(BMP[j++]);
}
}
}
/**************************************************************************
* 函式名稱:OLED_ShowCN(uint8_t x, uint8_t y, uint8_t N)
* 函式功能:顯示codetab.h中的漢字串,16*16點陣
* 輸入引數:x,y -- 起始點座標(x:0~127, y:0~7);
tab16[] -- 漢字編碼表
len -- 字串長度
**************************************************************************/
void OLED_ShowCNStr(uint8_t x, uint8_t y, uint8_t tab16[], uint8_t len)
{
uint8_t i;
OLED_Set_Pos(x, y);
for(i=0;i<len;i++)
{
OLED_ShowCN(22+i*16, y, (uint8_t *)tab16, i);//測試顯示中文
}
}
/**************************************************************************
* 函式名稱:OLED_DrawBMP(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[])
* 函式功能:顯示BMP點陣圖
* 輸入引數:x0,y0 -- 起始點座標(x0:0~127, y0:0~7);
x1,y1 -- 起點對角線(結束點)的座標(x1:1~128,y1:1~8)
BMP[] -- 點陣圖編碼
**************************************************************************/
void OLED_DrawBMP(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1,uint8_t BMP[])
{
uint16_t j=0;
uint8_t x,y;
if(y1%8==0)
y = y1/8;
else
y = y1/8 + 1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WrDat(BMP[j++]);
}
}
}
/**************************************************************************
* 函式名稱:OLED_DrawAll(uint8_t BMP[])
* 函式功能:全屏顯示BMP點陣圖,最大128*64畫素
* 輸入引數:BMP[] -- 點陣圖編碼
**************************************************************************/
void OLED_DrawAll(uint8_t BMP[])
{
uint16_t j=0;
uint8_t x,y;
for(y=0;y<Y_WIDTH/4;y++)
{
OLED_Set_Pos(0,y);
for(x=0;x<X_WIDTH;x++)
{
OLED_WrDat(BMP[j++]);
}
}
}
相關推薦
STM8 模擬I2C驅動0.91寸OLED屏
#define OLED_SCLK_Clr() GPIO_ResetBits(I2C_PORT, I2C_SDA_PIN )//SDA IIC介面的時鐘訊號 #define OLED_SCLK_Set() GPIO_SetBits(I2C_PORT, I2C_SDA_PIN
0.96寸OLED驅動(基於STM32f103)
最近入手了一塊0.96寸的oled,一直在用給的例程,想自己從底層寫一下驅動,瞭解oled的初始化流程和控制 注:本文只涉及oled的初始化,如果需要顯示GUI或者圖片,漢字,需要使用庫或者自己更進一步折騰。 =========================================
OLED驅動 0.96寸 SPI(STM32)
一、前期準備 微控制器:STM32F103ZET6 開發環境:MDK5.14 庫函式:標準庫V3.5 0.96 OLED模組:淘寶有售 二、實驗效果 三、驅動原理 此OLED模組採用SPI通訊,也可轉成IIC通訊,不過要焊接背面的
STM32硬體SPI驅動0.96寸的OLED
1.OLED相關 2.硬體SPI 3.驅動程式 驅動程式參照51微控制器進行移植,只不過模擬的SPI換成STM32硬體SPI,不用再寫時序部分的程式碼。對於STM32的硬體SPI,我們在驅動FLASH中已有介紹,這裡就不再做介紹。 O
STM32F103利用模擬I2C驅動ADS1115
ADS1115通過模擬I2C驅動:(部分程式碼借鑑了網路上的幾個,並且根據引腳進行了配置,都沒有執行成功,今天調了一天,終於在晚上調了出來) 注意:本部分程式碼需要只是ADS1115的部分程式(一些用到的陣列在此沒有寫),模擬II2C的各程式並未給出,大家根據需要進行裁剪,程式碼完全開源,希
0.96寸oled顯示屏白色12864解析度有哪些顏色白色藍色哪個亮度高壽命長介面測試程式碼結構簡單使用選型方便
OLED螢幕顯示的優點:1、厚度可以做到0.01毫米,並且重量也更輕,可以做成柔性,應用前景非常好;2、固態發光物資,沒有液體物質,因此抗震效能好;3、可視角度接近180°,即使在很大的視角下觀看,畫面仍然不失真,亮度不減;4、響應時間是微秒級,LCD是毫秒級,
STM32F1 模擬I2C驅動DAC(LTC2605)程式
由於在電路設計上將SCL、SDA線拉太長導致硬體I2C時常出問題,所以考慮用模擬I2C解決,這裡參考別人的程式碼然後自己應用到24位DAC(LTC2605)上,已移植成功。 (1).simulate_i2c.c #include "stm32f10x.h" #include "simulat
STM32 IO口模擬I2C+驅動MPU6050
之後運用MPU6050做了一個平衡小車,可以通過藍芽控制,下載連結: diy平衡小車 一、MPU6050 1. MPU6050介紹 MPU6050 是 InvenSense 公司推出的全球首款整合性 6 軸運動處理元件,相較於多元件 方案,免除
【STM32小案例 03 】實現DHT11,BH1750,GP2Y與0.96寸OLED的動態顯示
現在可以用DHT11採集溫溼度,BH1750採集光照,GP2Y採集PM2.5,再把資訊傳送至OLED螢幕和串列埠. 開發流程與思路: 1. 配置DHT11的TLL引腳通訊,因為DHT11的韌體庫都封
stm32驅動3.2寸觸控式螢幕(包括IO模擬,SPI硬體介面)
#ifndef TOUCH_H #define TOUCH_H #define SPI 0 //通過巨集定義來選擇SPI驅動,還是IO口模擬 #include "stm32f10x.h" #include "stm32f10x_rcc.h" #inc
stm8 軟體模擬IIC驅動PCF8563T,NOKIA5110液晶顯示
除錯stm8硬體IIC,弄了幾天,搞得人頭大,一直程式就是卡在 while((I2C_SR1&0x02))這裡,資料手冊和網上的各種帖子基本都看了,程式都試了,ARF位也設定了,還是除錯不通,最後沒辦法只能使用軟體模擬IIC了。 這次使用軟體模擬IIC驅動PCF8
liu_runda 給辣雞蒟蒻做的 NOIP模擬賽 1.0 第二題 任(duty) 題解
cfa 由於 幹什麽 truct 失去 格子 ace ide ++ 問題 B: 任(duty) 時間限制: 2 Sec 內存限制: 512 MB 題目描述 liu_runda退役之後就失去夢想開始鹹魚生活了… Bilibili夏日畫板活動中,所有人都可以在一塊畫板上進
模擬城市2.0
include orange cal tro 可見 eset str 遮擋 pst 題目背景 博弈正在機房頹一個叫做《模擬城市2.0》的遊戲。 2048年,經過不懈努力,博弈終於被組織委以重任,成為D市市委書記!他勤學好問,勵精圖治,很快把D市建設成富強民主
洛谷 模擬城市2.0
std thml badge bit spa 遮擋 mil oid under 一次洛谷月賽的T1,當時因為是信心賽,認為第一題應該不會太難,結果想了很久,直接額放棄正解選擇暴力。。。簡直就是巨坑的五維DP。。。mmd 題目背景 博弈正在機房頹一個叫做《模擬城市2.0》
Linux I2C驅動--用戶態驅動簡單示例
圖片 irq 代碼 eth pri 根據 debug disable sla 1. Linux內核支持I2C通用設備驅動(用戶態驅動:由應用層實現對硬件的控制可以稱之為用戶態驅動),實現文件位於drivers/i2c/i2c-dev.c,設備文件為/dev/i2c-0
micropython驅動sh1106點亮oled
研究 ifconfig nat 模塊 通過 路由器 code iso 就是 繼上一帖給esp32刷入micropython之後,忍不住給以esp12e也刷了micropython 這裏先說一下webrepl: 通過wifi可以和esp8266交互,以及便攜的傳輸文件
Linux內核調用I2C驅動_以MPU6050為例
匹配 獲取 inux error: sdn git alt 說明 時鐘 Linux內核調用I2C驅動_以MPU6050為例 0. 導語 最近一段時間都在惡補數據結構和C++,加上導師的事情比較多,Linux內核驅動的學習進程總是被阻礙、不過,十一假期終於沒有人打擾,有這個奢
linux裝置驅動(3)I2C驅動
i2c驅動程式的核心是建立i2c_driver結構體 /* This is the driver that will be inserted */ static struct i2c_driver at24cxx_driver = { .driver = { .name
linux設備驅動(3)I2C驅動
eric without this flags res 創建 sig pri 數據傳輸 i2c驅動程序的核心是創建i2c_driver結構體 /* This is the driver that will be inserted */ static struct i2c_