前言:
最近有一门课程需要使用51单片机来完成,为了显示界面好看,打算使用0.96寸OLED屏幕来进行显示,但是课程要求不能使用无效空循环的延时函数,而我发现之前的驱动就有常见的延时函数:
void IIC_Delay(unsigned char i)//1us延时
{
while(i--)
{
_nop_();
_nop_();
}
}
但是开定时器我觉得有写浪费,所以对之前的代码进行了优化。
OLED.C
/**
****************************************************************************************************
* @file oled.c
* @author Tianess
* @version V1.0
* @date 2024-10-13
* @brief OLED 驱动
*
*
* 实验平台:普中科技51实验板A2
* 使用芯片:STC12C5A60S2
*
****************************************************************************************************
*/
#include <STC12C5A60S2.H>
#include "OLED.H"
#include "OLEDFONT.H"
#include <stdio.h>
#include <intrins.h>
/*----------总线引脚定义----------*/
sbit OLED_SDA = P1^3; /* 数据线 */
sbit OLED_SCL = P1^4; /* 时钟线 */
/*----------开始信号----------*/
void OLED_IIC_Start(void)
{
OLED_SDA = 1;
OLED_SCL = 1;//当OLED_SCL为高电平的时候,OLED_SDA线上由高到低的跳变被定义为起始条件
OLED_SDA = 0;
OLED_SCL = 0;
}
/*----------停止信号----------*/
void OLED_IIC_Stop(void)
{
OLED_SDA = 0;
OLED_SCL = 1;//OLED_SCL为高电平的时候,OLED_SDA线上由低到高的跳变被定义为停止条件;
OLED_SDA = 1;
}
/*----------等待应答信号----------*/
bit OLED_IIC_Wait_Ack(void)
{
bit ackbit;
OLED_SCL = 1;
ackbit = OLED_SDA;
OLED_SCL = 0;
return ackbit;
}
/*----------通过I2C总线发送数据----------*/
void OLED_Write_IIC_Byte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
OLED_SCL = 0;
if(byt & 0x80) OLED_SDA = 1;
else OLED_SDA = 0;
OLED_SCL = 1;
byt <<= 1;
}
OLED_SCL = 0;
}
/*----------从I2C总线上接收数据----------*/
unsigned