標(biāo)題: 我的OLED點(diǎn)不亮,有大神幫我看看是程序出問(wèn)題了嗎? [打印本頁(yè)]

作者: DYQ_DYQ    時(shí)間: 2018-10-23 18:06
標(biāo)題: 我的OLED點(diǎn)不亮,有大神幫我看看是程序出問(wèn)題了嗎?

/**OLED驅(qū)動(dòng)腳***/
#define   rse   P0_4
#define   sda   P0_2
#define   sck   P0_1

/**********************************************
//
//IIC通信開(kāi)始函數(shù)
//
**********************************************/
void ICC_Start()
{
sda=1;
sck=1;
_nop_();
sda=0;
_nop_();
_nop_();
sck=0;
}
/**********************************************
//
//IIC通信停止函數(shù)
//
**********************************************/
void ICC_Dtop()
{
sda=0;
_nop_();
sck=1;
_nop_();
_nop_();
sda=1;
}
/**********************************************
//
//向IIC寫(xiě)數(shù)據(jù)函數(shù)
//返回值為acknowledgement位信號(hào)
//
**********************************************/
bit  write_IIC_Data(unchar Data)
{
uchar i;
bit ack_bit;       //應(yīng)答型號(hào)
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總線(xiàn)為主器件接收從器件產(chǎn)生應(yīng)答信號(hào)
_nop_();
_nop_();
sck=1;     //第9個(gè)時(shí)鐘周期
_nop_();
_nop_();
ack_bit=sda;              //讀取應(yīng)答信號(hào)
sck=0;
return ack_bit;
}
/**********************************************
//
//寫(xiě)命令函數(shù)
**********************************************/
//
//
void Write_Command(unchar command)
{
ICC_Start();
write_IIC_Data(0x78);     //Salve Adress  從機(jī)地址為0,設(shè)置為寫(xiě)模式
write_IIC_Data(0x00);   //寫(xiě)命令
write_IIC_Data(command);
ICC_Dtop();
}
/**********************************************
//
//寫(xiě)數(shù)據(jù)函數(shù)
//
**********************************************/
//
//
void Write_Data(unchar date)
{
ICC_Start();
write_IIC_Data(0x78);     //Salve Adress  從機(jī)地址為0,設(shè)置為寫(xiě)模式
write_IIC_Data(0x40);     //寫(xiě)數(shù)據(jù)
write_IIC_Data(date);
ICC_Dtop();
}
/**寫(xiě)數(shù)據(jù)還是寫(xiě)命令***/
void  OLED_WR_Byte(unchar dat,bit cmd)
{
if(cmd)
{
  Write_Data(dat);
}
else
{
  Write_Command(dat);
}
}
/********************************************
// 寫(xiě)滿(mǎn)屏
********************************************/
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 這個(gè)是關(guān)閉顯示
   Write_Command(0xd5);     //display divide ratio/osc. freq. mode 分頻比/振蕩器頻率模式設(shè)置
   Write_Command(0x80);     ////分頻比/振蕩器頻率數(shù)據(jù)設(shè)置(80H:+15%,??50H:0%)

   Write_Command(0xA8);     //multiplex ration mode:63 //多路復(fù)用率數(shù)據(jù)設(shè)置?(1:00H,??2:02H,?3:03H,?······??63:3EH,?64:3FH
   Write_Command(0x3F);
   Write_Command(0xD3);     //Set Display Offset   //顯示偏移數(shù)據(jù)設(shè)置?(COM0:00H,?COM1:02H,?COM2:03H,?······?COM62:3EH,?COM63:3FH)
   Write_Command(0x00);
   
   Write_Command(0x40);     //Set Display Start Line 設(shè)置顯示開(kāi)始的行
   
   Write_Command(0xAD);     //DC-DC Control Mode Set 直流轉(zhuǎn)換器電源控制方式設(shè)置(打開(kāi))
   Write_Command(0x8A);     //DC-DC ON/OFF Mode Set   直流轉(zhuǎn)換器電源開(kāi)/關(guān)模式設(shè)置(直流轉(zhuǎn)換禁用:8AH,顯示是直流打開(kāi):8BH)
   Write_Command(0x32);     //Set Pump voltage value
   Write_Command(0xA1);     //Segment Remap  設(shè)置段重新映射(ADC)(正向:A0H,??反向A1H)
   Write_Command(0xC8);     //Sst COM Output Scan Direction 設(shè)置公用邊輸出掃面的方向(從COM0向COM(N-1)掃描:C0H,從com(N-1)向COM0掃描:C8H)
   Write_Command(0xDA);     //common pads hardware: alternative 常見(jiàn)的引腳硬件配置模式設(shè)置
   Write_Command(0x12);    //順序/替代(順序:02H。替代:12H)
   Write_Command(0x81);     //contrast control 對(duì)比度控制模式設(shè)置
   Write_Command(0x6A);    //對(duì)比度控制模式設(shè)置(ISEG   small:00H,Large:FFH,不使用此功能:80H)
   Write_Command(0xD9);     //set pre-charge period   預(yù)充電周期模式設(shè)置
   Write_Command(0x22);      //無(wú)充電周期數(shù)據(jù)設(shè)置
   Write_Command(0xDB);     //VCOM deselect level mode   VCOM取消級(jí)別模式設(shè)置
   Write_Command(0x18);     //40    VCOM取消級(jí)數(shù)據(jù)設(shè)置(VCOM=0.430*VREF:00H,VCOM=0.77*VREF:35H ,VCOM=1*VREF:40H)
   Write_Command(0xA4);     //Set Entire Display On/Off //設(shè)置全屏顯示關(guān)/開(kāi)(正常顯示:A4H,全屏顯示:A5H)
   Write_Command(0xA6);     //Set Normal Display   //設(shè)置正常/反白顯示(正常顯示:A6H,反白顯示:A7H)
   Write_Command(0xAF);     //Set Display On     //這個(gè)開(kāi)顯示
  OLED_Clear();
}
void All_Screen()
{
   uchar page_number,column_number;
   for(page_number=0;page_number<8;page_number++)
   {
     Write_Command(0xb0+page_number);  //設(shè)置頁(yè)面地址(1頁(yè):B0H,2頁(yè):B1H,3頁(yè):B2H,4頁(yè):B3H,5頁(yè):B4H,6頁(yè):B5H,7頁(yè):B6H)
     Write_Command(0x10);//Set?Column?Address?4?lower?bits??設(shè)置列地址低4位(00H--0FH)(0,0,0,0,A3?A2?A1?A0  這兩個(gè)反過(guò)來(lái),懶得換
     Write_Command(0x02);//Set?Column?Address?4?higher?bits??設(shè)置列地址高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);    //設(shè)置頁(yè)地址(0~7)
  OLED_WR_Byte (0x00,0);      //設(shè)置顯示位置—列低地址
  OLED_WR_Byte (0x10,0);      //設(shè)置顯示位置—列高地址   
  for(n=0;n<128;n++)OLED_WR_Byte(0,1);
} //更新顯示
}
void Timer0_Initial(void)
{
    TCON1 = 0x00;      //Tx0定時(shí)器時(shí)鐘為Fosc
TMOD = 0x00;      //16位重裝載定時(shí)器/計(jì)數(shù)器
//Tim0計(jì)算時(shí)間  = (65536 - 0xFACB) * (1 / (Fosc /Timer分頻系數(shù)))
//    = 1333 / (16000000 / 12)
//    = 1 ms
//定時(shí)1ms
//反推初值  = 65536 - ((1/1000) / (1/(Fosc / Timer分頻系數(shù))))
//      = 65536 - ((1/1000) / (1/(16000000 / 12)))
//   = 65536 - 1333
//   = 0xFACB
TH0 = 0xff;
TL0 = 0xde;       //T0定時(shí)時(shí)100us  ,一個(gè)數(shù)走3us
IE |= 0x02;       //打開(kāi)T0中斷
TCON |= 0x10;      //使能T0
   
EA = 1;        //打開(kāi)總中斷
}
void main()
{
POWER_INITIAL();
Init_IC();
All_Screen();
while(1)
{
  fill_picture(0xaa);
}
}
   
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{

}



作者: mengzhixinheng    時(shí)間: 2018-10-24 10:28
如果你確定IIC通信沒(méi)有問(wèn)題,那么初始化序列有可能不對(duì),這個(gè)是可以proteus仿真的,你可以仿真一下就知道了
作者: thl4508    時(shí)間: 2018-10-24 19:11
先確認(rèn)外圍電路是否正確。
作者: 157359    時(shí)間: 2018-10-24 20:14
#include <stc15.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int void delayms(uint z) {         uint i,j;         for(i=z;i>0;i--)         for(j=115;j>0;j--); } void main() {          P2 = 0x01;         while(1)         {                  P2 = _cror_(P2,1);                 delayms(3000);         } }
作者: victory66666666    時(shí)間: 2018-10-25 12:34
如果你確定IIC通信沒(méi)有問(wèn)題,那么初始化序列有可能不對(duì),這個(gè)是可以proteus仿真的,你可以仿真一下就知道了。
作者: 726434632    時(shí)間: 2018-10-25 15:10
OLED模塊后面有幾個(gè)電阻是用來(lái)選擇通信方式的。你確認(rèn)是選中的IIC通信嗎???有的默認(rèn)是SPI通信




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1