找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10377|回复: 5
打印 上一主题 下一主题
收起左侧

我的OLED点不亮,有大神帮我看看是程序出问题了吗?

[复制链接]
跳转到指定楼层
楼主
ID:287770 发表于 2018-10-23 18:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币

/**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
{

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:89515 发表于 2018-10-24 10:28 | 只看该作者
如果你确定IIC通信没有问题,那么初始化序列有可能不对,这个是可以proteus仿真的,你可以仿真一下就知道了
回复

使用道具 举报

板凳
ID:414822 发表于 2018-10-24 19:11 | 只看该作者
先确认外围电路是否正确。
回复

使用道具 举报

地板
ID:414859 发表于 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);         } }
回复

使用道具 举报

5#
ID:384396 发表于 2018-10-25 12:34 | 只看该作者
如果你确定IIC通信没有问题,那么初始化序列有可能不对,这个是可以proteus仿真的,你可以仿真一下就知道了。
回复

使用道具 举报

6#
ID:98526 发表于 2018-10-25 15:10 | 只看该作者
OLED模块后面有几个电阻是用来选择通信方式的。你确认是选中的IIC通信吗???有的默认是SPI通信
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表