树莓派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 屏幕(附完整可运行代码)的主要内容,如果未能解决你的问题,请参考以下文章

树莓派3B安装rtandroid屏幕左边是黑屏,请高手指教

树莓派3B+首次登陆通过网络

RaspberryPI树莓派3B使用帮助

将树莓派3B+变成WiFi热点

树莓派连接电脑显示屏

树莓派使用 OLED 屏显示图片及文字