OLED+STC89C52
时间: 2023-11-25 09:51:55 浏览: 93
为了在STC89C52单片机上使用OLED显示屏,需要使用IIC总线协议进行通信。以下是使用C51_IIC例程的OLED程序例程,可以作为学习和参考的样本:
```c
#include <reg52.h>
#include <intrins.h>
#define OLED_SCL P2_1
#define OLED_SDA P2_0
sbit OLED_RST = P2^2;
sbit OLED_DC = P2^3;
sbit OLED_CS = P2^4;
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 114; j++);
}
void OLED_WrDat(unsigned char dat)
{
unsigned char i;
OLED_DC = 1;
for (i = 0; i < 8; i++)
{
OLED_SCL = 0;
if (dat & 0x80)
OLED_SDA = 1;
else
OLED_SDA = 0;
OLED_SCL = 1;
dat <<= 1;
}
}
void OLED_WrCmd(unsigned char cmd)
{
unsigned char i;
OLED_DC = 0;
for (i = 0; i < 8; i++)
{
OLED_SCL = 0;
if (cmd & 0x80)
OLED_SDA = 1;
else
OLED_SDA = 0;
OLED_SCL = 1;
cmd <<= 1;
}
}
void OLED_SetPos(unsigned char x, unsigned char y)
{
OLED_WrCmd(0xb0 + y);
OLED_WrCmd(((x & 0xf0) >> 4) | 0x10);
OLED_WrCmd(x & 0x0f);
}
void OLED_Fill(unsigned char bmp_dat)
{
unsigned char y, x;
for (y = 0; y < 8; y++)
{
OLED_WrCmd(0xb0 + y);
for (x = 0; x < 128; x++)
OLED_WrDat(bmp_dat);
}
}
void OLED_CLS(void)
{
unsigned char y, x;
for (y = 0; y < 8; y++)
{
OLED_WrCmd(0xb0 + y);
for (x = 0; x < 128; x++)
OLED_WrDat(0);
}
}
void OLED_Init(void)
{
OLED_RST = 0;
delay_ms(50);
OLED_RST = 1;
OLED_CS = 0;
OLED_WrCmd(0xae);
OLED_WrCmd(0x00);
OLED_WrCmd(0x10);
OLED_WrCmd(0x40);
OLED_WrCmd(0x81);
OLED_WrCmd(0xcf);
OLED_WrCmd(0xa1);
OLED_WrCmd(0xc8);
OLED_WrCmd(0xa6);
OLED_WrCmd(0xa8);
OLED_WrCmd(0x3f);
OLED_WrCmd(0xd3);
OLED_WrCmd(0x00);
OLED_WrCmd(0xd5);
OLED_WrCmd(0x80);
OLED_WrCmd(0xd9);
OLED_WrCmd(0xf1);
OLED_WrCmd(0xda);
OLED_WrCmd(0x12);
OLED_WrCmd(0xdb);
OLED_WrCmd(0x40);
OLED_WrCmd(0x20);
OLED_WrCmd(0x02);
OLED_WrCmd(0x8d);
OLED_WrCmd(0x14);
OLED_WrCmd(0xa4);
OLED_WrCmd(0xa6);
OLED_WrCmd(0xaf);
OLED_CS = 1;
OLED_CLS();
}
void main()
{
OLED_Init();
OLED_Fill(0xff);
delay_ms(1000);
OLED_CLS();
OLED_SetPos(0, 0);
OLED_WrDat('H');
OLED_WrDat('e');
OLED_WrDat('l');
OLED_WrDat('l');
OLED_WrDat('o');
while (1);
}
```