搜索
bottom↓
回复: 3

菜鸟求助 SSD1303 OLED,12864 不显示

[复制链接]

出0入0汤圆

发表于 2011-1-5 12:40:42 | 显示全部楼层 |阅读模式
菜鸟向大家求助。
有块OLED屏,驱动芯片是SSD1303,用C8051F120单片控制,数据由单片串行输出后锁存,并行输出给屏,驱动程序用陈超的,问题如下:
void ini_dis(void)
{
        unsigned char i,j;
        for(i=0;i<8;i++)
        {
                WriteCommand (0xb0+i);    //设置显示位置—行
                WriteCommand (0x00);      //设置显示位置—列低地址
                WriteCommand (0x10);      //设置显示位置—列高地址
                for(j=0;j<128;j++)
                WriteData(0x00);        //屏幕显示,全亮
        }
}
执行到上面程序屏幕全亮时,屏没有显示,用逻辑分析仪看,所有初始化命令都能走完,走到此处,在i=0,j=90时程序跑飞了好像,又开始初始化的操作。请大家看看我的问题出在哪里了,谢谢~~!!


程序如下:
#include "C8051F120.H"
#include <intrins.h>  



sbit OLED_DC=P5^1;
sbit OLED_WR=P5^2;
sbit OLED_RD=P5^3;
sbit OLED_RES=P5^4;
sbit OLED_CS=P5^6;



unsigned char code matrix1[32]={0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
      0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
      0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
      0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10}; //时
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role: 系统端口初始化
//--------------------------------------------------
void  IOPort_INIT()
{
    char SFRPAGE_SAVE = SFRPAGE;     // Save Current SFR page

   SFRPAGE = CONFIG_PAGE;           // set SFR page
   
   P0MDOUT |= 0xff;
  // P1MDOUT = 0xf7;                 // Set P1.6(TB_LED) to push-pull
   P1MDOUT = 0xB7;
   P2MDOUT |= 0xff;                 // Set P2.2(AB4_LED1)
   // all pins used by the external memory interface are in push-pull mode
   P4MDOUT =  0xfF;
   P5MDOUT =  0xFF;                 //  P5MDOUT =  0x5F;
   P6MDOUT =  0xFF;
   P7MDOUT =  0xFF;
   P3MDOUT|=0x80;
  
  // P0 &=~0x08;
   P0 = 0xFF;
   P1 = 0xA3;
   P2 = 0xbB;
   P3 = 0x2c;  
   P4 = 0xe5;                       // /OLED_WR, /OLED_RD, are high, OLED_RESET is low
   P5 = 0xFF;                     
   P6 = 0xFF;                       // P5, P6 contain the addOLED_RESs lines
   P7 = 0xFF;                       // P7 contains the data lines


   SFRPAGE = 0;
   TCON |= 0x04;  
   SFRPAGE = CONFIG_PAGE;                  // Make /INT0 level triggered

   // Enable UART0, CP0, and /INT0. This puts /INT0 on P0.3.
    XBR0      = 0x06;
    XBR1      = 0x14;
    XBR2      = 0x44;

   SFRPAGE = SFRPAGE_SAVE;       // OLED_REStore SFR page
}


//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:系统时钟初始化
//--------------------------------------------------
void  SYSTEMCLK_INIT()
{
      
    char SFRPAGE_SAVE = SFRPAGE;     // Save Current SFR page
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    PLL0CN    = 0x04;
    CCH0CN    &= ~0x20;
    SFRPAGE   = LEGACY_PAGE;
    FLSCL     = 0xB0;
    SFRPAGE   = CONFIG_PAGE;
    CCH0CN    |= 0x20;
    PLL0CN    |= 0x01;
    PLL0DIV   = 0x01;
    PLL0FLT   = 0x01;
    PLL0MUL   = 0x04;
    for (i = 0; i < 30; i++);  // Wait 5us for initialization
    PLL0CN    |= 0x02;
    while ((PLL0CN & 0x10) == 0);
    CLKSEL    = 0x02;                               
   SFRPAGE = SFRPAGE_SAVE;          // OLED_REStore SFR page
}               
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:延时
//--------------------------------------------------
void Delay()        //4.5us
{
   unsigned char i;

   for(i=0;i<100;i++)
      _nop_();
      
}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED写命令
//--------------------------------------------------
void OLED_Command(unsigned char Command)
{
  unsigned char i,cache;

  SFRPAGE = CONFIG_PAGE;
   
    P2 &=~(1<<0);
        P2 &=~(1<<1); //送数时钟       
        P2 &=~(1<<2); //锁存输出时钟

        for(i=0;i<8;i++)
        {  
          cache=(Command>>i);
          cache &=0x01;
          if(1==cache)
            {
            P2 |=(1<<0);  
            }
          else
            {
            P2 &=~(1<<0);           
            }

            P2 |=(1<<1);                              
                Delay();          
            P2 &=~(1<<1);  
                                    
         }       
           OLED_WR=0;
           //Delay();
           OLED_DC=1;
                      
           OLED_RD=1;
       OLED_CS=0;                       
                      
           P2 |=(1<<2);
           Delay();                             
           P2 &=~(1<<2);

       Delay();
           Delay();
       OLED_WR=1;
       OLED_CS=1;
          
}       
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED写数据
//--------------------------------------------------
void OLED_Data(unsigned char Data)
{
  unsigned char i,cache;

  SFRPAGE = CONFIG_PAGE;
   
    P2 &=~(1<<0);
        P2 &=~(1<<1); //送数时钟       
        P2 &=~(1<<2); //锁存输出时钟

        for(i=0;i<8;i++)
        {  
          cache=(Data>>i);
          cache &=0x01;
          if(1==cache)
            {
            P2 |=(1<<0);  
            }
          else
            {
            P2 &=~(1<<0);           
            }

            P2 |=(1<<1);                              
                Delay();          
            P2 &=~(1<<1);  
                                    
         }       
           OLED_WR=0;
           Delay();
           OLED_DC=0;            
           OLED_RD=1;
       OLED_CS=0;                       
                      
           P2 |=(1<<2);
           Delay();                             
           P2 &=~(1<<2);

       Delay();
           Delay();
       OLED_WR=1;
       OLED_CS=1;
          
}  
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED驱动芯片SSD1303初始化
//--------------------------------------------------
void SSD_INIT()
{
    OLED_RES=0;
    Delay();
    OLED_RES=1;
    Delay();

    OLED_Command(0xae); //display off
    OLED_Command(0x41); //display start line 00000
    OLED_Command(0x81); //contrast
    OLED_Command(0x80);
    OLED_Command(0x82); //brightness
    OLED_Command(0x80);
    OLED_Command(0xa0); //no remap
    OLED_Command(0xa4); //intire display off
    OLED_Command(0xa6); //normal display
    OLED_Command(0xa8); //39 mux
    OLED_Command(0x39);
    OLED_Command(0xad); //DCDC off
    OLED_Command(0x8a);
    OLED_Command(0xc8); //scan from COM[N-1] to COM0
    OLED_Command(0xd3); //row 0->com 62
    OLED_Command(0x23);
    OLED_Command(0xd8); //mono mode,normal power mode
    OLED_Command(0x00);
    OLED_Command(0xda); //alternative COM pin configuration
    OLED_Command(0x12);
    OLED_Command(0xaf); //display on
}


//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:OLED初始化(全亮)
//--------------------------------------------------
void OLED_INIT()
{  
        unsigned char i,j;
        unsigned char k=0;
    for(i=0;i<4;i++)
       {
             OLED_Command(0xb0+i);  
             OLED_Command(0x00);
         OLED_Command(0x10);
             for(j=0;j<128;j++)
                {
                     OLED_Data(0x00);//全亮
                }          
           }


   

}
//--------------------------------------------------
// No:
// Name:
// Caller:
// Role:
//--------------------------------------------------
void main (void)
{          
    IOPort_INIT();
    SYSTEMCLK_INIT();   
        SSD_INIT();   
        OLED_INIT();     
}

出0入0汤圆

发表于 2011-1-5 13:21:00 | 显示全部楼层
单片机复位了吧

出0入0汤圆

 楼主| 发表于 2011-1-5 16:13:27 | 显示全部楼层
单片机不应该复位啊,程序都没有走完。如果是单片机复位了,请问该怎么解决呢?

出0入0汤圆

 楼主| 发表于 2011-1-6 19:36:13 | 显示全部楼层
已解决,是看门狗的问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 03:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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