|
如題,有PDF,PDF內(nèi)有驅(qū)動(dòng)程序,但看不懂,那位能給出詳細(xì)的驅(qū)動(dòng)或兼容的芯片程序?
內(nèi)部驅(qū)動(dòng)如下:
各位看看驅(qū)動(dòng)像SSD1351嗎,SEPS114也是彩色OLED驅(qū)動(dòng)芯片
void init_SEPS114A(void)
{
/* 待機(jī)關(guān)閉 */
comm_write(0x14, 0x00);
delay(1); // wait for 1ms
/* 設(shè)置振蕩器操作 */
comm_write(0x0F, 0x00); // using external resistor and internal OSC
/* 設(shè)置幀速率 */
comm_write(0x1A, 0x02); // frame rate : 90Hz
/* 設(shè)置MCU接口 */
comm_write(0x0D, 0x01); // MPU External interface mode, 16bits
/* 設(shè)定放電時(shí)間 */
comm_write(0x18, 0x08); // Discharge time : normal discharge
/* 設(shè)置峰值脈沖延遲 */
comm_write(0x16, 0x05);
/* 設(shè)置峰值脈沖寬度 */
comm_write(0x3A, 0x05);
comm_write(0x3B, 0x05);
comm_write(0x3C, 0x05);
/* 設(shè)置預(yù)充電電流 */
comm_write(0x3D, 0x1F);
comm_write(0x3E, 0x1F);
comm_write(0x3F, 0x1F);
/* 設(shè)置列電流 */
comm_write(0x40, 0x5F);
comm_write(0x41, 0x5F);
comm_write(0x42, 0x5F);
/* 設(shè)置行掃描方向 */
comm_write(0x09, 0x00); // 列 : 最大 0 →,行 : 0 → 最大
/* 設(shè)置行重疊 */
comm_write(0x48, 0x00); // 僅帶隙
/* 設(shè)置掃描關(guān)閉級(jí)別 */
comm_write(0x49, 0x04); //VCC_C*0.75
/* 設(shè)置行掃描模式 */
comm_write(0x13, 0x00); // 備用掃描模式
/* 設(shè)置顯示模式控制 */
comm_write(0xE5, 0x00); //SWAP:RGB,降低電流:正常,DC[1:0]:正常
/* 設(shè)置內(nèi)存讀/寫(xiě)模式 */
comm_write(0x1D, 0x00);
/* 設(shè)置存儲(chǔ)區(qū)(地址)寫(xiě)入顯示數(shù)據(jù) */
comm_write(0x34, 0x00);
comm_write(0x35, 0x5F);
comm_write(0x36, 0x00);
comm_write(0x37, 0x5F);
/* 設(shè)置內(nèi)存接入點(diǎn) */
comm_write(0x38, 0x00);
comm_write(0x39, 0x00);
/* 設(shè)置面板的活動(dòng)顯示區(qū)域 */
comm_write(0x30, 0x00);
comm_write(0x31, 0x5F);
comm_write(0x32, 0x00);
comm_write(0x33, 0x5F);
/* 顯示開(kāi)啟 */
comm_write(0x02, 0x01);
}
/* 將命令寫(xiě)入 SEPS114A 的寄存器
當(dāng)命令寫(xiě)入SEPS114A寄存器時(shí),控制信號(hào) A0 指示電流
data 是索引或命令。在本例中,SEPS114A的 A0 引腳連接到地址線 2 A2。和
訪問(wèn)地址0x80xx_xxxx,控制信號(hào) CS 變?yōu)椤暗碗娖健薄?br />
因此,當(dāng)用戶將數(shù)據(jù)(0x02)寫(xiě)入下面定義的DISP_COM時(shí),A0信號(hào)和CS信號(hào)變?yōu)椤暗碗娖健?br />
SEPS114A表示此數(shù)據(jù)(0x02)為索引。
當(dāng) data(0x01) 寫(xiě)入 DISP_DATA 時(shí),A0 為“high”,CS 為“l(fā)ow”,因此此 data(0x01) 為命令。 */
#define DISP_COM *((volatile unsigned *)0x80000000)
#define DISP_DATA *((volatile unsigned *)0x80000004) /* A2 : OLED A0 Pin */
void comm_write(unsigned char index, unsigned char command)
{
DISP_COM = index; // 索引寫(xiě)入
DISP_DATA = command; // 命令寫(xiě)入
}
/*將顯示數(shù)據(jù)寫(xiě)入數(shù)據(jù)RAM
該例程是通過(guò) 16 位總線接口將圖像數(shù)據(jù) (96*96) 寫(xiě)入 DDRAM。首先,我們應(yīng)該將
DDRAM接入端口(0x08)。*/
#define HEIGHT 96
#define WIDTH 96
unsigned int img_data[HEIGHT*WIDTH]; // 圖像數(shù)據(jù)緩沖區(qū)
void image_write(void)
{
unsigned i;
DISP_COM = 0x08; // 設(shè)置 DDRAM 接入端口
for(i=0;i++;i<HEIGHT*WIDTH)
DISP_DATA = img_data[ i]; // 將數(shù)據(jù)寫(xiě)入 DDRAM
}
/*RGB接口示例程序
該程序是6位RGB接口的示例程序,通過(guò)SPI控制SEPS114A。*/
/* 選擇RGB數(shù)據(jù)格式,設(shè)置RGB接口端口的初始狀態(tài) */
void init_rgbif(void)
{
reg_write_spi(0xE0, 0x21); /* RGB 6位接口 */
out_signal = 1<<ENABLE|1<<HSYNC|1<<VSYNC|1<<DOTCLK;
OUTPORT = out_signal;
}
void rgb_display(uint16_t red, uint16_t green, uint16_t blue)
{
unsigned short i, j;
/* SEPS114A初始化 */
// 待辦事項(xiàng) :: 初始化SEPS114A(顯示大小、內(nèi)存區(qū)域、幀率等.......)
// 使用“reg_write_spi()”功能(SPI接口)進(jìn)行初始化
init_rgbif();
signal_assert(VSYNC, 0);
signal_assert(HSYNC, 0);
signal_assert(DOTCLK, 0);
signal_assert(DOTCLK, 1);
signal_assert(VSYNC, 1);
signal_assert(HSYNC, 1);
signal_assert(ENABLE, 0);
/* 內(nèi)存(圖形內(nèi)存)端口設(shè)置 */
INDEXDATA = 0x08;
/* 傳輸?shù)谝恍袛?shù)據(jù) */
while(1)
{
signal_assert(VSYNC, 1);
for(i=0;i<96;i++)
{
signal_assert(HSYNC, 1);
for(j=0;j<96;j++)
{
CONTROLDATA = red<<1;
signal_assert(DOTCLK, 0);
signal_assert(DOTCLK, 1);
CONTROLDATA = green<<0;
signal_assert(DOTCLK, 0);
signal_assert(DOTCLK, 1);
CONTROLDATA = blue<<1;
signal_assert(DOTCLK, 0);
signal_assert(DOTCLK, 1);
}
signal_assert(HSYNC, 0);
}
signal_assert(VSYNC, 0);
}
}
void reg_write_spi(uint32_t addr, uint32_t data)
{
spi_write(INDEX, addr);
spi_write(COMMAND, data);
}
void spi_write(uint8_t ch, uint32_t data)
{
unsigned char i;
unsigned short temp=0;
signal_assert(CS, 0);
if(ch == INDEX) signal_assert(A0, 0);
else signal_assert(A0, 1);
for(i=0;i<8;i++)
{
temp = data&(0x80>>i);
signal_assert(SCL, 0);
if(temp) signal_assert(SDI, 1);
else signal_assert(SDI, 0);
signal_assert(SCL, 1);
}
delay(5);
signal_assert(CS, 1);
delay(10);
} |
|