找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3016|回复: 0
收起左侧

SSD1309 2.42寸OLED驱动程序

[复制链接]
ID:904570 发表于 2021-5-8 12:54 | 显示全部楼层 |阅读模式
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();
}


ssd1309_2.42OLED显示驱动.rar

84.81 KB, 下载次数: 63, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表