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