OLED写入指令和数据

1.如何驱动OLED屏幕显示内容?

        三个点

        

1.1OLED通信协议

        

2.1 SSD1306

        

        

写命令/数据的代码
 

/
*
1. start()
2. 写入 b0111 1000 0x78
3. ACK
4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
5. ACK
6. 写入指令/数据
7. ACK
8. STOP
*/
void Oled_Write_Cmd(char dataCmd)5.1.4 OLED的寻址模式
如何显示一个点?
有三种,分别位页地址模式,水平地址模式和垂直地址模式,可以通过一下表格进行配置
内存管理
{
    // 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)
{
    // 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(dataData);
    //7. ACK
    IIC_ACK();
    //8. STOP
    IIC_Stop();
}

2.OLED的寻址模式

        如何显示一个点?

有三种,分别位页地址模式,水平地址模式和垂直地址模式,可以通过一下表格进行配置内存管理

        页寻址模式

        GDDRAM

        横向8横,纵向128列

#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start()
{
	scl = 0; //防止雪花
	sda = 1;
	scl = 1;
	_nop_(); //耗时5个微妙
	sda = 0;
	_nop_();
}
 
void IIC_Stop()
{
	scl = 0; //防止雪花
	sda = 0;
	scl = 1;
	_nop_(); //耗时5个微妙
	sda = 1;
	_nop_();
}

char IIC_ACK()
{
	char flag;
	
	sda = 1;   //就在时钟脉冲9期间释放数据线
	_nop_();
	scl = 1;
	_nop_();
	flag = sda;
	_nop_();
	scl = 0;
	_nop_();
	
	return flag;

}

void IIC_Send_Byte(char dataSend) //发送一个字节
{
	int i;
	for(i = 0 ;i<8;i++)
	{
		scl = 0;//scl 拉低,让sda做好数据准备
		sda = dataSend & 0x80;       // 1000 0000 获得datasend的最高位
		
		_nop_(); //发送数据建立的时间
		scl = 1;//scl拉高开始发送
		_nop_(); //数据发送时间
		
		scl = 0; // 发送完毕拉低
		_nop_();//
		
		dataSend = dataSend <<1;
	}
}

void Oled_Write_Cmd(char dataCmd)
{
	//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)
{
	//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_Stop();
		//6.写入指令/数据
	IIC_Send_Byte(dataData);
	//7.ACK
	IIC_ACK();
	//8.STOP
	IIC_Stop();
}


//oled初始函数
 void Oled_Init(void){
		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()
{
	unsigned char i,j;
	for(i = 0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);	//page0 -- page7
		//每个page从第0列开始
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		//每个page从0列到127列,依次写入0,每写入数据,列地址自动偏移
		for(j = 0;j<128;j++)
		{
			Oled_Write_Data(0);
		}
	}
		
}

void main()
{
	
	int a = 10;
	
	//1.Oled初始化
	Oled_Init();
	//2.选择一个位置
	//2.1选择页寻址模式
	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);
	Oled_Clear();
	//2.2选择PAGE0   1011 0000   0xB0
	Oled_Write_Cmd(0xB0);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	//3.显示一个点
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	
	Oled_Write_Cmd(0xB5);
	Oled_Write_Cmd(0x00);
	Oled_Write_Cmd(0x10);
	
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	Oled_Write_Data(0x08);
	
	
	Oled_Write_Cmd(0xB0);
	Oled_Write_Cmd(0x0f);
	Oled_Write_Cmd(0x17);
	Oled_Write_Data(0x08);
	
	while(1); //程序不能退出
}

OLED显示一行字

        

思路:1.防止雪花bug

                2.    Oled_Write_Cmd(0xB0);  //page0开始
                       Oled_Write_Cmd(0x00);  //从第0列开始
                       Oled_Write_Cmd(0x10);

                        后面等同

#include "reg52.h"
#include "intrins.h"

sbit scl = P0^1;
sbit sda = P0^3;

void IIC_Start()
{
	scl = 0; //防止雪花
	sda = 1;
	scl = 1;
	_nop_(); //耗时5个微妙
	sda = 0;
	_nop_();
}
 
void IIC_Stop()
{
	scl = 0; //防止雪花
	sda = 0;
	scl = 1;
	_nop_(); //耗时5个微妙
	sda = 1;
	_nop_();
}

char IIC_ACK()
{
	char flag;
	
	sda = 1;   //就在时钟脉冲9期间释放数据线
	_nop_();
	scl = 1;
	_nop_();
	flag = sda;
	_nop_();
	scl = 0;
	_nop_();
	
	return flag;

}

void IIC_Send_Byte(char dataSend) //发送一个字节
{
	int i;
	for(i = 0 ;i<8;i++)
	{
		scl = 0;//scl 拉低,让sda做好数据准备
		sda = dataSend & 0x80;       // 1000 0000 获得datasend的最高位
		
		_nop_(); //发送数据建立的时间
		scl = 1;//scl拉高开始发送
		_nop_(); //数据发送时间
		
		scl = 0; // 发送完毕拉低
		_nop_();//
		
		dataSend = dataSend <<1;
	}
}

void Oled_Write_Cmd(char dataCmd)
{
	//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)
{
	//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_Stop();
		//6.写入指令/数据
	IIC_Send_Byte(dataData);
	//7.ACK
	IIC_ACK();
	//8.STOP
	IIC_Stop();
}



 void Oled_Init(void){
		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()
{
	unsigned char i,j;
	for(i = 0;i<8;i++)
	{
		Oled_Write_Cmd(0xB0 + i);	//page0 -- page7
		//每个page从第0列开始
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		//每个page从0列到127列,依次写入0,每写入数据,列地址自动偏移
		for(j = 0;j<128;j++)
		{
			Oled_Write_Data(0);
		}
	}
		
}


/*--  文字:  爱  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char a1[16] = {0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00};
code char a2[16] = {0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00};

/*--  文字:  我  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char w1[16] = {0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00};
code char w2[16] = {0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00};

/*--  文字:  的  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char d1[16] = {0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00};
code char d2[16] = {0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00};

/*--  文字:  宝  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char b1[16] = {0x10,0x4C,0x44,0x44,0x44,0x44,0x45,0xC6,0x44,0x44,0x44,0x44,0x44,0x54,0x0C,0x00};
code char b2[16] = {0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x54,0x64,0x44,0x40,0x40,0x00};

/*--  文字:  贝  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char bb1[16] = {0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0xE2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00};
code char bb2[16] = {0x00,0x00,0x80,0x47,0x20,0x10,0x0C,0x03,0x08,0x10,0x20,0x47,0x80,0x00,0x00,0x00};

/*--  文字:  猪  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
code char z1[16] = {0x22,0x14,0x08,0xF4,0x02,0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0x00};
code char z2[16] = {0x44,0x82,0x41,0x3F,0x00,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00};


void main()
{
	
	unsigned char i;
	
	//1.Oled初始化
	Oled_Init();
	//2.选择一个位置
	//2.1选择页寻址模式
	Oled_Write_Cmd(0x20);
	Oled_Write_Cmd(0x02);
	Oled_Clear();
	//2.2选择PAGE0   1011 0000   0xB0
	Oled_Write_Cmd(0xB0);  //page0
	Oled_Write_Cmd(0x00);  //从第0列开始
	Oled_Write_Cmd(0x10);
	
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(a1[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(w1[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(d1[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(b1[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(bb1[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(z1[i]);
		}
	
		
	Oled_Write_Cmd(0xB1);  //page1
	Oled_Write_Cmd(0x00);  //从第0列开始
	Oled_Write_Cmd(0x10);
	
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(a2[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(w2[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(d2[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(b2[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(bb2[i]);
		}
	for(i = 0; i<16;i++)
		{
			Oled_Write_Data(z2[i]);
		}
	while(1); //程序不能退出
}

Pin Number Symbol I/O Function P Po o we er r S Su up pp pl ly y 9 VDD P P Po o we er r S Su up pp pl ly y f fo or r L Lo og gi ic c This is a voltage supply pin. It must be connected to external source. 8 VSS P G Gr ro ou un nd d o of f L Lo og gi ic c C Ci ir rc cu ui it t This is a ground pin. It acts as a reference for the logic pins. It must be connected to external ground. 28 VCC P P Po o we er r S Su up pp pl ly y f fo or r OE EL L P Pa an ne el l This is the most positive voltage supply pin of the chip. A stabilization capacitor should be connected between this pin and V SS when the converter is used. It must be connected to external source when the converter is not used. 29 VLSS P G Gr ro ou un nd d o of f A An na al lo og g C Ci ir rc cu ui it t This is an analog ground pin. It should be connected to V SS externally. D Dr ri iv ve er r 26 IREF I C Cu ur rr re en nt t R Re ef fe er re en nc ce e f fo or r B Br ri ig gh ht tn ne es ss s A Ad dj ju us st t me en nt t This pin is segment current reference pin. A resistor should be connected between this pin and V SS . Set the current at 12.5μA maximum. 27 VCOMH O V Vo ol lt ta ag ge e Ou ut tp pu ut t Hi ig gh h L Le ev ve el l f fo or r C C O M S Si ig gn na al l This pin is the input pin for the voltage output high level for COM signals. A capacitor should be connected between this pin and V SS . D DC C/ /D DC C C Co on nv ve er rt te er r 6 VDDB P P Po o we er r S Su up pp pl ly y f fo or r DC C/ / DC C C Co on nv ve er rt te er r C Ci ir rc cu ui it t This is the power supply pin for the internal buffer of the DC/DC voltage converter. It must be connected to external source when the converter is used. It should be connected to V DD when the converter is not used. 4 / 5 2 / 3 C1P / C1N C2P / C2N I P Po os si it ti iv ve e T Te er r mi in na al l o of f t th he e F Fl ly yi in ng g I In nv ve er rt ti in ng g C Ca ap pa ac ci it to or r Ne eg ga at ti iv ve e T Te er r mi in na al l o of f t th he e F Fl ly yi in ng g B Bo oo os st t C Ca ap pa ac ci it to or r The charge-pump capacitors are required between the terminals. They must be floated when the converter is not used. I In nt te er rf fa ac ce e 10 11 12 BS0 BS1 BS2 I C Co o m mu un ni ic ca at ti in ng g P Pr ro ot to oc co ol l S Se el le ec ct t These pins are MCU interface selection input. See the following table: BS0 BS1 BS2 I 2 C 0 1 0 3-wire SPI 1 0 0 4-wire SPI 0 0 0 8-bit 68XX Parallel 0 0 1 8-bit 80XX Parallel 0 1 1 14 RES# I P Po o we er r R Re es se et t f fo or r C Co on nt tr ro ol ll le er r a an nd d Dr ri iv ve er r This pin is reset signal input. When the pin is low, initialization of the chip is executed. Keep this pin pull high during normal operation. 13 CS# I C Ch hi ip p S Se el le ec ct t This pin is the chip select input. The chip is enabled for MCU communication only when CS# is pulled low. 15 D/C# I Da at ta a/ /C Co o m ma an nd d C Co on nt tr ro ol l This pin is Data/Command control pin. When the pin is pulled high, the input at D7~D0 is treated as display data. When the pin is pulled low, the input at D7~D0 will be transferred to the command register. When the pin is pulled high and serial interface mode is selected, the data at SDIN will be interpreted as data. When it is pulled low, the data at SDIN will be transferred to the command register. In I 2 C mode, this pin acts as SA0 for slave address selection. For detail relationship to MCU interface signals, please refer to the Timing Characteristics Diagrams. 17 E/RD# I R Re ea ad d/ / Wr ri it te e E En na ab bl le e o or r R Re ea ad d This pin is MCU interface input. When interfacing to a 68XX-series microprocessor, this pin will be used as the Enable (E) signal. Read/write operation is initiated when this pin is pulled high and the CS# is pulled low. When connecting to an 80XX-microprocessor, this pin receives the Read (RD#) signal. Data read operation is initiated when this pin is pulled low and CS# is pulled low. When serial or I 2 C mode is selected, this pin must be connected to V SS . GoldenMorning Electronic 4 1.5 Pin Definition (Continued) Pin Number Symbol I/O Function I In nt te er rf fa ac ce e ( (C Co on nt ti in nu ue ed d) ) 16 R/W# I R Re ea ad d/ / Wr ri it te e S Se el le ec ct t o or r Wr ri it te e This pin is MCU interface input. When interfacing to a 68XX-series microprocessor, this pin will be used as Read/Write (R/W#) selection input. Pull this pin to “High” for read mode and pull it to “Low” for write mode. When 80XX interface mode is selected, this pin will be the Write (WR#) input. Data write operation is initiated when this pin is pulled low and the CS# is pulled low. When serial or I 2 C mode is selected, this pin must be connected to V SS . 18~25 D0~D7 I/O Ho os st t Da at ta a I In np pu ut t/ / Ou ut tp pu ut t B Bu us s These pins are 8-bit bi-directional data bus to be connected to the microprocessor’s data bus. When serial mode is selected, D1 will be the serial data input SDIN and D0 will be the serial clock input SCLK. When I 2 C mode is selected, D2 & D1 should be tired together and serve as SDA out & SDA in in application and D0 is the serial clock input SCL. Unused pins must be connected to V SS except for D2 in serial mode. R Re es se er rv ve e 7 N.C. - R Re es se er rv ve ed d P Pi in n The N.C. pin between function pins are reserved for compatible and flexible design. 1, 30 N.C. (GND) - R Re es se er rv ve ed d P Pi in n ( (S Su up pp po or rt ti in ng g P Pi in n) ) The supporting pins can reduce the influences from stresses on the function pins. These pins must be connected to external ground as the ESD protection circuit.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值