/*******************************************************************************
* COPYRIGHT 2013 TPCon.com
* File Name : oled.c
* Author : LOVT
* Version : V0.1
* Date : 2013/07/22
* Description : 液晶显示屏驱动
*******************************************************************************/
#define _OLED_C_
#include "oled.h"
#include "config.h"
#include "string.h"
#include "timer.h"
#include "cat823.h"
#include "ViewFrame.h"
#include "DisplayGUI.h"
#define CONTRAST 0x7F
/****************************************************************
// Summary: 硬件复位
// Parameter: [void]
//
// return: [void]
****************************************************************/
void HardwareReset()
{
GPIO_ResetBits(GPIO_OLEDC, RES); //低电平进行复位
Delay_ms(10); //10ms
GPIO_SetBits(GPIO_OLEDC, RES);
Delay_ms(10);
}
/****************************************************************
// Summary: 写命令
// Parameter: [in/u8]com 写入的命令
//
// return: [void]
****************************************************************/
void WriteCommand(u8 com)
{
ResetWatchDog();
GPIO_ResetBits(GPIO_OLEDC, CSOLED); //片选
GPIO_ResetBits(GPIO_OLEDC, DC); //命令模式
GPIO_SetBits(GPIO_OLEDC, RD);
GPIO_WriteBit(GPIO_OLEDD, D7, (BitAction)(com & 0x80));
GPIO_WriteBit(GPIO_OLEDD, D6, (BitAction)(com & 0x40));
GPIO_WriteBit(GPIO_OLEDD, D5, (BitAction)(com & 0x20));
GPIO_WriteBit(GPIO_OLEDD, D4, (BitAction)(com & 0x10));
GPIO_WriteBit(GPIO_OLEDD, D3, (BitAction)(com & 0x08));
GPIO_WriteBit(GPIO_OLEDD, D2SDOUT, (BitAction)(com & 0x04));
GPIO_WriteBit(GPIO_OLEDD, D1SDIN, (BitAction)(com & 0x02));
GPIO_WriteBit(GPIO_OLEDD, D0SCLK, (BitAction)(com & 0x01));
GPIO_ResetBits(GPIO_OLEDC, WR); //写模式
GPIO_SetBits(GPIO_OLEDC, WR); //读模式
GPIO_SetBits(GPIO_OLEDC, CSOLED); //取消片选
}
/****************************************************************
// Summary: 写数据
// Parameter: [in/u8]data 写入的命令
//
// return: [void]
****************************************************************/
void WriteData(u8 data)
{
GPIO_ResetBits(GPIO_OLEDC, CSOLED); //片选
GPIO_SetBits(GPIO_OLEDC, DC); //数据模式
GPIO_SetBits(GPIO_OLEDC, RD);
GPIO_WriteBit(GPIO_OLEDD, D7, (BitAction)(data & 0x80));
GPIO_WriteBit(GPIO_OLEDD, D6, (BitAction)(data & 0x40));
GPIO_WriteBit(GPIO_OLEDD, D5, (BitAction)(data & 0x20));
GPIO_WriteBit(GPIO_OLEDD, D4, (BitAction)(data & 0x10));
GPIO_WriteBit(GPIO_OLEDD, D3, (BitAction)(data & 0x08));
GPIO_WriteBit(GPIO_OLEDD, D2SDOUT, (BitAction)(data & 0x04));
GPIO_WriteBit(GPIO_OLEDD, D1SDIN, (BitAction)(data & 0x02));
GPIO_WriteBit(GPIO_OLEDD, D0SCLK, (BitAction)(data & 0x01));
GPIO_ResetBits(GPIO_OLEDC, WR); //写模式
GPIO_SetBits(GPIO_OLEDC, WR); //读模式
GPIO_SetBits(GPIO_OLEDC, CSOLED); //取消片选
}
/****************************************************************
// Summary: OLED初始化设置
// Parameter: [void]
//
// return: [void]
****************************************************************/
void Init_OLEDCommand(void)
{
ResetWatchDog();
WriteCommand(0xAE); //显示复位
WriteCommand(0x15); //设置列地址
WriteCommand(0x00); //开始列地址 0
WriteCommand(0x3F); //结束列地址 63
WriteCommand(0x75); //设置行地址
WriteCommand(0x00); //开始行地址0
WriteCommand(0x3F); //结束行地址0
WriteCommand(0x81); //设置对照行
WriteCommand(CONTRAST); //128
WriteCommand(0x86); //设置完全行模式
WriteCommand(0xA0); //设置地址重映射
WriteCommand(0x52);
WriteCommand(0xA1); //设置显示开始行
WriteCommand(0x00);
WriteCommand(0xA2); //设置显示偏移
WriteCommand(0x4c);
WriteCommand(0xA4); //设置显示模式 正常显示
WriteCommand(0xA8); //SET MULTIPLEX RATIO
WriteCommand(0x3f); //16--80
WriteCommand(0xAD); //SET MASTER CONFIGURATION
WriteCommand(0x02); //选外部VCC供电
WriteCommand(0xB0); //SET PRE-CHARGE COMPENSATION ENABLE
WriteCommand(0x28); //28,ENABLE PRE-CHARGE COMPENSATION
WriteCommand(0xB1); //SET PHASE LENGTH
WriteCommand(0x28);
WriteCommand(0xB2); //SET ROW PERIOD(FRAME FREQUENCY)
WriteCommand(0x46); //K=P1+P2+GS15 PULSE WIDTH
WriteCommand(0xB3); //SET DISPLAY CLOCK DIVIDE RATIO/OSCILLATOR FREQUENCY
WriteCommand(0x91); //655KHz,D=2
WriteCommand(0xB4); //SET PRE-CHARGE COMPENSATION LEVEL
WriteCommand(0x03);
WriteCommand(0xB8); //SET GRAY SCALE TABLE 灰度表
WriteCommand(0x01); //GS1
WriteCommand(0x11); //GS3GS2
WriteCommand(0x22); //GS5GS4
WriteCommand(0x32); //GS7GS6
WriteCommand(0x43); //GS9GS8
WriteCommand(0x54); //GS11GS10
WriteCommand(0x65); //GS13GS12
WriteCommand(0x76); //GS15GS14
Delay_ms(10);
WriteCommand(0xBC); //SET PRE-CHARGE VOLTAGE
WriteCommand(0x10);
Delay_ms(10);
WriteCommand(0xBE); //SET VCOMH VOLTAGE
WriteCommand(0x02);
Delay_ms(10);
WriteCommand(0xBF); //SET SEGMENT LOW VOLTAGE(VSL)
WriteCommand(0x02);
OLED_RAMClear();
WriteCommand(0xAF); //开启显示
Delay_ms(100);
}
//////////////////////////////////////////////////控制类命令///////////////////////////////////////////
void InitOLED(void)
{
HardwareReset();
Init_OLEDCommand();
}
//清除RAM中的数据
void OLED_RAMClear(void)
{
u8 i, j;
for(i = 0; i < 64; i ++)
{
for(j = 0; j < 64; j ++)
{
ResetWatchDog();
WriteData(0x00);
}
}
memset(OLED_GDRAM, 0, 4096);
}
//像素全部关闭 如果恢复正常后 不影响RAM的数据 还会存在
void OLED_AllOff(void)
{
WriteCommand(0xA6);
}
//像素全部打开 如果恢复正常后 不影响RAM的数据 还会存在
void OLED_AllOn(void)
{
WriteCommand(0xA5);
}
//像素点全部反选 如果恢复正常后 不影响RAM的数据 还会存在
void OLED_GrayInverse(void)
{
WriteCommand(0xA7);
}
//像素点正常显示
void OLED_DisplayReset(void)
{
WriteCommand(0xA4);
}
//////////////////////////////////////////////////应用接口////////////////////////////////////////////
/****************************************************************
// Summary: 加载缓存中的数据到GDRAM中
// Parameter:
// Return: [void]
****************************************************************/
void Load_GDRAM(void)
{
u8 i, j;
for(i = 0; i < 64; i ++)
{
for(j = 0; j < 64; j ++)
{
ResetWatchDog();
WriteData(OLED_GDRAM[i][j]);
}
}
}
/****************************************************************
// Summary: 画一个点
// Parameter: [in/u8]x x轴坐标不大于127
// [in/u8]y y轴坐标不大于63
// [in/GrayScale]Gray 灰度等级
//
// Return: [ErrorStatus] 1 成功 0失败
****************************************************************/
ErrorStatus OLED_DrawDot(u8 x, u8 y, GrayScale Gray)
{
u8 byte, bit, data , temp;
if(x > 127 | y > 63)
return ERROR;
byte = x / 2;
bit = x % 2;
temp = OLED_GDRAM[y][byte];
if(0 == bit)
{
data = Gray << 4;
temp &= 0x0f;
data |= temp;
}
else
{
data = Gray;
temp &= 0xf0;
data |= temp;
}
OLED_GDRAM[y][byte] = data;
return SUCCESS;
}
/*************************************************************************
// Summary: 画两个点 要求起始x坐标为偶数
// Parameter: [in/u8]x x轴坐标不大于127
// [in/u8]y y轴坐标不大于63
// [in/u8]Gray 两个像素点灰度等级 前一个像素点为高4位
// 后一个像素点为低4位
// Return: [ErrorStatus] 1 成功 0失败
************************************************************************/
ErrorStatus OLED_DrawByte(u8 x, u8 y, u8 Gray)
{
if(x > 127 | y > 63)
return ERROR;
if((x % 2) != 0) //确保起始x地址为偶数
return ERROR;
OLED_GDRAM[y][x / 2] = Gray;
return SUCCESS;
}