3 軟件編程
在與計(jì)算機(jī)連接方面,SSD1303的接口,包括數(shù)據(jù)輸入緩存器、數(shù)據(jù)輸出鎖存器,指令寄存器及譯碼器,忙狀態(tài)觸發(fā)器以及時(shí)序控制電路等,具有高性能的接口控制電路。計(jì)算機(jī)可以隨時(shí)訪問SSD1303而不需要判斷其當(dāng)前狀態(tài),與以前用的以T6963C控制器不同,SSD1303判斷忙狀態(tài)在操作上不是那么重要,因?yàn)镾SD1303的接口部能夠適時(shí)地接收計(jì)算機(jī)的訪問。只是在計(jì)算機(jī)對(duì)顯示存儲(chǔ)器大量的數(shù)據(jù)傳輸時(shí)與控制部向驅(qū)動(dòng)部傳輸顯示數(shù)據(jù)相沖突,會(huì)在顯示屏上出現(xiàn)“雪花”。但是由于這個(gè)間隙時(shí)間很短,加上人眼在視覺上的惰性而看不出“雪花”現(xiàn)象,有時(shí)判斷忙標(biāo)志再進(jìn)行顯示數(shù)據(jù)傳輸時(shí),忙標(biāo)志已經(jīng)消失了。正是由于這些,計(jì)算機(jī)訪問SSD1303的操作流程非常簡(jiǎn)單。但要注意的是SSD1303的接口控制電路內(nèi)有幾套時(shí)序電路以適配不同計(jì)算機(jī)操作時(shí)序的要求。時(shí)序適配電路的設(shè)置端為BS0,BS1,BS2。在P09703中選擇BS1和BS2不同的連接,以確定選擇Intel8080時(shí)序還是M6800時(shí)序。在P09702中由于沒有BS1和BS2的選擇,出廠時(shí)已經(jīng)設(shè)置為Intel8080時(shí)序,所以下面的程序?yàn)镮ntel8080時(shí)序。
#define AD0_PIN_NUM 8 //8位數(shù)據(jù)總線
#define DC_PIN_NUM 5 //P0.5 數(shù)據(jù)/指令控制位,低電平—指令操作,高電平—數(shù)據(jù)操作
#define WR_PIN_NUM 6 //P0.6 寫數(shù)據(jù)/指令控制位,高電平變低電平時(shí)寫入
#define RD_PIN_NUM 7 //P0.7 讀數(shù)據(jù)/指令控制位,低電平有效
#define CS_PIN_NUM 16 //P0.16 使能位,低電平有效
void ExBusInit(void) //初始化P09702OLED顯示屏總線
{ uint32 temp;
// 設(shè)置引腳連接模塊:DC_PIN_NUM、WR_PIN_NUM、RD_PIN_NUM、CS_PIN_NUM、 AD0_PIN_NUM為GPIO
PINSEL0 &= ~(3 << (2 * DC_PIN_NUM));
PINSEL0 &= ~(3 << (2 * WR_PIN_NUM));
PINSEL0 &= ~(3 << (2 * RD_PIN_NUM));
PINSEL0 &= ~(3 << (2 * (CS_PIN_NUM-16)));
for (temp= AD0_PIN_NUM; temp < 16; temp++){
PINSEL0 &= ~(3 << (2 *temp));
}
// 設(shè)置引腳方向,所有相關(guān)引腳為輸出
temp = 0xff << AD0_PIN_NUM;
IODIR = IODIR | temp;
IODIR = IODIR | (1 << WR_PIN_NUM) | (1 << RD_PIN_NUM) | (1 << DC_PIN_NUM) | (1 << CS_PIN_NUM);
// 設(shè)置引腳輸出值,除CS_PIN_NUM輸出為低電平外,其余均為高電平
IOCLR = (1 << CS_PIN_NUM);
IOSET = (1 << DC_PIN_NUM) | (1 << WR_PIN_NUM) | (1 << RD_PIN_NUM);
temp = 0xff << AD0_PIN_NUM;
IOSET = IOSET | temp;
}
uint8 ReadData(void) //從P09702OLED顯示屏讀取數(shù)據(jù)
{ uint32 temp,temp1;
temp1 = IODIR;
IODIR = temp1 & (~(0xff << AD0_PIN_NUM)); // 設(shè)置AD0_PIN_NUM為輸入
IOCLR = 1 << RD_PIN_NUM;
temp = IOPIN;
IOSET = 1 << RD_PIN_NUM;
IODIR = temp1 | (0xff << AD0_PIN_NUM);
temp = temp >> AD0_PIN_NUM;
return (uint8) temp;
}
void WriteCommand(uint8 Data) //寫指令代碼到P09702OLED顯示屏
{ IOCLR = 1 << DC_PIN_NUM;
IOSET = Data << AD0_PIN_NUM;
Data = ~Data;
IOCLR = Data << AD0_PIN_NUM;
IOCLR = 1 << WR_PIN_NUM;
IOSET = 1 << WR_PIN_NUM;
IOSET = 1 << DC_PIN_NUM;
}
void WriteData(uint8 Data) //寫參數(shù)及數(shù)據(jù)到P09702OLED顯示屏
{ IOSET = Data << AD0_PIN_NUM;
Data = ~Data;
IOCLR = Data << AD0_PIN_NUM;
IOCLR = 1 << WR_PIN_NUM;
IOSET = 1 << WR_PIN_NUM;
}
main(){ int j, i;
ExBusInit(); //初始化P09702OLED顯示屏總線
InitOled(); //初始化P09702OLED顯示屏,由于SSD1303軟件控制指令非常豐富,該函數(shù)內(nèi)容較長(zhǎng),在這里不做描述,詳情見P09702應(yīng)用筆記,這里要說明的是:InitOled()中的comm_out2()函數(shù)用WriteCommand()函數(shù)替代
for(i=0;i<8;i++)
WriteCommand (0xB0+i); //設(shè)置顯示位置—行
WriteCommand (0x02); //設(shè)置顯示位置—列低地址
WriteCommand (0x10); //設(shè)置顯示位置—列高地址
for(j=0;j<128;j++)
WriteData((0xFF); //屏幕顯示,全亮
}
}
評(píng)論