0.96寸oled显示的51单片机库函数代码
时间: 2023-09-28 09:10:18 浏览: 129
51的OLED显示函数
以下是基于STC89C52单片机的0.96寸OLED显示屏的库函数代码:
```c
#include <reg52.h>
#include <intrins.h>
#define OLED_SCL P1_0 // OLED时钟
#define OLED_SDA P1_1 // OLED数据
#define OLED_RST P1_2 // OLED复位
// OLED初始化函数
void OLED_Init()
{
// 复位OLED
OLED_RST = 0;
delay_ms(200);
OLED_RST = 1;
delay_ms(200);
// 设置OLED显示模式
OLED_WriteCmd(0xAE); // 关闭OLED显示
OLED_WriteCmd(0x00); // 设置低位列地址
OLED_WriteCmd(0x10); // 设置高位列地址
OLED_WriteCmd(0x40); // 设置开始行地址
OLED_WriteCmd(0x81); // 设置对比度
OLED_WriteCmd(0xCF);
OLED_WriteCmd(0xA1); // 设置段重定向
OLED_WriteCmd(0xC8); // 设置行重定向
OLED_WriteCmd(0xA6); // 设置正常显示
OLED_WriteCmd(0xA8); // 设置多路复用比
OLED_WriteCmd(0x3F);
OLED_WriteCmd(0xD3); // 设置显示偏移
OLED_WriteCmd(0x00);
OLED_WriteCmd(0xD5); // 设置时钟分频
OLED_WriteCmd(0x80);
OLED_WriteCmd(0xD9); // 设置预充电周期
OLED_WriteCmd(0xF1);
OLED_WriteCmd(0xDA); // 设置COM硬件扫描方式
OLED_WriteCmd(0x12);
OLED_WriteCmd(0xDB); // 设置VCOMH电压倍率
OLED_WriteCmd(0x40);
OLED_WriteCmd(0x8D); // 设置电荷泵
OLED_WriteCmd(0x14);
OLED_WriteCmd(0xAF); // 打开OLED显示
}
// 向OLED写命令
void OLED_WriteCmd(unsigned char cmd)
{
unsigned char i;
OLED_SCL = 0;
OLED_SDA = 0;
OLED_SCL = 1;
OLED_SCL = 0;
OLED_SCL = 0;
OLED_SDA = 0;
OLED_SCL = 1;
OLED_SCL = 0;
OLED_SCL = 0;
OLED_SDA = 1;
OLED_SCL = 1;
OLED_SCL = 0;
for(i = 0; i < 8; i++)
{
OLED_SCL = 0;
OLED_SDA = (cmd & 0x80) >> 7;
OLED_SCL = 1;
OLED_SCL = 0;
cmd <<= 1;
}
}
// 向OLED写数据
void OLED_WriteData(unsigned char dat)
{
unsigned char i;
OLED_SCL = 0;
OLED_SDA = 0;
OLED_SCL = 1;
OLED_SCL = 0;
OLED_SCL = 0;
OLED_SDA = 1;
OLED_SCL = 1;
OLED_SCL = 0;
OLED_SCL = 0;
OLED_SDA = 1;
OLED_SCL = 1;
OLED_SCL = 0;
for(i = 0; i < 8; i++)
{
OLED_SCL = 0;
OLED_SDA = (dat & 0x80) >> 7;
OLED_SCL = 1;
OLED_SCL = 0;
dat <<= 1;
}
}
// 清屏
void OLED_Clear()
{
unsigned char i, j;
for(i = 0; i < 8; i++)
{
OLED_WriteCmd(0xB0 + i); // 设置页地址
OLED_WriteCmd(0x00); // 设置低位列地址
OLED_WriteCmd(0x10); // 设置高位列地址
for(j = 0; j < 128; j++)
{
OLED_WriteData(0x00); // 清空每个像素
}
}
}
// 在指定位置显示一个字符
void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr)
{
unsigned char c = 0, i = 0;
c = chr - 32;
if(x > 120)
{
x = 0;
y++;
}
OLED_WriteCmd(0xB0 + y); // 设置页地址
OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); // 设置高位列地址
OLED_WriteCmd(x & 0x0F); // 设置低位列地址
for(i = 0; i < 8; i++)
{
OLED_WriteData(F6x8[c][i]); // 在指定位置显示一个字符
}
}
// 在指定位置显示一串字符
void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char i = 0;
while(str[i] != '\0')
{
OLED_ShowChar(x, y, str[i]);
x += 8;
i++;
}
}
// 在指定位置显示一个数字
void OLED_ShowNum(unsigned char x, unsigned char y, unsigned int num, unsigned char len)
{
unsigned char t, i;
for(i = 0; i < len; i++)
{
t = (num / pow(10, len - i - 1)) % 10 + '0'; // 将数字转换为字符
OLED_ShowChar(x + i * 8, y, t); // 在指定位置显示一个字符
}
}
```
其中,`OLED_SCL`、`OLED_SDA`、`OLED_RST`分别对应OLED显示屏的时钟、数据和复位引脚。`OLED_Init()`函数用于初始化OLED,`OLED_ShowChar()`、`OLED_ShowString()`和`OLED_ShowNum()`函数用于在OLED上显示字符、字符串和数字,`OLED_Clear()`函数用于清屏。
阅读全文