/**OLED驅動腳***/
#define rse P0_4
#define sda P0_2
#define sck P0_1
/**********************************************
//
//IIC通信開始函數
//
**********************************************/
void ICC_Start()
{
sda=1;
sck=1;
_nop_();
sda=0;
_nop_();
_nop_();
sck=0;
}
/**********************************************
//
//IIC通信停止函數
//
**********************************************/
void ICC_Dtop()
{
sda=0;
_nop_();
sck=1;
_nop_();
_nop_();
sda=1;
}
/**********************************************
//
//向IIC寫數據函數
//返回值為acknowledgement位信號
//
**********************************************/
bit write_IIC_Data(unchar Data)
{
uchar i;
bit ack_bit; //應答型號
for(i=0;i<8;i++)
{
if(Data&0x80)
{
sda=1;
}
else
{
sda=0;
}
_nop_();
sck=1;
_nop_();
_nop_();
sck=0;
Data=Data<<1;
}
sda=1; //釋放IIC SDA總線為主器件接收從器件產生應答信號
_nop_();
_nop_();
sck=1; //第9個時鐘周期
_nop_();
_nop_();
ack_bit=sda; //讀取應答信號
sck=0;
return ack_bit;
}
/**********************************************
//
//寫命令函數
**********************************************/
//
//
void Write_Command(unchar command)
{
ICC_Start();
write_IIC_Data(0x78); //Salve Adress 從機地址為0,設置為寫模式
write_IIC_Data(0x00); //寫命令
write_IIC_Data(command);
ICC_Dtop();
}
/**********************************************
//
//寫數據函數
//
**********************************************/
//
//
void Write_Data(unchar date)
{
ICC_Start();
write_IIC_Data(0x78); //Salve Adress 從機地址為0,設置為寫模式
write_IIC_Data(0x40); //寫數據
write_IIC_Data(date);
ICC_Dtop();
}
/**寫數據還是寫命令***/
void OLED_WR_Byte(unchar dat,bit cmd)
{
if(cmd)
{
Write_Data(dat);
}
else
{
Write_Command(dat);
}
}
/********************************************
// 寫滿屏
********************************************/
void fill_picture(unsigned char fill_Data)
{
unsigned char m,n;
for(m=0;m<8;m++)
{
OLED_WR_Byte(0xb0+m,0); //page0-page1
OLED_WR_Byte(0x00,0); //low column start address
OLED_WR_Byte(0x10,0); //high column start address
for(n=0;n<128;n++)
{
OLED_WR_Byte(fill_Data,1);
}
}
}
void Init_IC()
{
rse=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
rse=1;
Write_Command(0xAE); //Set Display Off 這個是關閉顯示
Write_Command(0xd5); //display divide ratio/osc. freq. mode 分頻比/振蕩器頻率模式設置
Write_Command(0x80); ////分頻比/振蕩器頻率數據設置(80H:+15%,??50H:0%)
Write_Command(0xA8); //multiplex ration mode:63 //多路復用率數據設置?(1:00H,??2:02H,?3:03H,?······??63:3EH,?64:3FH
Write_Command(0x3F);
Write_Command(0xD3); //Set Display Offset //顯示偏移數據設置?(COM0:00H,?COM1:02H,?COM2:03H,?······?COM62:3EH,?COM63:3FH)
Write_Command(0x00);
Write_Command(0x40); //Set Display Start Line 設置顯示開始的行
Write_Command(0xAD); //DC-DC Control Mode Set 直流轉換器電源控制方式設置(打開)
Write_Command(0x8A); //DC-DC ON/OFF Mode Set 直流轉換器電源開/關模式設置(直流轉換禁用:8AH,顯示是直流打開:8BH)
Write_Command(0x32); //Set Pump voltage value
Write_Command(0xA1); //Segment Remap 設置段重新映射(ADC)(正向:A0H,??反向A1H)
Write_Command(0xC8); //Sst COM Output Scan Direction 設置公用邊輸出掃面的方向(從COM0向COM(N-1)掃描:C0H,從com(N-1)向COM0掃描:C8H)
Write_Command(0xDA); //common pads hardware: alternative 常見的引腳硬件配置模式設置
Write_Command(0x12); //順序/替代(順序:02H。替代:12H)
Write_Command(0x81); //contrast control 對比度控制模式設置
Write_Command(0x6A); //對比度控制模式設置(ISEG small:00H,Large:FFH,不使用此功能:80H)
Write_Command(0xD9); //set pre-charge period 預充電周期模式設置
Write_Command(0x22); //無充電周期數據設置
Write_Command(0xDB); //VCOM deselect level mode VCOM取消級別模式設置
Write_Command(0x18); //40 VCOM取消級數據設置(VCOM=0.430*VREF:00H,VCOM=0.77*VREF:35H ,VCOM=1*VREF:40H)
Write_Command(0xA4); //Set Entire Display On/Off //設置全屏顯示關/開(正常顯示:A4H,全屏顯示:A5H)
Write_Command(0xA6); //Set Normal Display //設置正常/反白顯示(正常顯示:A6H,反白顯示:A7H)
Write_Command(0xAF); //Set Display On //這個開顯示
OLED_Clear();
}
void All_Screen()
{
uchar page_number,column_number;
for(page_number=0;page_number<8;page_number++)
{
Write_Command(0xb0+page_number); //設置頁面地址(1頁:B0H,2頁:B1H,3頁:B2H,4頁:B3H,5頁:B4H,6頁:B5H,7頁:B6H)
Write_Command(0x10);//Set?Column?Address?4?lower?bits??設置列地址低4位(00H--0FH)(0,0,0,0,A3?A2?A1?A0 這兩個反過來,懶得換
Write_Command(0x02);//Set?Column?Address?4?higher?bits??設置列地址高4位(10H--17H)(0,0,0,1,A7?A6?A5?A4
for(column_number=0;column_number<128;column_number++)
{
Write_Data(0xff);
}
}
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,0); //設置頁地址(0~7)
OLED_WR_Byte (0x00,0); //設置顯示位置—列低地址
OLED_WR_Byte (0x10,0); //設置顯示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(0,1);
} //更新顯示
}
void Timer0_Initial(void)
{
TCON1 = 0x00; //Tx0定時器時鐘為Fosc
TMOD = 0x00; //16位重裝載定時器/計數器
//Tim0計算時間 = (65536 - 0xFACB) * (1 / (Fosc /Timer分頻系數))
// = 1333 / (16000000 / 12)
// = 1 ms
//定時1ms
//反推初值 = 65536 - ((1/1000) / (1/(Fosc / Timer分頻系數)))
// = 65536 - ((1/1000) / (1/(16000000 / 12)))
// = 65536 - 1333
// = 0xFACB
TH0 = 0xff;
TL0 = 0xde; //T0定時時100us ,一個數走3us
IE |= 0x02; //打開T0中斷
TCON |= 0x10; //使能T0
EA = 1; //打開總中斷
}
void main()
{
POWER_INITIAL();
Init_IC();
All_Screen();
while(1)
{
fill_picture(0xaa);
}
}
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{
}
|