基于STC8G1K08的0.96寸IIC液晶屏驱动程序
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液晶屏驱动程序相关推荐
- 基于STM32F103 0.96寸OLED液晶屏驱动(iic通讯)
一.概述 OLED驱动方式有8080.6800.3线/4线SPI以及IIC,能够显示字符.汉字的图片,无字库需通过取模软件获取显示内容数组.本次实验使用的是IIC通信协议,SSD1306驱动芯片的OL ...
- 【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- STM32驱动0.96寸OLED液晶屏
一.OLED简述 1.OLED模块简介 2.SSD1306控制芯片驱动 3.如何显示字符 4.字幕显示原理 二. 上下或左右的滑动显示长字符 三. 显示AHT20的温度和湿度 四.总结 一.OLED简 ...
- 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍
0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍 图为中景园的0.96寸ssd1306屏幕,适合于PCB一体化设计.如果想分开,可以直接购买带焊接好转接的OLED屏幕. ...
- 基于STM32F103C8T6的0.96寸OLED显示屏显示数据
一.了解SPI(串行外设接口) SPI全称是Serial Perripheral Interface,也就是串行外围设备接口.SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工 ...
- 关于基于stm32的0.96寸oled显示屏的学习理解心得。
关于基于stm32的0.96寸oled显示屏的学习理解心得. oled粗了解 如何理解OLED分辨率? 这里0.96寸OLED分辨率是12864;即OLED显示是128行64列; 但是由于OLED不能 ...
- 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...
- 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...
- 利用51单片机+0.96寸iic接口oled显示图片或动图
利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...
最新文章
- php yaf框架模块化,基于yaf的模块化开发方案
- 阿里巴巴发送短信接口的使用
- 信息系统项目管理师:第5章:项目范围管理- 章节真题+解析
- HTML-语义类标签
- 企业应用架构模式 读书笔记
- Linux 给用户添加sudo权限
- switch case穿透Java_Java switch的用法与case的穿透现象举例详解
- 【图像去雾】基于Retinex算法实现图像去雾matlab代码
- Unity URP 内置的 ParticlesLit.shader 中的 fallback 拼写错误,导致 fallback 找不到 SimpleLit,改为 Simple Lit即可
- 用python计算方程的根_Python程序计算ax^2+bx+c=0方程根
- 前端应届简历应该怎么写?
- 抖音国庆小游戏是如何实现的?带你走近 Cocos
- 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现?
- 图像平移 VS+opencv+C++
- 选择沃创云AI智能外呼机器人,实现真正的开源节流
- 随机变量-离散-连续-假设检验方法
- 2017年阳光私募基金一季度报告
- boolean的使用
- vue中如何实现实现中英文切换
- POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础
热门文章
- 雾计算?边缘计算?云里雾里还被边缘?
- 手机CPU之各型号CPU比较
- oracle中pdb,Oracle 12C新特性-CDB和PDB 详解
- R文件报错原因及解决办法汇总
- solr mysql_使用Solr索引MySQL数据
- 【自考】网络经济与企业管理(三)——考后总结
- Altium Allegro PADS到底该选哪个EDA设计软件
- 了解抖音本地生活服务商:连接你与便捷生活的桥梁
- 项目进度管理:控制进度--监控过程组
- 【论文阅读】Diffusion Models for Imperceptible and Transferable Adversarial Attack