#include "oled.h"
#include "codetab.h"
#include "delay.h"
// ------------------------------------------------------------
// IO口模拟I2C通信
// ------------------------------------------------------------
void OLED_GPIO_Init(void)
{
RCC->APB2ENR|=1<<3; //先使能外设IO PORTB时钟
GPIOB->CRH&=0XFFFFFF00; //PB89 推挽输出
GPIOB->CRH|=0X00000077; //PB89开漏输出
GPIOB->ODR|=2<<9; //PC89输出高
}
/**************************实现函数********************************************
*函数原型: void IIC_Start(void)
*功 能: 产生IIC起始信号
*******************************************************************************/
void OLED_IIC_Start(void)
{
//SDA_OUT(); //sda线输出
OLED_IIC_SDA=1;
// if(!OLED_WRITE_SDA)//return 0;
OLED_IIC_SCL=1;
delay_us(1);
OLED_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
// if(OLED_WRITE_SDA)//return 0;
delay_us(1);
OLED_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
//return 1;
}
/**************************实现函数********************************************
*函数原型: void IIC_Stop(void)
*功 能: //产生IIC停止信号
*******************************************************************************/
void OLED_IIC_Stop(void)
{
//SDA_OUT();//sda线输出
OLED_IIC_SCL=0;
OLED_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(1);
OLED_IIC_SCL=1;
OLED_IIC_SDA=1;//发送I2C总线结束信号
delay_us(1);
}
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(IIC_Byte & 0x80)
OLED_IIC_SDA=1;
else
OLED_IIC_SDA=0;
OLED_IIC_SCL=1;
delay_us(1); //必须有保持SCL脉冲的延时
OLED_IIC_SCL=0;
IIC_Byte<<=1;
}
OLED_IIC_SDA = 1;//原程序这里有一个拉高SDA,根据OLED的DATASHEET,此句必须去掉。
OLED_IIC_SCL=1;
delay_us(1);
OLED_IIC_SCL=0;
}
/*********************OLED写数据************************************/
void OLED_WrDat(unsigned char IIC_Data)
{
OLED_IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40); //write data
Write_IIC_Byte(IIC_Data);
OLED_IIC_Stop();
}
/*********************OLED写命令************************************/
void OLED_WrCmd(unsigned char IIC_Command)
{
OLED_IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00); //write command
Write_IIC_Byte(IIC_Command);
OLED_IIC_Stop();
}
/*********************OLED 设置坐标************************************/
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(((x&0xf0)>>4)|0x10);
OLED_WrCmd((x&0x0f)|0x01);
}
/*********************OLED全屏************************************/
void OLED_Fill(unsigned char bmp_dat)
{
unsigned char y,x;
for(y=0;y<8;y++)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
OLED_WrDat(bmp_dat);
}
}
/*********************OLED复位************************************/
void OLED_CLS(void)
{
unsigned char y,x;
for(y=0;y<8;y++)
{
OLED_WrCmd(0xb0+y);
OLED_WrCmd(0x01);
OLED_WrCmd(0x10);
for(x=0;x<X_WIDTH;x++)
OLED_WrDat(0);
}
}
//--------------------------------------------------------------
// Prototype : void OLED_OFF(void)
// Calls :
// Parameters : none
// Description : 让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
//--------------------------------------------------------------
void OLED_OFF(void)
{
OLED_WrCmd(0X8D); //设置电荷泵
OLED_WrCmd(0X10); //关闭电荷泵
OLED_WrCmd(0XAE); //OLED休眠
}
//--------------------------------------------------------------
// Prototype : void OLED_ON(void)
// Calls :
// Parameters : none
// Description : 将OLED从休眠中唤醒
//--------------------------------------------------------------
void OLED_ON(void)
{
OLED_WrCmd(0X8D); //设置电荷泵
OLED_WrCmd(0X14); //开启电荷泵
OLED_WrCmd(0XAF); //OLED唤醒
}
/*********************OLED初始化************************************/
void OLED_Init(void)
{
delay_ms(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 亮度调节 0x00~0xff
OLED_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WrCmd(0xc8);//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 offset Shift 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/a7)
OLED_WrCmd(0xaf);//--turn on oled panel
OLED_Fill(0x00); //初始清屏
OLED_Set_Pos(0,0);
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//f_w:字宽
//f_h:字高
//mode:0,反白显示;1,正常显示
/*void oled_showChar(u8 x,u8 y,u8 chr,u8 f_w,u8 f_h,u8 mode)
{
u8 temp,t,t1;
u8 y0=y;
u8 csize=(f_h/8+((f_h%8)?1:0))*f_w;//得到自由分辨字符所占的字节数
chr=chr-' ';//得到偏移后的值
for(t=0;t<csize;t++)
{
if(f_w==6&&f_h==8)temp=F6x8[chr][t]; //调用0608ascii字体
else if(f_w==6&&f_h==16)F6x16[chr][t]; //调用0612ascii字体
else if(f_w==16&&f_h==16)temp=asc2_1224[chr][t];//调用1224ascii字体
else return; //没有的字库
for(t1=0;t1<8;t1++)
{
if(temp&0x80)oled_drawPoint(x,y,mode);
else oled_drawPoint(x,y,!mode);
temp<<=1;
y++;
if((y-y0)==f_h)
{
y=y0;
x++;
break;
}
}
}
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
void OLED_showNum(u8 x,u8 y,u32 num,u8 len,u8 size)// -- 6x8点整,用于显示变量的最小阵列,不太清晰
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
continue;
}else enshow=1;
}
OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1);
}
}
*/
/***************功能描述:显示6*8一组标准ASCII字符串 显示的坐标(x,y),y为页范围0~7****************/
void OLED_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[])
{
unsigned char c=0,i=0,j=0;
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++;
}
}
/*******************功能描述:显示8*16一组标准ASCII字符串 显示的坐标(x,y),y为页范围0~7****************/
void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])
{
unsigned char c=0,i=0,j=0;
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++;
}
}
//--------------------------------------------------------------
// Prototype : OLED_P16x16Ch(unsigned char x, unsigned char y,
没有合适的资源?快使用搜索试试~ 我知道了~
0.96寸OLED显示屏驱动文件(.c+.h)
共3个文件
h:2个
c:1个
需积分: 5 1 下载量 69 浏览量
2024-01-17
10:05:36
上传
评论
收藏 7KB RAR 举报
温馨提示
该驱动文件中包含了0.96寸OLED显示屏驱动的一个.c和两个.h文件(oled.h, oled.c, codetab.h),主要应用了GPIO口模拟IIC的功能实现字符串的显示,非常好方便移植,目前已经在STM32F103C8T6单片机上测试过了,成功驱动0.96寸显示屏,使用P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])可以非常清晰地显示字符串,使用P16x16Ch(unsigned char x,unsigned char y,unsigned int N)可以非常清晰地显示汉字,希望能够帮助到需要的人。
资源推荐
资源详情
资源评论
收起资源包目录
OLED.rar (3个子文件)
OLED
oled.c 8KB
oled.h 1KB
codetab.h 15KB
共 3 条
- 1
资源评论
mengxikaiwu
- 粉丝: 2
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功