STM8 模拟I2C驱动0.91寸OLED屏

发布者:徽宗古泉最新更新时间:2018-05-31 来源: eefocus关键字: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--;
    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++]);
    }
  }
}

关键字:STM8  模拟I2C  驱动0  91寸  OLED屏 引用地址:STM8 模拟I2C驱动0.91寸OLED屏

上一篇:stm8 软件模拟IIC驱动PCF8563T,NOKIA5110液晶显示
下一篇:浅谈STM8S(1)——I2C配置

推荐阅读最新更新时间:2024-03-16 16:03

STM8学习笔记三----按键实验
今天做按键的实验。青风的源码中按键的引脚定义似乎有错,和开发板原理图中的不一致。 正确的引脚定义应该是: #define KEY3_PIN GPIO_PIN_3 #define KEY2_PIN GPIO_PIN_4 #define KEY1_PIN GPIO_PIN_0 #define KEY3_PORT GPIOE #define KEY2_PORT GPIOE #define KEY1_PORT GPIOI 我编写的main主函数代码: #include stm8s.h #include stm8s_clk.h #include led.h #include ke
[单片机]
STM8 UART2
#include stm8s.h #include stm8s_conf.h #include UART2.h #include stdarg.h void UART2_Config(u32 Rate) { CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE); GPIO_Init(UART2_PORT, TX2_PIN, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(UART2_PORT, RX2_PIN, GPIO_MODE_IN_PU_NO_IT); UART2_Init(Rate, U
[单片机]
**解决STLINK V2烧过JLINK OB,恢复后不能识别STM8**
我手上的stlink v2是在正点原子那买开发板一块买的,这个是他们自己做的,不和官方的完全一样,实际使用时不能识别STM32L4系列的片子,后来发现拆机刷成JLINK OB的可以用了,但只能在ST家芯片上用SWD模式,速度4mhz,完全够用了;刷成CMSIS-DAP也可以用,还可以支持其他家的ARM,速度低些只有1mhz。指示灯好像都不正常,但这都不是事 后来有项目用STM8S的片子,这个只能用SWIM口调试,所以准备刷回来,看到有官方的恢复软件“STLinkReflash.exe”,所以没拆机(问题就在这),刷了后在stm32上一切正常,但是就是不识别STM8的片子,通过官方软件“ST-LinkUpgrade.exe”升级固
[单片机]
**解决STLINK V2烧过JLINK OB,恢复后不能识别<font color='red'>STM8</font>**
STM8 针对马达控制的六步PWM输出
当在一个通道上需要互补输出时,预装载位有OCiM、CCiE和CCiNE。在发生COM换相事件时,这些预装载位被传送到影子寄存器位。这样你就可以预先设置好下一步骤配置,并在同一个时刻同时修更改所有通道的配置。COM可以通过设置TIM1_EGR寄存器的COMG位由软件产生,或在TRGI上升沿由硬件产生。 图73显示当发生COM事件时,三种不同配置下OCx和OCxN输出。 (图73:STM8产生六步PWM,使用COM的例子(OSSR=1))
[单片机]
<font color='red'>STM8</font> 针对马达控制的六步PWM输出
OLED显示统领2021年智能手机显示面板市场,收益增长超 5%
OLED显示屏是利用有机电自发光二极管制成的显示屏。由于同时具备自发光有机电激发光二极管,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性。 amoled显示屏多用在手机等小屏显示上,尤以三星可以量产,但产能仍较低。pmoled以索尼和三菱电机为龙头,技术最成熟,国内以维信诺(Visionox)显示为代表。 简介对于有机电激发光器件,我们可按发光材料将其分为两种: 小分子OLED和高分子OLED(也可称为PLED)。它们的差异主要表器件的制备工艺不同:小分子器件主要采用真空热蒸发工艺,高分子器件则采用旋转涂覆或喷墨工艺。 Strategy Analytics
[嵌入式]
STM8出现如下问题的解决方案
The command: cxstm8 +warn +mods0 +debug -pxp -no -pp -l -iinc -iproject -i C:Program Files (x86)COSMICCXSTM8_32KHstm8 -cl..esir-th(v1.0) -co..esir-th(v1.0) projectdevinit.c has failed, the returned value is: 1exit code=1. C Language 的改变会发生如上的错误
[单片机]
<font color='red'>STM8</font>出现如下问题的解决方案
STM8S学习笔记之四(STM8 time1)
这几天一直纠结于使用STM8库还是用底层寄存器写程序,用了用IAR和库的搭配,方便时肯定的,但是呢,鉴于我现在工作使用的就是STM32的单片机+STM32库,考虑再三,我还是用底层吧,这样两个就可以互补了,既不会太依赖于库,又对寄存器的操作有更深的了解。。只是都是相通的,是的,相通的。。 以下是从技术手册上粘贴的: TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。 本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。 高级控制定时器适用于许多不同的用途: ●基本的定时 ●测量输入信号的脉冲宽度(输入捕获) ●产生输出波形(输出比较
[单片机]
STM8库函数开发手册(1) //工程模板、GPIO、时钟
第一部分 创建库函数工程 1、创建文件目录 BSP文件夹中存放自定义底层驱动程序文件; IAR文件夹存放IAR工程文件; LIB 文件夹中引入C 语言自己的库函数; USR 文件夹中存放自定义主程序及数据库头文件等; Readme 文件夹中存放自定义程序设计说明文件; 2、将STM8库函数文件拷贝入LIB文件夹 链接: https://pan.baidu.com/s/1llVx9meEhhk0VYKbsKzLxwpan.baidu.com 提取码:iy3v 下载解压后进入官方库函数目录: 打开LibrariesSTM8S_StdPeriph_Driver文件夹,找到inc 和src文件夹 就是我们的官方库文件啦 将
[单片机]
<font color='red'>STM8</font>库函数开发手册(1) //工程模板、GPIO、时钟
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved