鱼C论坛

 找回密码
 立即注册

<stm32系列>OLED屏的驱动控制

已有 874 次阅读2013-11-14 09:15 |个人分类:stm32

/*******************************************************************************
* 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;
}




路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-3 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部