帮我写一个51单片机OLED显示屏代码
时间: 2023-08-20 12:30:37 浏览: 43
好的,以下是一个简单的51单片机OLED显示屏代码:
```
#include<reg52.h>
sbit SCLK = P1^0; //时钟线
sbit SDIN = P1^1; //数据线
sbit DC = P1^2; //数据/命令控制线
sbit RES = P1^3; //复位控制线
void OLED_Init(void); //OLED初始化
void OLED_Write_Cmd(unsigned char CMD); //写命令
void OLED_Write_Data(unsigned char DATA);//写数据
void OLED_Set_Pos(unsigned char x, unsigned char y);//设置坐标
void OLED_Clear(void);//清屏
void OLED_Show_String(unsigned char x, unsigned char y, unsigned char *str);//显示字符串
void delay_ms(unsigned int ms);//延时函数
void main()
{
OLED_Init(); //初始化OLED
OLED_Clear(); //清屏
OLED_Show_String(0,0,"Hello, World!"); //显示字符串
while(1);
}
//OLED初始化
void OLED_Init(void)
{
RES = 0;
delay_ms(200);
RES = 1;
delay_ms(200);
OLED_Write_Cmd(0xAE); //关闭OLED显示
OLED_Write_Cmd(0x00); //设置列地址低位
OLED_Write_Cmd(0x10); //设置列地址高位
OLED_Write_Cmd(0x40); //设置起始行地址
OLED_Write_Cmd(0x81); //设置对比度
OLED_Write_Cmd(0xCF); //对比度调节
OLED_Write_Cmd(0xA1); //设置段重定向
OLED_Write_Cmd(0xC8); //设置COM扫描方向
OLED_Write_Cmd(0xA6); //正常显示
OLED_Write_Cmd(0xA8); //设置多路复用比
OLED_Write_Cmd(0x3F); //设置多路复用比
OLED_Write_Cmd(0xD3); //设置显示偏移
OLED_Write_Cmd(0x00); //设置显示偏移
OLED_Write_Cmd(0xd5); //设置显示时钟分频
OLED_Write_Cmd(0x80); //设置显示时钟分频
OLED_Write_Cmd(0xD9); //设置Pre-charge
OLED_Write_Cmd(0xF1); //设置Pre-charge
OLED_Write_Cmd(0xDA); //设置COM硬件引脚配置
OLED_Write_Cmd(0x12); //设置COM硬件引脚配置
OLED_Write_Cmd(0xDB); //设置Vcomh
OLED_Write_Cmd(0x40); //设置Vcomh
OLED_Write_Cmd(0x8D); //设置电源
OLED_Write_Cmd(0x14); //设置电源
OLED_Write_Cmd(0xAF); //开启OLED显示
}
//写命令
void OLED_Write_Cmd(unsigned char CMD)
{
DC = 0; //设置为命令模式
SCLK = 0;
for(int i=0; i<8; i++)
{
SDIN = CMD & 0x80;
CMD <<= 1;
SCLK = 1;
SCLK = 0;
}
}
//写数据
void OLED_Write_Data(unsigned char DATA)
{
DC = 1; //设置为数据模式
SCLK = 0;
for(int i=0; i<8; i++)
{
SDIN = DATA & 0x80;
DATA <<= 1;
SCLK = 1;
SCLK = 0;
}
}
//设置坐标
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_Write_Cmd(0xb0 + y); //设置页地址
OLED_Write_Cmd(((x & 0xf0) >> 4) | 0x10); //设置列地址高4位
OLED_Write_Cmd(x & 0x0f); //设置列地址低4位
}
//清屏
void OLED_Clear(void)
{
for(int i=0; i<8; i++)
{
OLED_Write_Cmd(0xb0 + i); //设置页地址
OLED_Write_Cmd(0x00); //设置列地址低位
OLED_Write_Cmd(0x10); //设置列地址高位
for(int j=0; j<128; j++)
{
OLED_Write_Data(0x00); //清空一行数据
}
}
}
//显示字符串
void OLED_Show_String(unsigned char x, unsigned char y, unsigned char *str)
{
OLED_Set_Pos(x,y);
while(*str != '\0')
{
for(int i=0; i<6; i++)
{
OLED_Write_Data(font[*str - 32][i]); //显示一个字符
}
str++;
}
}
//延时函数
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=0; i<ms; i++)
{
for(j=0; j<114; j++);
}
}
```
注意:在上述代码中,字库的引用使用了一个名为 `font` 的数组,这个数组中存储的是 ASCII 码表中的字符的点阵数据。具体的字库点阵数据可以在网上搜索到。