历史上的今天
返回首页

历史上的今天

今天是:2025年05月31日(星期六)

2018年05月31日 | STM8 模拟I2C驱动0.91寸OLED屏

2018-05-31 来源:eefocus

#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_WrDat(bmp_dat);}
}
}
/**************************************************
* 函数名称: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_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 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++]);
    }
  }
}

推荐阅读

史海拾趣

Hmc Inc公司的发展小趣事

“Global Memory Tech”公司在HMC技术的研发过程中,深刻认识到国际合作的重要性。该公司积极与全球各地的科研机构、高校和行业标准组织合作,共同推动HMC技术的标准化进程。通过不懈努力,Global Memory Tech成功推动了HMC相关标准的制定,为HMC技术的广泛应用奠定了坚实基础。同时,该公司还通过技术授权和合作生产的方式,与多家国际企业建立了紧密的合作关系。

ETA-USA公司的发展小趣事

随着业务的发展和市场的扩大,ETA-USA开始在全球范围内布局。公司先后在中国、欧洲等地设立了分公司或办事处,以更好地服务当地客户。这一全球扩张策略不仅增强了公司的市场竞争力,也为其带来了更多的商业机会和合作伙伴。

ETI Systems公司的发展小趣事

ETI Systems公司自创立之初,就专注于研发具有创新性的电子产品和解决方案。在公司发展的早期,它推出了一款高性能的无线通信设备,该设备采用了当时最先进的信号处理技术,极大地提升了数据传输的效率和稳定性。这一创新产品不仅帮助ETI Systems在市场上获得了良好的口碑,也引领了整个行业的技术发展方向。

Bridgelux公司的发展小趣事

被收购后,Bridgelux并没有停止创新的步伐。公司继续加大研发投入,推出了一系列具有创新性的LED照明产品。同时,公司还积极拓展市场,与全球各地的客户建立了广泛的合作关系。通过不断提升产品质量和服务水平,Bridgelux逐渐在LED照明领域树立了良好的口碑,成为了行业的佼佼者。

这五个故事展示了Bridgelux公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步,到技术突破与创新,再到与Cree公司的专利纠纷与和解,以及被CEC和重庆临空收购后的持续发展与创新,Bridgelux始终保持着对技术的追求和对市场的敏锐洞察。正是这些努力和坚持,使得Bridgelux在竞争激烈的电子行业中脱颖而出,成为了LED照明领域的领军企业。

EM Devices Corporation公司的发展小趣事

作为一家有社会责任感的企业,EM Devices Corporation不仅关注自身的经济效益,还积极履行社会责任。公司严格遵守环保法规,采取了一系列环保措施,减少生产过程中的污染排放。此外,公司还积极参与公益事业,为社会做出了积极的贡献。这种可持续发展的理念为公司赢得了广泛的社会赞誉和尊重。

HTC Korea(TAEJIN Technology )公司的发展小趣事

进入安卓时代,HTC再次展现了其敏锐的市场洞察力和强大的技术实力。2008年,HTC联合电信运营商T-Mobile推出了世界上第一款安卓手机T-Mobile G1,这款手机的成功标志着HTC正式进入了安卓阵营。随后,HTC推出了多款备受好评的安卓手机,如HTC Hero(G3)等,进一步巩固了其在智能手机市场的地位。与谷歌和安卓的合作,为HTC带来了前所未有的发展机遇。

问答坊 | AI 解惑

Stellaris系列资料汇总(欲打造最强帖哦)

Keil uv3快速入门 demo https://bbs.eeworld.com.cn/thread-98020-1-1.html…

查看全部问答>

请教51多任务操作系统

我最近在网上找到这么个简单的基于51单片机的多任务操作系统,但是我不知道其中task-swith和task-load这两个函数是怎么切换任务的,用堆栈管理实现任务的切换,请高手帮我解释下,谢谢 我主要想知道51单片机怎样去识别任务切换 程序 /* ...…

查看全部问答>

获取电机转数

我设计的系统是这样的啊,T0扩展为一个外中断,T2工作在定时器方式下,TH2,TL2初值为0,当T0接收到第一个外断信号时,T2开始工作,当下个信号到来后停止工作,得到TH2和TL2的值啊,然后再这个值转化为是时间得到电机转一周的时间.这样行的通吗? 下一步对电 ...…

查看全部问答>

求wince5.0书籍

麻烦大家介绍几本wince5.0的开发书籍,最好是直接针对5.0的,谢谢~~…

查看全部问答>

运行时关闭UPLL的问题

系统:s3c2440a +wince5 想在系统运行时,关闭UPLL,不产生48Mhz,在需要时再打开UPLL 查看s3c2440a的datasheet,上写控制CLKSLOW寄存器的UCLK_ON即可 CLKSLOW[7] --> UCLK_ON --> = 0 UCLK_ON (UPLL turn on)         ...…

查看全部问答>

求助,硬件设计de-rating是个什么东西?

de-rating是什么东西?有什么用? 越详细越好,讲明白就好~~~~…

查看全部问答>

如何改变列表框的列头的文本

我想改变列表框的列头的文本,代码如下:         LVCOLUMN lvColumn;         lvColumn.mask = LVCF_TEXT | LVCF_WIDTH;         pMethodManageDlg->m_MethodList.GetColumn(1, ...…

查看全部问答>

如何知道一个WinCE SDK裁剪了哪些内容?

我现在手上有一个针对某个设备的 WinCE5.0 SDK包。 如何知道其在原版WinCE上做了哪些裁剪? 相关目录如下: [Atl] [Help]                   [Include]     & ...…

查看全部问答>

关于wince上的中文输入法

如果想在wince中自己开发一个中文输入法,要是用EVC的话,应该如果建立拼音和汉字字库的检索? 有没有相关的API函数? 要是想开发一个手写中文输入软件呢?都需要怎么去开发?…

查看全部问答>

驱动程序

请高手帮忙,LPC2292控制SIM900的驱动程序怎么写?…

查看全部问答>