0.96寸oled显示屏4针51单片机的程序
时间: 2023-09-09 11:10:24 浏览: 167
0.96 OLED四针I2C显示程序_oled4针_oled_stm32_0.96OLEDI2CSTM32_IIC_
5星 · 资源好评率100%
以下是一个使用51单片机控制0.96寸OLED显示屏的简单程序,需要使用4针OLED连接方式。
```c
#include <reg52.h>
#define SCL P1_0 //时钟线
#define SDA P1_1 //数据线
void delay(unsigned int t) //延时函数
{
while (t--)
{
int i = 1000;
while (i--);
}
}
void IIC_Start() //起始信号
{
SDA = 1;
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
}
void IIC_Stop() //结束信号
{
SDA = 0;
SCL = 1;
delay(1);
SDA = 1;
delay(1);
}
void Write_IIC_Byte(unsigned char dat) //写数据
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
SCL = 1;
delay(1);
SCL = 0;
dat <<= 1;
}
}
void OLED_WriteCmd(unsigned char cmd) //写指令
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x00);
Write_IIC_Byte(cmd);
IIC_Stop();
}
void OLED_WriteDat(unsigned char dat) //写数据
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40);
Write_IIC_Byte(dat);
IIC_Stop();
}
void OLED_Init() //OLED初始化
{
OLED_WriteCmd(0xAE); //关闭显示
OLED_WriteCmd(0x20); //设置内存地址模式
OLED_WriteCmd(0x02); //设置内存地址模式为页地址模式
OLED_WriteCmd(0x8D); //开启电荷泵
OLED_WriteCmd(0x14); //设置电荷泵倍数
OLED_WriteCmd(0xA1); //设置段重映射
OLED_WriteCmd(0xC8); //设置行重映射
OLED_WriteCmd(0xDA); //设置COM硬件配置
OLED_WriteCmd(0x12); //设置COM硬件配置
OLED_WriteCmd(0x81); //设置对比度
OLED_WriteCmd(0xCF); //设置对比度
OLED_WriteCmd(0xD9); //设置预充电周期
OLED_WriteCmd(0xF1); //设置预充电周期
OLED_WriteCmd(0xDB); //设置VCOMH
OLED_WriteCmd(0x40); //设置VCOMH
OLED_WriteCmd(0xA4); //设置显示全部点亮
OLED_WriteCmd(0xA6); //设置正常显示
OLED_WriteCmd(0xAF); //开启显示
}
void OLED_Clear() //清屏
{
unsigned char i, j;
for (i = 0; i < 8; i++)
{
OLED_WriteCmd(0xb0 + i); //设置页地址
OLED_WriteCmd(0x00); //设置列地址低4位
OLED_WriteCmd(0x10); //设置列地址高4位
for (j = 0; j < 128; j++)
{
OLED_WriteDat(0); //清空该页的所有像素点
}
}
}
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_ShowChar(unsigned char x, unsigned char y, unsigned char chr) //显示字符
{
unsigned char i = 0;
unsigned char j = 0;
chr = chr - 32;
OLED_WriteCmd(0xb0 + y); //设置页地址
OLED_WriteCmd(((x & 0xf0) >> 4) | 0x10); //设置列地址高4位
OLED_WriteCmd(x & 0x0f); //设置列地址低4位
for (i = 0; i < 8; i++)
{
OLED_WriteDat(F8X16[chr * 16 + i]); //写入字符的上半部分
}
OLED_WriteCmd(0xb0 + y + 1); //设置页地址
OLED_WriteCmd(((x & 0xf0) >> 4) | 0x10); //设置列地址高4位
OLED_WriteCmd(x & 0x0f); //设置列地址低4位
for (i = 0; i < 8; i++)
{
OLED_WriteDat(F8X16[chr * 16 + i + 8]); //写入字符的下半部分
}
}
void main()
{
OLED_Init(); //OLED初始化
OLED_Clear(); //清屏
OLED_ShowString(0, 0, "Hello, world!"); //显示字符串
while (1);
}
```
需要注意的是,以上程序中使用了一个字库数组 `F8X16`,需要在程序中定义该数组或者从外部调用该数组。该字库数组中包含了ASCII码字符的点阵数据,可以用于在OLED屏幕上显示字符。
阅读全文