#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--;
WWDG_SetCounter(0x7F); //喂狗
}
}
void Delay_(u32 nTime)
{
volatile unsigned int i;
WWDG_SetCounter(0x7F); //喂狗
while(nTime--)
{
i=1000;
while(i--);
WWDG_SetCounter(0x7F); //喂狗
}
}
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;
WWDG_SetCounter(0x7F); //喂狗
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();
WWDG_SetCounter(0x7F); //喂狗
}
/**************************************************
* 函數名稱: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
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x
}
}
/**************************************************
* 函數名稱:OLED_CLS()
* 函數功能:OLED清屏
**************************************************/
void OLED_CLS(void)
{
uint8_t y,x;
for(y=0;y
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x
}
}
/**************************************************
* 函數名稱: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 offsetShift 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
OLED_Set_Pos(x0,y);
for(x=x0;x
OLED_WrDat(BMP[j++]);
}
}
WWDG_SetCounter(0x7F); //喂狗
}
/**************************************************************************
* 函數名稱: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
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
OLED_Set_Pos(x0,y);
for(x=x0;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
OLED_Set_Pos(0,y);
for(x=0;x
OLED_WrDat(BMP[j++]);
}
}
}
上一篇:stm8 軟件模擬IIC驅動PCF8563T,NOKIA5110液晶顯示
下一篇:淺談STM8S(1)——I2C配置
推薦閱讀
史海拾趣
隨著電子市場的日益成熟,Compact公司意識到單純的技術創新已不足以支撐其長期發展。于是,公司開始積極尋求市場拓展和戰略合作的機會。通過與國內外知名企業建立合作伙伴關系,Compact公司成功將其產品打入國際市場,進一步擴大了市場份額。同時,通過與上下游企業的緊密合作,Compact公司實現了產業鏈的整合,提高了整體運營效率。
為了進一步推動其技術在建筑行業的應用,EnOcean發起并建立了EnOcean聯盟。該聯盟由來自建筑行業的400多家公司組成,致力于推廣基于EnOcean無線標準的免維護無線解決方案。通過與聯盟成員的合作,EnOcean不斷拓展其市場份額,并為智慧樓宇及能源管理提供更穩定的硬件解決方案。
在上世紀60年代至70年代的阿波羅登月計劃期間,Curtis的技術和產品被美國航空航天局(NASA)廣泛應用。在每個登月艙中,NASA都裝備了多個Curtis消逝時間指示器,用于監控電力系統的運行情況。同時,阿波羅月球行走車上也安裝了Curtis的電子電量安培小時計,以監控電池的使用情況。這些高精度、高可靠性的產品為NASA的太空任務提供了強有力的技術支撐。
Curtis一直致力于環保和低碳技術的研發與應用。公司的產品和服務廣泛應用于電動汽車、混合動力汽車等環保型交通工具中,為減少碳排放、推動綠色出行做出了積極貢獻。同時,Curtis還積極參與各種環保活動和社會公益項目,通過實際行動踐行環保理念。
隨著國內市場的飽和,AE&ST公司開始將目光投向全球。公司積極尋找國際合作伙伴,拓展海外市場。在一次國際電子展上,AE&ST與一家歐洲知名電子公司達成了戰略合作協議。雙方共同研發了一款針對歐洲市場的特色產品,并成功打開了歐洲市場的大門。此后,AE&ST公司不斷深化與國際伙伴的合作,逐步實現了全球化布局。
有些程序在調試、兼容性、平臺移植等情況下可能想要通過簡單地設置一些參數就生成一個不同的軟件,這當然可以通過變量設置,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進去, ...… 查看全部問答∨ |
|
我開發一個驅動程序.sys和一個應用程序.exe,應用程序可以調用加載到內核的驅動 程序,我看資料說驅動程序的派遣函數是運行在應用程序的進線程的上下文中了,那 么我可以獲得應用程序的模式(PE加載到內核中)的資料么?然后再驅動里做點東西 可 ...… 查看全部問答∨ |
|
摘要:UCD30xx 系列數字電源控制器包括UCD3040、UCD3020 以及UCD3028,主要應用在交直變換(AC/DC)電源和隔離的直直變換(DC/DC)電源上。數字電源和模擬電源原理是一樣的,但數字電源所使用的值都是數字量,是模擬量離散化后的值,所以不可避免的 ...… 查看全部問答∨ |