📄 oled.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 + -