STC8G系列单片机内部集成了一个I2C串行控制器。

STC8G系列的I2C总线提供了两种操作模式:主机模式(SCL为输出口,发送同步时钟信号);从机模式(SCL为输入口,接收同步时钟信号)。

I2C相关寄存器:

I2C主机模式相关寄存器:

I2CCFG:配置寄存器,总线速度控制

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CCFG

配置寄存器

FE80H

ENI2C

MSSL

MSSPEED[5:0]

ENI2C:I2C功能使能控制位

0:禁止I2C功能

1:允许I2C功能

MSSL:I2C工作模式选择位

0:从机模式

1:主机模式

MSSPEED[5:0]:I2C总线速度控制

I2C总线速度=FOSC/2/(MSSPEEED*2+4)

注意:只有当I2C模块在主机模式时,MSSPEED参数设置的等待参数才有效。此参数主要用于I2C起始信号和中止信号的建立和保持时间的设置。

I2CMSCR:主机控制寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CMSCR

主机控制寄存器

FE81H

EMSI

-

-

-

MSCMD[3:0]

EMSI:主机模式中断使能控制位

0:关闭主机模式的中断

1:开启主机模式的中断

MSCMD[3:0]:主机命令

0000:待机,无动作

0001:起始指令,发送起始信号。

0010:发送数据指令

0011:接收ACK命令

0100:接收数据命令

0101:发送ACK命令

0110:停止命令,发送停止信号。

1001:起始命令+发送数据命令+接收ACK命令

1010:发送数据命令+接收ACK命令

1011:接收数据命令发送ACK命令

1100:接收数据命令+发送NAK命令

I2CMSAUX:主机辅助控制寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CMSAUX

主机辅助控制寄存器

FE88H

-

-

-

-

-

-

-

WDTA

WDTA:主机模式,I2C数据自动发送允许位。

I2CMSST:主机状态寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CMSST

主机状态寄存器

FE82H

MSBUSY

MSIF

-

-

-

-

MSACKI

MSACKO

MSBUSY:主机模式I2C控制状态位

MSIF:主机模式的中断请求位

MSACKI:主机模式时,发送0011命令到I2CMSCR的MSMD位后所接收到的ACK数据。

MSACKO:主机模式时,准备将要发送的的ACK信号。

I2C从机模式相关寄存器:

I2CSLCR:控制寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CSLCR

从机控制寄存器

FE83H

-

ESTAI

ERXI

ETXI

ESTOI

-

-

SLRST

ESTAI:从机模式接收START信号中断允许位

ERXI:从机模式时接收到一个字节后中断允许位

ETXI:从机模式时发送一个字节后的中断允许位

ESTOI:从机模式时接收STOP信号的中断允许位

SLRST:复位从机模式

I2CSLST:状态寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CSLST

状态寄存器

FE84H

SLBUSY

STAIF

RXIF

TXIF

STOIF

-

SLACKI

SLACKO

SLBUSY:I2C控制器状态位,空闲和忙碌

STAIF:从机模式接收到START信号后的中断请求位

RXIF:从机模式时接收到1字节的数据后的中断请求位。

TXIF:从机模式时发送完成一个字节的数据后的中断请求位。

STOIF:从机模式接收到STOP信号后的中断请求位。

SLACKI:从机模式时,接收到的ACK数据。

SLACKO:从机模式时,准备将要发送的ACK信号。

I2CSLADR:地址寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CSLADR

从机地址寄存器

FE85H

IACSLADR[7:1]

MA

IACSLADR[7:1]:从机设备地址

MA:从机设备地址比较控制

0:设备地址必须与I2CSLADR[7:1]相同

1:忽略I2CSLADR[7:1]中的设置,接收所有的设备地址

I2C数据寄存器

I2CTXD:发送数据寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CTXD

发送数据寄存器

FE86H

I2CRXD:接收数据寄存器

符号

描述

地址

B7

B6

B5

B4

B3

B2

B1

B0

I2CRXD

接收数据寄存器

FE87H

分步例程:

液晶屏为:0.96寸的IIC屏幕

//硬件IIC初始化

void iicInit()
{P_SW2 = 0xc0;   // SCL(3.2) SDA(3.3)I2CCFG = 0xff;  //开启iic 主机模式 最高速度I2CMSST = 0x00; //关中断 待机模式
}

//延时函数,单片机的晶振为30M

void delay_ms(unsigned int ms)
{                        while(ms){unsigned char i=39, j=243;do{while (--j);}while (--i);ms--;}return;
}

//等待空闲

void Wait()
{while (!(I2CMSST & 0x40));I2CMSST &= ~0x40;
}

//起始信号

void IIC_Start()
{I2CMSCR = 0x01;     //发送START命令Wait();
}

//结束信号

void IIC_Stop()
{I2CMSCR = 0x06;     //发送STOP命令Wait();
}

//等待并发送ACK

void IIC_Wait_Ack()
{I2CMSCR = 0x00;                             //设置ACK信号I2CMSCR = 0x05;                             //发送ACK命令Wait();
}

//写字节

void Write_IIC_Byte(unsigned char dat)
{I2CTXD = dat;         //写数据到数据缓冲区I2CMSCR = 0x02;       //发送SEND命令Wait();
}

//写指令

void Write_IIC_Command(unsigned char IIC_Command)
{IIC_Start();Write_IIC_Byte(0x78);            //Slave address,SA0=0IIC_Wait_Ack();       Write_IIC_Byte(0x00);           //write commandIIC_Wait_Ack();       Write_IIC_Byte(IIC_Command);IIC_Wait_Ack();       IIC_Stop();
}

//写数据

void Write_IIC_Data(unsigned char IIC_Data)
{IIC_Start();Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0IIC_Wait_Ack();       Write_IIC_Byte(0x40);                        //write dataIIC_Wait_Ack();       Write_IIC_Byte(IIC_Data);IIC_Wait_Ack();       IIC_Stop();
}

//写入OLED的字节

void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd){Write_IIC_Data(dat);}else{Write_IIC_Command(dat);                                                         }
}

//写入指定字模

void fill_picture(unsigned char dat)
{unsigned char m,n;for(m=0;m<8;m++){OLED_WR_Byte(0xb0+m,0);                //page0-page1OLED_WR_Byte(0x00,0);                //low column start addressOLED_WR_Byte(0x10,0); for(n=0;n<128;n++){OLED_WR_Byte(dat,1);}}
}

//清除OLED屏幕

void OLED_Clear(void)
{ u8 i,n;                    for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址  for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);} //更新显示}

//初始化SSD1306

void OLED_Init(void)
{      //关闭显示OLED_WR_Byte(0xAE,OLED_CMD);//--display off//设置时钟分频和RC振荡器频率OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);////设置多路传输比率OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty    //设置显示偏移,不偏移设置0OLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);////设置显示开始行OLED_WR_Byte(0x40,OLED_CMD);//--set start line address //启用电荷泵(0x10禁用电荷泵)OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);////左右方向显示,正常显示0x01(0xA0左右反置)OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap//上下方向显示,正常显示0xc8(0xc0上下反置)OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction//设置列引脚的硬件配置OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);////设置对比度【第二个最大对比度】OLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128//设置预充电器件的持续时间OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);////调整Vcomif调节器的输出OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column address//设置页地址OLED_WR_Byte(0xB0,OLED_CMD);//--set page address       OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xA4,OLED_CMD);////设置为正常显示,1:显示,0:不显示OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse//打开OLEDOLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_Clear();
} 

主函数:

int main(void)
{iicInit();OLED_Init();while(1){fill_picture(0xff);delay_ms(1000);fill_picture(0x00);delay_ms(200);}}

在编译过程中发现,液晶屏不显示,最终结果是引脚未初始化。

P5M0=0xff;
    P5M1=0x00;

加入单片机引脚初始化测试成功。

基于STC8G1K08的0.96寸IIC液晶屏驱动程序相关推荐

  1. 基于STM32F103 0.96寸OLED液晶屏驱动(iic通讯)

    一.概述 OLED驱动方式有8080.6800.3线/4线SPI以及IIC,能够显示字符.汉字的图片,无字库需通过取模软件获取显示内容数组.本次实验使用的是IIC通信协议,SSD1306驱动芯片的OL ...

  2. 【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  3. STM32驱动0.96寸OLED液晶屏

    一.OLED简述 1.OLED模块简介 2.SSD1306控制芯片驱动 3.如何显示字符 4.字幕显示原理 二. 上下或左右的滑动显示长字符 三. 显示AHT20的温度和湿度 四.总结 一.OLED简 ...

  4. 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍

    0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍 图为中景园的0.96寸ssd1306屏幕,适合于PCB一体化设计.如果想分开,可以直接购买带焊接好转接的OLED屏幕. ...

  5. 基于STM32F103C8T6的0.96寸OLED显示屏显示数据

    一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...

  6. 关于基于stm32的0.96寸oled显示屏的学习理解心得。

    关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...

  7. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  8. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  9. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

最新文章

  1. php yaf框架模块化,基于yaf的模块化开发方案
  2. 阿里巴巴发送短信接口的使用
  3. 信息系统项目管理师:第5章:项目范围管理- 章节真题+解析
  4. HTML-语义类标签
  5. 企业应用架构模式 读书笔记
  6. Linux 给用户添加sudo权限
  7. switch case穿透Java_Java switch的用法与case的穿透现象举例详解
  8. 【图像去雾】基于Retinex算法实现图像去雾matlab代码
  9. Unity URP 内置的 ParticlesLit.shader 中的 fallback 拼写错误,导致 fallback 找不到 SimpleLit,改为 Simple Lit即可
  10. 用python计算方程的根_Python程序计算ax^2+bx+c=0方程根
  11. 前端应届简历应该怎么写?
  12. 抖音国庆小游戏是如何实现的?带你走近 Cocos
  13. 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现?
  14. 图像平移 VS+opencv+C++
  15. 选择沃创云AI智能外呼机器人,实现真正的开源节流
  16. 随机变量-离散-连续-假设检验方法
  17. 2017年阳光私募基金一季度报告
  18. boolean的使用
  19. vue中如何实现实现中英文切换
  20. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

热门文章

  1. 雾计算?边缘计算?云里雾里还被边缘?
  2. 手机CPU之各型号CPU比较
  3. oracle中pdb,Oracle 12C新特性-CDB和PDB 详解
  4. R文件报错原因及解决办法汇总
  5. solr mysql_使用Solr索引MySQL数据
  6. 【自考】网络经济与企业管理(三)——考后总结
  7. Altium Allegro PADS到底该选哪个EDA设计软件
  8. 了解抖音本地生活服务商:连接你与便捷生活的桥梁
  9. 项目进度管理:控制进度--监控过程组
  10. 【论文阅读】Diffusion Models for Imperceptible and Transferable Adversarial Attack