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

📄 oled.c

📁 CC2420+PIC单片机基础实验代码、CC2420无线收发实验代码
💻 C
字号:
//------------成都无线龙通信科技有限公司----------------------------------------
//----------------@2007-5--by-su---------------------------------------------

#include<p18f4620.h>

#define UINT16 unsigned int 
#define INT8U unsigned char 
INT8U ContrastValue = 0x38;
extern rom INT8U FontSystem6x8[];

#define LED1 LATDbits.LATD6
#define LED2 LATDbits.LATD7
#define KEY1 PORTDbits.RD0
#define KEY2 PORTDbits.RD1

#define IO_INIT()\
{\
  TRISDbits.TRISD0=1;\
  TRISDbits.TRISD1=1;\
  TRISDbits.TRISD6=0;\
  TRISDbits.TRISD7=0;\
} 

#define LED_INIT()\
{\
  LED1=0;\
  LED2=0;\
}

#define SDA LATDbits.LATD4
#define SCL  LATDbits.LATD3
#define OLED_POWER_CONT LATDbits.LATD2


#define SDA_H SDA = 1
#define SDA_L SDA = 0

#define SCL_H SCL = 1
#define SCL_L SCL = 0

//void IICDelay(void);
void IICStop(void);
void IIC_NO_ACK(void);
void IICStart(void);
INT8U IICSend(INT8U IIC_data);
void IIC_ACK(void);

/*******************************************************************************
//函数名:void fdelay(unsigned int n)
//功能:廷时
//输入:时间
//输出:无
********************************************************************************/
void fdelay(unsigned int n) 
{
	UINT16 i;
	UINT16 j;
	for (i=0;i<10;i++)
	for (j=0;j<n*2;j++) ;
}

void IICDelay(void){
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();		
}
//--------------------------------------------------------------------------
//初始化I2C
//--------------------------------------------------------------------------

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^IIC程序start^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^	
void IICINIT(void)
{	
  	TRISDbits.TRISD2=0;
  	TRISDbits.TRISD3=0;
  	TRISDbits.TRISD4=0;
	SCL_L;
	SDA_L;
	IICDelay();
	SCL_L;
	IICDelay();
	SDA_H;
	IICDelay();
	SCL_H;	
}
//命令
void WriteCommand(INT8U com) 
{
	while(IICSend(0x00)==0);	
	while(IICSend(com)==0);   
}
//数据
void WriteData(INT8U dat)
{	
	IICSend(0x40);
	IICSend(dat);  
}

//启始信号

void IICStart(void)
{	
	SDA_H;
	SCL_H;
	IICDelay();
	SDA_L;
	IICDelay();
	SCL_L;	
	SDA_H;
	IICDelay();
}
/*********************************************************************************************************
** 函数名称: IICSend
** 功能描述: 发送一个字节
** 输 入: IIC_data:数据

** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT8U IICSend(INT8U IIC_data)
{
    INT8U i;
    for (i = 0; i < 8; i++)
    {
    	if(IIC_data & 0x80)	
		{
			SDA_H;
		}
    	else
			SDA_L;

    	SCL_H;  
        IIC_data  <<= 1;                      
		IICDelay();
        SCL_L;
		IICDelay();        
    }
    SDA_H;    
    IICDelay();
    SCL_H;
    IICDelay();
    if(SDA == 1)
	{
    	SCL_L;    	  
    	return 0;
    }
	SCL_L;	
    return 1;    
}
void IICStop(void)
{
    SDA_L;
    SCL_L;
	IICDelay();
    SCL_H;
    	IICDelay();
    SDA_H;
	IICDelay();
    SCL_L;
	IICDelay();
}
/*********************************************************************************************************
** 函数名称: IIC_NO_ACK
** 功能描述: 发送IIC无应答信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void IIC_NO_ACK(void)
{
    SDA_H;
	IICDelay();
	SCL_H;
	IICDelay();
    SCL_L;
	IICDelay();
    
}
/*********************************************************************************************************
** 函数名称: IIC_ACK
** 功能描述: 发送IIC应答信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void IIC_ACK(void)
{
    SDA_L;
	IICDelay();
	SCL_H;
	IICDelay();
    SCL_L;
	IICDelay();
    
}

void SetRamAddr(INT8U Page , INT8U Col)
{
	WriteCommand(0xB0 + Page);
	WriteCommand(Col & 0x0f); //Set lower column address
	WriteCommand(0x10 | ((Col & 0xf0) >> 4)); //Set higher column address
}

/*******************************************************************************
//函数名:void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
//功能:显示6*8字符串
//输入:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
//输出:无
********************************************************************************/
void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)		
{
	INT8U ii = 0;
	INT8U bb = 0;
	unsigned int index = 0 ;
	
	IICStart();
	IICSend(0x7a);//地址,写命令

	SetRamAddr(xx , yy);	

	//IICSend(0xc0);//地址,写命令

	while(ch1[bb] != '\0')
	{
        index = (unsigned int)(ch1[bb] - 0x20);
		index = (unsigned int)index*6;		
		for(ii=0;ii<6;ii++)
		{
			if(yn)
			{
				WriteData(FontSystem6x8[index]);
			}
			else
			{
				WriteData(~FontSystem6x8[index]);
			}		
			index += 1;
		}		
		bb += 1;
	}
	IICStop();
}

/*******************************************************************************
//函数名:void ClearScreen(void)
//功能:清屏
//输入:无
//输出:无
********************************************************************************/
void ClearScreen(void)
{
	INT8U i;
	INT8U j;
	for(i=0; i<8 ; i++)
	{
		SetRamAddr(i,0);
		for(j=0; j<96; j++)
		{ 
			WriteData(0x00);
		}
	}
}

void OLED_Init()
{
	IICINIT();
	OLED_POWER_CONT = 0;
	fdelay(1000);

	IICStart();

	LED1=1;

	while(IICSend(0x7a)==0);//地址,写命令

	LED2=1;

	WriteCommand(0x04);//set lower column address
	//high column address
	WriteCommand(0x12);
	
				// Display Start Line
	WriteCommand(0x40); 	// Set Display Start Line 
	// Contrast Control Register
	WriteCommand(0x81); // Set Contrast Control /
	WriteCommand(0x2B); // 0 ~ 127 (1) /
	// Re-map
	WriteCommand(0xA1); // [A0]:column address 0 is
	//map to SEG0 , [A1]: column
	//address 131 is map to SEG0
	// Entire Display ON/OFF
	WriteCommand(0xA4); // A4=ON /
	// Normal or Inverse Display
	WriteCommand(0xA6); // Normal Display//
	// Multiplex Ratio
	WriteCommand(0xA8); // Set Multiplex Ratio //
	WriteCommand(0x0F); // Set to 16 Mux//
	// Set DC-DC
	WriteCommand(0x8A); // Set DC-DC //
	// 8B=ON, 8A=OFF //
	// Display ON/OFF
	WriteCommand(0xAF); // AF=ON , AE=OFF//
	// Display Offset
	WriteCommand(0xD3); // Set Display Offset //
	WriteCommand(0x00); // No offset //
	// Display Clock Divide
	WriteCommand(0x72); // Set Clock Divide //
	// Set to 150Hz //
	// Area Color Mode
	WriteCommand(0xD8); // Set Area Color On or Off //
	WriteCommand(0x00); // Mono Mode //
	// COM Pins Hardware Configuration
	WriteCommand(0x12); //Set Pins Hardware Configuration //
	// VCOMH
	WriteCommand(0xDB); // Set VCOMH (2) //
	WriteCommand(0x0F);

	IICStop();
	OLED_POWER_CONT = 1;
	fdelay(1000);
}

void LCD_Init()
{
	IICINIT();
	OLED_POWER_CONT = 0;
	fdelay(1000);
	IICStart();
	IICSend(0x7a);//地址,写命令
	IICSend(0x80);
	IICSend(0x04);//set lower column address
	//high column address
	IICSend(0x12);
	
				// Display Start Line
	IICSend(0x40); 	// Set Display Start Line 
	// Contrast Control Register
	IICSend(0x81); // Set Contrast Control /
	IICSend(0x2B); // 0 ~ 127 (1) /
	// Re-map
	IICSend(0xA1); // [A0]:column address 0 is
	//map to SEG0 , [A1]: column
	//address 131 is map to SEG0
	// Entire Display ON/OFF
	IICSend(0xA4); // A4=ON /
	// Normal or Inverse Display
	IICSend(0xA6); // Normal Display//
	// Multiplex Ratio
	IICSend(0xA8); // Set Multiplex Ratio //
	IICSend(0x0F); // Set to 16 Mux//
	// Set DC-DC
	IICSend(0x8A); // Set DC-DC //
	// 8B=ON, 8A=OFF //
	// Display ON/OFF
	IICSend(0xAF); // AF=ON , AE=OFF//
	// Display Offset
	IICSend(0xD3); // Set Display Offset //
	IICSend(0x00); // No offset //
	// Display Clock Divide
	IICSend(0x72); // Set Clock Divide //
	// Set to 150Hz //
	// Area Color Mode
	IICSend(0xD8); // Set Area Color On or Off //
	IICSend(0x00); // Mono Mode //
	// COM Pins Hardware Configuration
	IICSend(0x12); //Set Pins Hardware Configuration //
	// VCOMH
	IICSend(0xDB); // Set VCOMH (2) //
	IICSend(0x0F);

	IICStop();
	fdelay(1000);
}
unsigned char s1[]="chengduwuxianlong";
void main()
{
	INT8U i;
	IO_INIT();
	LED_INIT();
	OLED_Init();
	//LCD_Init();
	for (i=0;i<96;i++) /* 96 COLUMN */
	{
		WriteData(0xFF); /*ALL PIXEL ON */
	}
	WriteCommand(0xE3); /* NOP COMMAND */
	while(1)
	{
		LED1=1;
		Print6(0,0,s1,1);
	}
}

⌨️ 快捷键说明

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