|
SSD1309 2.42寸OLED驱动程序
可显示变化,框架式编程。
有需要用的着拿去。不谢!!
全部工程在附件里就不贴出来了。有字库头文件的。
#include "all.h"
u8 xdata OLED_Write_Buffer[8][8][16];//汉字数组
sbit reset=P2^6;
//sbit scl=P2^4;
//sbit sda=P2^5;
void OLED_Write_com(u8 com)//写指令
{
IIC_start();
IIC_Write_Byte(0x78); //DC=0; RW=0 选择SLAVE ADDRESS
IIC_Read_Ack();
IIC_Write_Byte(0x00);
IIC_Read_Ack();
IIC_Write_Byte(com);
IIC_Read_Ack();
delay(1);
IIC_stop();
}
//写数据到OLED显示模块
void transfer_data(u8 dat)
{
IIC_start();
IIC_Write_Byte(0x78); //DC=0; RW=0 选择SLAVE ADDRESS
IIC_Read_Ack();
IIC_Write_Byte(0x40);
IIC_Read_Ack();
IIC_Write_Byte(dat);
IIC_Read_Ack();
IIC_stop();
}
void lcd_address(u8 page,u8 column)
{
column=column-1; //我们平常所说的第1列,在LCD驱动IC里是第0列。所以在这里减去1.
page=page-1;
OLED_Write_com(0xb0+page); //设置页地址。每页是8 行。一个画面的64 行被分成8 个页。我们平常所说的第1 页,在LCD 驱动IC 里是第0 页,所以在这里减去1
OLED_Write_com(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
OLED_Write_com(column&0x0f); //设置列地址的低4 位
}
//=========================================================
//全屏清屏
void clear_screen()
{
unsigned char i,j;
for(j=0;j<8;j++)
{
lcd_address(1+j,1);
for(i=0;i<128;i++) //1305:132 1309:128
{
transfer_data(0x00);
}
}
}
void display_string_8x16(u8 page,u8 column,u8 dat)
{
u8 k,val,pag1,pag2;
pag1=(page*2)-1;
pag2=page*2;
val=dat-' ';
lcd_address(pag1,column*8);
for(k=0;k<8;k++)
{
transfer_data(F8X16[val*16+k]); //写数据到LCD,每写完1 字节的数据后列地址自动加1
}
lcd_address(pag2,column*8);
for(k=0;k<8;k++)
{
transfer_data(F8X16[val*16+8+k]); //写数据到LCD,每写完1 字节的数据后列地址自动加1
}
}
void OLED_Display_buffer(u8 page,u8 seg,u16 buffer)//显示一个5位数的变量
{
display_string_8x16(page,seg,(buffer/10000)+'0');
display_string_8x16(page,seg+1,(buffer%10000)/1000+'0');
display_string_8x16(page,seg+2,(buffer%1000)/100+'0');
display_string_8x16(page,seg+3,(buffer%100)/10+'0');
display_string_8x16(page,seg+4,(buffer%10)+'0');
}
void display_string_16x16(u8 page,u8 column,u8 data1 ) //显示16x16 点阵图像、汉字、生僻字或16x16 点阵的其他图标
{
u8 i,pag1,pag2;
pag1=(page*2)-1;
pag2=page*2;
lcd_address(pag1,(column*16)+1);
for (i=0;i<16;i++)
{
transfer_data(Hzk[data1][i]); //写数据到LCD,每写完一个8 位的数据后列地址自动加1
}
lcd_address(pag2,(column*16)+1);
for (i=0;i<16;i++)
{
transfer_data(Hzk[data1+1][i]); //写数据到LCD,每写完一个8 位的数据后列地址自动加1
}
}
void OLED_Write_fixed_Buffer()//写固定汉字16X16
{
display_string_16x16(2,0,0);
display_string_16x16(2,1,2);
display_string_16x16(2,2,4);
display_string_16x16(2,3,6);
}
void OLED_Init()
{
reset=0;
delay(1);
reset=1;
delay(3);
OLED_Write_com(0xfd);
OLED_Write_com(0x12);
OLED_Write_com(0xAE); // Set Display Off
OLED_Write_com(0xD5); //Set Display Clock Divide Ratio/Oscillator Frequency
OLED_Write_com(0x90); // 1305:0x60~0x90(324~396KHz) 1309: 0x70~0xd0(360~540KHz)
OLED_Write_com(0xA8); //Set Multiplex Ratio
OLED_Write_com(0x3F); //
OLED_Write_com(0xD3); //Set Display Offset
OLED_Write_com(0x00); //
OLED_Write_com(0x40); // Set Display Start Line
OLED_Write_com(0xA1); // Set SEG/Column Mapping (0xA0/0xA1)
OLED_Write_com(0xC8); // Set COM/Row Scan Direction (0xC0/0xC8)
OLED_Write_com(0xDA); //Set COM Pins Hardware Configuration
OLED_Write_com(0x12); // Set Alternative Configuration (0x02/0x12)
OLED_Write_com(0x81); //Set Current Control
OLED_Write_com(0xDF); //
OLED_Write_com(0xD9); //Set Pre-Charge Period
OLED_Write_com(0x82); //
OLED_Write_com(0xDB); //Set VCOMH Deselect Level
OLED_Write_com(0x34); //
// OLED_Write_com(0x20);
// OLED_Write_com(0x02); // Set Page Addressing Mode (0x00/0x01/0x02)
OLED_Write_com(0xA4); // Set Entire Display On/Off (0xA4/0xA5)
OLED_Write_com(0xA6); // Set Normal/Inverse Display (0xA6/0xA7)
clear_screen(); //清屏
delay(10);
OLED_Write_com(0xAF); //开显示
delay(30);
//OLED_Write_fixed_Buffer();
}
|
|