⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssd1303_oled.c

📁 C8051驱动OLED驱动芯片SD1303的源码资料
💻 C
字号:

/**********************************************************************
*CopyRight(c)2004,北京超思电子有限公司
*All rights reserved.
*
*文件名称:SSD1303_OLED.c
*文件内容:OLED 评估, 硬件CSN411-1.0,OLED函数文件,OLED为串行接口模式
*作者    :ZH
*版本    :1.0
*完成日期:2007.02.09
*最后修改:2007.02.09
**********************************************************************/

#include "iom168.h"
#include "inavr.h"

__flash unsigned char LCD_Tab0[112] =
{   
    
    0x80,0x80,0xC0,0xE0,0xF0,0xD8,0xCC,0xC4,0xC4,0xCC,0xD8,0xF0,0xFE,0xFE,0xFE,0x80,

    0x00,0x20,0x20,0x20,0x20,0xFF,0x00,0x00,0x00,0xFF,0x40,0x20,0x30,0x18,0x10,0x00,
    0x00,0x04,0x04,0xE4,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xE4,0x06,0x04,0x00,0x00,
    0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x82,0xC2,0xBE,0x82,0xA2,0xC2,0xBE,0x00,0x00,
    0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
    0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
    0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00
    
};


__flash unsigned char LCD_Tab1[112] =
{
    0x01,0x01,0x01,0x7F,0x7F,0x60,0x7C,0x7C,0x60,0x66,0x66,0x60,0x7F,0x7F,0x01,0x01,
    
    0x10,0x30,0x18,0x08,0x04,0x7F,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,
    0x00,0x20,0x10,0x19,0x0D,0x41,0x81,0x7F,0x01,0x01,0x05,0x0D,0x38,0x10,0x00,0x00,
    0x60,0x1F,0x20,0x40,0x7F,0x42,0x42,0x40,0x5F,0x48,0x48,0x48,0x48,0x5F,0x40,0x00,
    0x20,0x38,0x00,0x00,0x3C,0x40,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x18,0x30,0x00,
    0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
    0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00
    
    
    
};/*"哈",0*/
__flash unsigned char LCD_Tab2[16] = 
{0x30,0x30,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x30,0x30};
__flash unsigned char LCD_Tab3[16] = 
{0x00,0x00,0x3F,0x7F,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x7F,0x3F,0x00,0x00};
/******************************接口宏定义*****************************/

#define  OLED_CS_H     DDRC |=(1<<3); PORTC |=(1<<3);
#define  OLED_CS_L     DDRC |=(1<<3); PORTC &=~(1<<3);
#define  OLED_RES_H
#define  OLED_RES_L
#define  OLED_SDIN_H   DDRC |=(1<<0); PORTC |=(1<<0); 
#define  OLED_SDIN_L   DDRC |=(1<<0); PORTC &=~(1<<0);
#define  OLED_SCLK_H   DDRC |=(1<<1); PORTC |=(1<<1); 
#define  OLED_SCLK_L   DDRC |=(1<<1); PORTC &=~(1<<1);
#define  OLED_DC_H     DDRC |=(1<<2); PORTC |=(1<<2); 
#define  OLED_DC_L     DDRC |=(1<<2); PORTC &=~(1<<2);
 

/******************************全局变量*******************************/
//volatile  unsigned char   CurDispStatus;   //当前显示状态


/*****************************外部函数********************************/

   
    
/*****************************内部函数********************************/

//延时N毫秒
void Delay_ms(unsigned int Ms)
{
      unsigned int i;
      for(i=0;i<Ms;i++)
      {__delay_cycles(8000);}//1ms

}

//OLED写命令
void  OLED_CD_WR(unsigned char Cmmd)
{ 
    unsigned char i;
    unsigned char mid=Cmmd;
    
    OLED_CS_L
    OLED_DC_L
    if(Cmmd==0x2F)
    {
       Cmmd++;
       Cmmd--;
    }
    for(i=0; i<8; i++)
    {
        OLED_SCLK_L
        if(mid&0x80)
        {
            OLED_SDIN_H
        }
        else
        {
            OLED_SDIN_L
        }
        mid<<=1;
        OLED_SCLK_H
    }
    OLED_CS_H 
}
//OLED写数据
void  OLED_DA_WR(unsigned char Data)
{
    unsigned char i;
    unsigned char mid=Data;
    
    OLED_CS_L
    OLED_DC_H
    
    for(i=0; i<8; i++)
    {
        OLED_SCLK_L
        if(mid&0x80)
        {
            OLED_SDIN_H
        }
        else
        {
            OLED_SDIN_L
        }
        mid<<=1;
        OLED_SCLK_H
    }
    OLED_CS_H
}


/******************************写指定页列位置的8位数据******************/
/*功能:在全屏范围内写指定页,列坐标的数据                              */
/*参数:      unsigned char column     数据所在列 0到159列              */
/*           unsigned char page       数据所在页0到7页                 */
/*           unsigned char data       要写的数据                       */
/*返回:无                                                              */
void  OLED_BasicWriteByte(unsigned char column,unsigned char page,unsigned char data)
{
    //unsigned char mid;
    unsigned char colum=column;
/*
    mid=page|0xB0;
    OLED_CD_WR(mid);//
   
    mid=((colum>>4)&0x0F)|0x10;
    OLED_CD_WR(mid);//设置列高位/ 
    
    mid=colum&0x0F;
    OLED_CD_WR(mid);//设置列低位/
   
    OLED_DA_WR(data);
  */
  //unsigned char i;  
  OLED_CD_WR(page|0xB0);
  OLED_CD_WR(((colum>>4)&0x0F)|0x10);
  OLED_CD_WR(colum&0x0F);
  //for(i = 0;i<8;i++)
  //{
  // colum++;
   
  // }
  
  OLED_DA_WR(data);
  
  
}

/******************************读指定页列位置的8位数据*****************/
/*功能:在全屏范围内读取指定页,列坐标的数据                           */
/*参数:   unsigned char column     数据所在列 0到159                  */
/*        unsigned char page       数据所在页0到7                     */
/*返回:读取的数据                                                     */
unsigned char   OLED_BasicReadByte(unsigned char column,unsigned char page)
{
    //unsigned char mid;
    //unsigned char colum=column+0x24;
    
    
    return  0;

}

//OLED清屏
void  OLED_Clear(unsigned char pattern)
{

	unsigned	char	i;
	unsigned	int	j;



	for(i = 0xB0; i< 0xB8; i++)
	{
		OLED_CD_WR(i);			//	set page address, 0xB0 -- 0xB8
		OLED_CD_WR(0x00);		//	set the lower nibble of the column address register.
		OLED_CD_WR(0x10);		//	set the higher nibble of the column address register.

		for (j = 0; j < 132; j++)
		{
			OLED_DA_WR(pattern);
		}
	}

	OLED_CD_WR(0xe3);			//	NOP
  
}

//OLED初始化函数
void  OLED_ini(void)
{
        Delay_ms(1000);

//	before the CS# pull high, additional NOP command should be inserted during SPI data writing.
	OLED_CD_WR(0xae);		//	set display off

	OLED_CD_WR(0xe2);		//	software reset

	OLED_CD_WR(0xee);		//	read write -modify mode

	OLED_CD_WR(0xa8);		//	set multiplex ratio
	OLED_CD_WR(0x3f);		//	second byte of command set multiplex ratio, 64MUX

	OLED_CD_WR(0xd0);		//	set display offset
	OLED_CD_WR(0x7f);		//	second byte of command set display offset

	OLED_CD_WR(0xa1);		//	set segment re-map
	OLED_CD_WR(0xc8);		//	set COM output scan direction,行方向,黄色16像素在上

	OLED_CD_WR(0xa6);		//	set normal/inverse display (normal)
	OLED_CD_WR(0xa4);		//	set entire display (normal)

	OLED_CD_WR(0x81);		//	set contrast control
	OLED_CD_WR(0x28);		//	second byte

	OLED_CD_WR(0xd5);		//	set display clock divide ratio/oscillator frequency.
	OLED_CD_WR(0x10);		//	second byte


//	打开VCC
//	等待VCC稳定,100毫秒

	OLED_CD_WR(0xaf);		//	set display on

}


void  OLED_poweroff(void)
{


//	send display off command
	OLED_CD_WR(0xae);		//	set display off
	OLED_CD_WR(0xe3);		//	NOP

//	关闭VCC
//	等待100毫秒,等待VCC降到零

}

//OLED测试函数
void  OLED_T(void)
{ 
  OLED_Clear(0xFF);
     for(;;)
     {
        //
        unsigned char i;
             for(i=0;i<112;i++)
       {
        
        OLED_BasicWriteByte(10+i,0,LCD_Tab0[i]);
        OLED_BasicWriteByte(10+i,1,LCD_Tab1[i]);
        
        
        OLED_BasicWriteByte(10+i,4,LCD_Tab0[i]);
        OLED_BasicWriteByte(10+i,5,LCD_Tab1[i]);
        
        
        if(i<10)
        {
        OLED_BasicWriteByte(i,0,0x00);
        OLED_BasicWriteByte(i,1,0x00);
        OLED_BasicWriteByte(122+i,0,0x00);
        OLED_BasicWriteByte(122+i,1,0x00);
        }
        if(i<16)
        {
          OLED_BasicWriteByte(10+i,7,LCD_Tab2[i]);
          OLED_BasicWriteByte(10+i,8,LCD_Tab3[i]);
        }
        }
      /*  Delay_ms(1500);
        Delay_ms(1500);
        Delay_ms(1500);
        Delay_ms(1500);
        OLED_Clear(0xF0);
        Delay_ms(1500);
        OLED_Clear(0x55);
        Delay_ms(1500); 
        OLED_Clear(0xAA);
        Delay_ms(1500);
        OLED_Clear(0x0F);
        Delay_ms(1500); 
        OLED_Clear(0xF0);
        Delay_ms(1500);*/
        //OLED_Clear(0x00);        
     }      
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -