树莓派3B+使用0.96 oled 屏幕(附完整可运行代码)
Posted 唯_ww
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派3B+使用0.96 oled 屏幕(附完整可运行代码)相关的知识,希望对你有一定的参考价值。
树莓派3B+使用 0.96寸oled 屏幕(附完整可运行代码)
一、基本配置
先阅读以下博客较为详解,完成基本配置以及相关代码的说明
0.96寸OLED 使用树莓派的I2C协议调用wiringPiI2c驱动
二、代码
以上博客的代码中包括头文件、全局变量等没有写出来 ,故我对其进行了优化,以下代码可以直接在树莓派上运行,可对照着以上博客进行学习
代码实现的功能为清屏、全屏填充
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include<termios.h>
#include<string.h>
#include<sys/time.h>
#include<time.h>
#include<sys/types.h>
#include<errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <wiringPiI2C.h>
#include <unistd.h>
unsigned char i2cHand;
unsigned char DataBuffer[7][127];
void WriteCmd(int fd,unsigned char I2C_Command)//写命令
wiringPiI2CWriteReg8(fd,0x00, I2C_Command);
void OLED_Init(int fd)
WriteCmd(fd,0xAE); //display off
WriteCmd(fd, 0x20); //Set Memory Addressing Mode
WriteCmd(fd, 0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
WriteCmd(fd, 0xb0); //Set Page Start Address for Page Addressing Mode,0-7
WriteCmd(fd, 0xc8); //Set COM Output Scan Direction
WriteCmd(fd, 0x00); //---set low column address
WriteCmd(fd, 0x10); //---set high column address
WriteCmd(fd, 0x40); //--set start line address
WriteCmd(fd, 0x81); //--set contrast control register
WriteCmd(fd, 0xff); //亮度调节 0x00~0xff
WriteCmd(fd, 0xa1); //--set segment re-map 0 to 127
WriteCmd(fd, 0xa6); //--set normal display
WriteCmd(fd, 0xa8); //--set multiplex ratio(1 to 64)
WriteCmd(fd, 0x3F); //
WriteCmd(fd, 0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
WriteCmd(fd, 0xd3); //-set display offset
WriteCmd(fd, 0x00); //-not offset
WriteCmd(fd, 0xd5); //--set display clock divide ratio/oscillator frequency
WriteCmd(fd, 0xf0); //--set divide ratio
WriteCmd(fd, 0xd9); //--set pre-charge period
WriteCmd(fd, 0x22); //
WriteCmd(fd, 0xda); //--set com pins hardware configuration
WriteCmd(fd, 0x12);
WriteCmd(fd, 0xdb); //--set vcomh
WriteCmd(fd, 0x20); //0x20,0.77xVcc
WriteCmd(fd, 0x8d); //--set DC-DC enable
WriteCmd(fd, 0x14); //
WriteCmd(fd, 0xaf); //--turn on oled panel
void WriteData(int fd,unsigned char I2C_Data)//写数据
wiringPiI2CWriteReg8(fd,0x40, I2C_Data);
void OLED_SetPos(int fd,unsigned char x, unsigned char y) //设置起始点坐标
WriteCmd(fd, (unsigned char)(0xb0 + x));
WriteCmd(fd,((y & 0x0f) | 0x00));//LOW
WriteCmd(fd,(((y & 0xf0) >> 4) | 0x10));//HIGHT
/*写 缓存数据*/
void Write_DataBuffer()//这个是将DataBuffer数组里面的值,全部写进屏里去
unsigned char i, j;
for (i = 0; i < 8; i++)
OLED_SetPos(i2cHand, i, 0); //设置起始点坐标
for (j = 0; j < 128; j++)
WriteData(i2cHand, DataBuffer[i][j]);//写数据
void OLED_Fill(void)//全屏填充
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 128; j++)
DataBuffer[i][j] = 0xff;
Write_DataBuffer();
void OLED_CLS(void)//清屏
unsigned char i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 128; j++)
DataBuffer[i][j] = 0x00;
Write_DataBuffer();
int main(void)
delay(1000); // 毫秒
wiringPiSetupSys();
i2cHand=wiringPiI2CSetup(0x3c); /*加载i2c设备*/
OLED_Init(i2cHand);
while (true)
OLED_Fill();
delay(1000);
OLED_CLS();
delay(1000); // 毫秒
return 0;
三、树莓派上运行
输入以下两行命令
实物图结果如下
四、补充显示数据
在display.c代码中修使用ascii()函数可以显示数据
display.c
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include<termios.h>
#include<string.h>
#include<sys/time.h>
#include<time.h>
#include<sys/types.h>
#include<errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <wiringPiI2C.h>
#include <unistd.h>
int fd; //截至
unsigned char yi[16]="Angle of beam:";
unsigned char er[16]="ming";
unsigned char san[16]="Distance:";
unsigned char si[16]="okok";//显示内容
const unsigned char zi[];
void init(void)//初始化
wiringPiSetup();
fd=wiringPiI2CSetup(0x3c);//i2c初始化
wiringPiI2CWriteReg8(fd,0x00,0xa1);//图像反了修改成0xa0
wiringPiI2CWriteReg8(fd,0x00,0xc8);//行输出反了修改成0xc0
wiringPiI2CWriteReg8(fd,0x00,0x8d);//允许电荷泵
wiringPiI2CWriteReg8(fd,0x00,0x14);
wiringPiI2CWriteReg8(fd,0x00,0xa6);//想反相显示改成0xa7
wiringPiI2CWriteReg8(fd,0x00,0xaf);//开显示
void qingping(void)//清屏
char zt1,zt2;
for(zt1=0;zt1<8;zt1++)
wiringPiI2CWriteReg8(fd,0x00,0xb0+zt1);
for(zt2=0;zt2<128;zt2++) wiringPiI2CWriteReg8(fd,0x40,0x00);
void ascii(float Angle,float distance)//显示ASCII码8*16
sprintf(er,"%f",Angle); // float 到 char
sprintf(si,"%f",distance); // double 到 char
int zt;
char zt3,zt4;
for(zt3=0;zt3<4;zt3++)
wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3*2));
for(zt4=0;zt4<16;zt4++)
for(zt=0;zt<8;zt++)
if(zt3==0) wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt4]*16+zt]);
else if(zt3==1) wiringPiI2CWriteReg8(fd,0x40,zi[er[zt4]*16+zt]);
else if(zt3==2) wiringPiI2CWriteReg8(fd,0x40,zi[san[zt4]*16+zt]);
else if(zt3==3) wiringPiI2CWriteReg8(fd,0x40,zi[si[zt4]*16+zt]);
wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3*2)+1);
for(zt4=0;zt4<16;zt4++)
for(zt=0;zt<8;zt++)
if(zt3==0) wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt4]*16+zt+8]);
else if(zt3==1) wiringPiI2CWriteReg8(fd,0x40,zi[er[zt4]*16+zt+8]);
else if(zt3==2) wiringPiI2CWriteReg8(fd,0x40,zi[san[zt4]*16+zt+8]);
else if(zt3==3) wiringPiI2CWriteReg8(fd,0x40,zi[si[zt4]*16+zt+8]);
int main(void)
float Angle = 2.98754546;
float distance = 5.754644545;
init();
delay(10);
qingping();
while(1)
ascii(Angle,distance);
delay(10);
const unsigned char zi[] =
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//2
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//3
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//4
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//6
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//8
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//9
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0以上是关于树莓派3B+使用0.96 oled 屏幕(附完整可运行代码)的主要内容,如果未能解决你的问题,请参考以下文章