51单片机与Oled显示屏配合显示简单的图片

我们需要的硬件有单片机,128*64位oled显示屏,杜邦线

具体代码如下

#include "reg52.h"
#include "intrins.h"
sbit scl = P0^1;
sbit sda = P0^3;
void IIC_Start()//IIC初始化
{
scl = 0;
sda = 1;
scl = 1;
_nop_();
sda = 0;
_nop_();
}
void IIC_Stop()//IIC结束
{
scl = 0;
sda = 0;
scl = 1;
_nop_();
sda = 1;
_nop_();
}
char IIC_ACK()//IIC应答
{
char flag;
sda = 1;//就在时钟脉冲9期间释放数据线
_nop_();
scl = 1;
_nop_();
flag = sda;
_nop_();
scl = 0;
_nop_();
return flag;
}
void IIC_Send_Byte(char dataSend)//IIC发送数据
{
int i;
for(i = 0;i<8;i++){
scl = 0;//scl拉低,让sda做好数据准备
sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
_nop_();//发送数据建立时间
scl = 1;//scl拉高开始发送
_nop_();//数据发送时间
scl = 0;//发送完毕拉低
_nop_();//
dataSend = dataSend << 1;
}
}
void Oled_Write_Cmd(char dataCmd)//IIC写命令
{
// 1. start()
IIC_Start();
//
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x00);
// 5. ACK
IIC_ACK();
//6. 写入指令/数据
IIC_Send_Byte(dataCmd);
//7. ACK
IIC_ACK();
//8. STOP
IIC_Stop();
}
void Oled_Write_Data(char dataData)//IIC写数据
{
// 1. start()
IIC_Start();
//
// 2. 写入从机地址 b0111 1000 0x78
IIC_Send_Byte(0x78);
// 3. ACK
IIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
IIC_Send_Byte(0x40);
// 5. ACK
IIC_ACK();
///6. 写入指令/数据
IIC_Send_Byte(dataData);
//7. ACK
IIC_ACK();
//8. STOP
IIC_Stop();
}
void Oled_Init(void)//Oled初始化
{
Oled_Write_Cmd(0xAE);//--display off
Oled_Write_Cmd(0x00);//---set low column address
Oled_Write_Cmd(0x10);//---set high column address
Oled_Write_Cmd(0x40);//--set start line address
Oled_Write_Cmd(0xB0);//--set page address
Oled_Write_Cmd(0x81); // contract control
Oled_Write_Cmd(0xFF);//--128
Oled_Write_Cmd(0xA1);//set segment remap
Oled_Write_Cmd(0xA6);//--normal / reverse
Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
Oled_Write_Cmd(0x3F);//--1/32 duty
Oled_Write_Cmd(0xC8);//Com scan direction
Oled_Write_Cmd(0xD3);//-set display offset
Oled_Write_Cmd(0x00);//
Oled_Write_Cmd(0xD5);//set osc division
Oled_Write_Cmd(0x80);//
Oled_Write_Cmd(0xD8);//set area color mode off
Oled_Write_Cmd(0x05);//
Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
Oled_Write_Cmd(0xF1);//
Oled_Write_Cmd(0xDA);//set com pin configuartion
Oled_Write_Cmd(0x12);//
Oled_Write_Cmd(0xDB);//set Vcomh
Oled_Write_Cmd(0x30);//
Oled_Write_Cmd(0x8D);//set charge pump enable
Oled_Write_Cmd(0x14);//
Oled_Write_Cmd(0xAF);//--turn on oled panel
}
void Oled_Clear()//Oled清屏
{
unsigned char i,j; //-128 --- 127
for(i=0;i<8;i++){
Oled_Write_Cmd(0xB0 + i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//0到127列,依次写入0,每写入数据,列地址自动偏移
for(j = 0;j<128;j++){
Oled_Write_Data(0);
}
}
}
//图片在字模提取软件中对用的oled要点亮的点
code unsigned char bmpImager[]={0xC0,0x40,0x40,0x60,0x60,0x60,0x60,0x60,0x40,0x40,0x40,0xC0,0xC0,0xC0,0xC0,0x80,
0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x30,0x00,0x08,
0x08,0x0C,0x0C,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x02,0x02,0x02,0x06,
0x06,0x06,0x06,0x04,0x0C,0x08,0x58,0x58,0xD0,0xB0,0xB0,0x20,0x20,0x60,0x60,0x40,
0x40,0x40,0x40,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xC0,
0xC0,0xE1,0xE1,0xA1,0xE1,0xE1,0xA3,0xB3,0xB3,0xB3,0xD9,0x98,0x8C,0xCC,0xC6,0xE6,
0xE6,0xE2,0xE3,0xA3,0xE3,0xE3,0xE1,0xA9,0xE9,0xE9,0xE9,0xC1,0xE1,0xE1,0xE1,0xF1,
0xF1,0xF1,0xF3,0xD3,0xD3,0xFA,0xDE,0xF4,0xF0,0x00,0x01,0x01,0x03,0x02,0x06,0x0D,
0x0D,0x18,0x18,0x34,0x34,0x60,0xC0,0xC0,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x02,
0x02,0x02,0x02,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x0C,0x0C,0x0C,0x0C,0x08,0x18,
0x18,0x10,0x30,0x30,0x60,0x60,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1F,0x17,0x13,0x10,0x18,0x1B,0x39,0x38,0x39,0x19,0x0C,0x0D,0x0D,0x05,0x07,0x07,
0x07,0x03,0x03,0x03,0x03,0x00,0x03,0x03,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xF0,0xF8,0x58,
0x5C,0xEC,0xEA,0xEE,0x3B,0xF9,0xF1,0x11,0xE1,0x01,0x19,0x79,0xF9,0xFD,0x39,0x29,
0x0F,0x0F,0x0F,0x0F,0x2F,0x2F,0x2E,0x0C,0x0B,0x0F,0x0E,0x1C,0x78,0xE0,0xC0,0x00,
0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0E,0x3C,0x78,0xE0,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x38,0xF0,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x0D,
0x0D,0x0F,0x0F,0x07,0x07,0x03,0x01,0x03,0x03,0x00,0x00,0x00,0x03,0x7F,0xFE,0xCE,
0xCE,0xCA,0xCA,0xCE,0xCE,0xC2,0xC2,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x05,0xFF,0xFF,
0xE0,0x07,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x0F,
0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x0D,0x0C,0x08,0x00,0x00,0x30,
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,
0x40,0xC0,0xC0,0xC0,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xF7,0xFF,0x1F,
0x17,0x17,0x35,0x35,0x35,0x35,0x35,0x3D,0x3D,0x3D,0x3D,0x3D,0x38,0x08,0xFD,0xFF,
0xFF,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0B,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,
0xC3,0x43,0x43,0x42,0x06,0xC6,0xC4,0xCC,0xCC,0xD8,0xD8,0xD8,0xF0,0xB0,0xB0,0xA0,
0xE0,0xE0,0xE0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x80,
0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x0C,0x1E,0x3F,0x7D,
0x6D,0x6F,0xEF,0xED,0xEB,0x7F,0x1E,0x13,0x5E,0x40,0x70,0x70,0xF8,0xEF,0xEB,0xEA,
0xEE,0xEE,0xEC,0xEC,0xEC,0xEC,0xEC,0xE4,0x84,0x84,0x04,0x80,0xC0,0x78,0x3F,0x0F,
0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x40,0x60,0x30,0x18,0x0C,0x07,0x03,0x00,
0xC0,0x80,0x00,0x80,0x80,0x40,0x80,0x80,0x80,0x00,0x01,0x01,0x00,0x00,0x00,0x33,
0x33,0x13,0x17,0x1E,0x1E,0x1B,0x1B,0x0B,0x0B,0x1F,0xF3,0xC3,0x87,0x05,0x0D,0x0F,
0x0B,0x0B,0x1B,0x1F,0x1E,0x1F,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
0x16,0x16,0x16,0x16,0x16,0x16,0x1E,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,
0x83,0x83,0xC1,0x41,0x61,0xE1,0xB0,0xD0,0x58,0x2E,0xB7,0x9B,0x09,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,
0x20,0x30,0x30,0x30,0x00,0x10,0x10,0x10,0x10,0x18,0x08,0x08,0x08,0x08,0x0C,0x06,
0x06,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x06,
0x04,0x0C,0x0C,0x18,0x18,0x10,0x10,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1E,0x0A,0x0A,0x0F,0x05,0x05,
0x07,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

void Oled_Huatu(unsigned char *image)//点亮显示图片需要的点
{
  unsigned char i;
    //-128 --- 127
    unsigned int j;//不用unsigned char,因为该类型最大值是255,而最大j要等于128*64-1,故用unsigned int
for(i=0;i<8;i++)
    {
Oled_Write_Cmd(0xB0 + i);//page0--page7
//每个page从0列
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
//0到127列,依次写入0,每写入数据,列地址自动偏移
for(j = 128*i;j<(128*(i+1));j++)
{
 Oled_Write_Data(image[j]);
}
}
}

void main()
{

//1. OLED初始化
Oled_Init();
//2. 选择一个位置
//2.1 确认页寻址模式
Oled_Write_Cmd(0x20);
Oled_Write_Cmd(0x02);// 确认页寻址模式为页地址模式
Oled_Clear();//清除oled原来存储的数据
Oled_Huatu(bmpImager);//点亮显示图片

while(1);//不断执行,不断
}

首先我要说的是照片的处理

打开我们电脑自带的“画图”,将照片复制到“图画”,点击“重新调整大小”,选择“像素”,水平输入128,数值输入64, 不要勾选“保持纵横比”,点击确定。(图片越简单越好,最好是简笔画)

接着按住ctrl+s,保存图片,选择“256单色位图”,(图片有可能会模糊,但是没事),我保存在桌面

打开 字模提取 软件,点击   基本操作,选择我们刚刚保存的图片

点击  取模方式,选择c51格式,数组code unsigned char bmpImager[]就来自这里,将这些数据复制给数组。

最后将程序烧录给单片机就行。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值