前进的每一步,都是学习,是成长。
12864串行方式到底能不能读出数据?
  • 首页 > 嵌入式系统 > 系统与软件设计
  • 作者:最爱香茗
  • 2018年5月22日 23:05 星期二
  • 浏览:264
  • 字号:
  • 评论:0
  • 首先,声名这是转载的帖子,我手里的一块12864验证过没读出来,可能驱动芯片不同吧.
    具体情况要具体分析,有些驱动芯片的是根本就不支持SPI读的,所以如果验证读不到数据,没有必要死磕.

    原文:http://www.amobbs.com/thread-5515648-1-1.html
    (驱动芯片ST7920带字库)
    论坛上我找到一段代码支持spi读LCd12864的忙标志和GDRam数据。代码我我也贴出来。
    /****************************************Copyright (c)****************************************************
    **                               重庆大学电气工程学院
    **                                     
    **                              
    **
    **--------------File Info---------------------------------------------------------------------------------
    ** File Name:               LCD12864.c
    ** Last modified Date:      2009/07/26
    ** Last Version:            V1.10
    ** Description:             LCD QY12864HZ1(st7920驱动芯片)在LM3S615上串行通信的驱动程序
    **
    **--------------------------------------------------------------------------------------------------------
    ** Created By:              张煜欣
    ** Created date:            2009/07/26
    ** Version:                 V1.00
    ** Descriptions:
    **
    **--------------------------------------------------------------------------------------------------------
    ** Modified by:             
    ** Modified date:           
    ** Version:                 
    ** Description:
    **
    *********************************************************************************************************/
    
    #include "Config.H"
    
    /*********************************************************************************************************
    ** Function name:       delayNuS
    ** Descriptions:        延时N个微秒
    ** input parameters:    iTime: 延时时间
    ** output parameters:   无
    ** Returned value:      无
    *********************************************************************************************************/
    void delayNuS (int32 iTime)
    {
        iTime = SysCtlClockGet() * iTime / 2000000;                         /*  根据系统时钟速率确定延时    */
        while (--iTime != 0);
    }
    
    /*********************************************************************************************************
    ** Function name:       LCD_ByteWrite
    ** Descriptions:        向SPI 总线写入1 个字节的数据。
    ** input parameters:    cDat:要写入的数据
    ** output parameters:   无
    ** Returned value:      无
    *********************************************************************************************************/
    void LCD_ByteWrite (int8 cDat)
    {
        int8 cT = 8;
        GPIODirModeSet(LCD_PORT, LCD_DIO, GPIO_DIR_MODE_OUT);    /*  设置DIO端口为输出模式       */
        /*
         *  循环写一个字节的数据
         */
        do {
            GPIOPinWrite(LCD_PORT, LCD_CLK, 0x00);//时钟控制信号
            delayNuS(5);                          //  延时5us
            if((cDat & 0x80) == 0x80) {
                GPIOPinWrite(LCD_PORT, LCD_DIO, 0xff);
            } else {
                GPIOPinWrite(LCD_PORT, LCD_DIO, 0x00);
            }
            cDat <<= 1;
            GPIOPinWrite(LCD_PORT, LCD_CLK, 0xff);//时钟控制信号
            delayNuS(5);                          //  延时5us
        } while (--cT != 0);
    }
    
    
    /*********************************************************************************************************
    ** Function name:       LCD_ByteRead
    ** Descriptions:        从SPI 总线读取1 个字节的数据。
    ** input parameters:    无
    ** output parameters:   无
    ** Returned value:      读取到的数据
    *********************************************************************************************************/
    uint8 LCD_ByteRead (void)
    {
         uint8 i,temp1,temp2;
         temp1 = 0;
         temp2 = 0;
         GPIODirModeSet(LCD_PORT, LCD_DIO, GPIO_DIR_MODE_IN);     /* 设置DIO端口为输入模式        */
         for(i=0;i<8;i++)
         {
               temp1=temp1<<1;
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0x00);//时钟控制信号
               delayNuS(5); 
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0xFF);
               delayNuS(5); 
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0x00);
               delayNuS(5); 
               //SCK = 0;
               //SCK = 1;            
               //SCK = 0;
               if(GPIOPinRead(LCD_PORT, LCD_DIO)) 
                  temp1++;
         }
         for(i=0;i<8;i++)
         {
               temp2=temp2<<1;
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0x00);//时钟控制信号
               delayNuS(5); 
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0xFF);
               delayNuS(5); 
               GPIOPinWrite(LCD_PORT, LCD_CLK, 0x00);
               delayNuS(5); 
               //SCK = 0;
               //SCK = 1;            
               //SCK = 0;
               if(GPIOPinRead(LCD_PORT, LCD_DIO)) 
                  temp2++;
         }
         GPIOPinTypeGPIOOutput( LCD_PORT , LCD_DIO ); 
         return ((0xf0&temp1)+(0x0f&temp2));
    }
    
    /******************************************************************************************
    * 函数名称    :CheckBusy
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    * 
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void CheckBusy(void)
    {
         do
         {  
            LCD_ByteWrite(0xFC);            //11111,RW(1),RS(0),0
         }while(0x80&LCD_ByteRead());        //BF(.7)=1 Busy
    } -=========================================================================================》》》》》 还有从网上无意中看到郭天祥关于这个问题的代码,他同样给出了串行下读数据的例子,(附上文本地址GTXlcd12864串行驱动)我照着这两个版本移植了代码,发现读出的忙标志始终是 1。且读出的GDram的值始终是0xff。 我想说不可以的答案的可行性可能有一千种也说不定,比如代码有这样的那样的问题,未必真读不出来。但一旦有人读出来就说明真的能读出来。排除有的液晶支持,有的液晶不支持这个微小的可能性 代码出问题的可能性还是最大的。可是问题究竟出来哪里呢?都快一点钟了,我纠结的毫无睡意!真理在哪里啊? 这是我的代码,虽然是老问题,可是还是不能很好的解决,好没有成就感啊。
    
    uint8 lcd_rdByte(void)
    {
       uint8 temp=0,i,temp1=0;   
       DATAIN;//将sid设置为输入
       
            
            CESET;
            NOP();
            CECLR;
            NOP();
            CESET;
    
            SCKCLR;
            for(i=0;i<8;i++)
            {
              temp<<=1;
              SCKSET;
              if(PIN)
              {temp|=0x01;}
              SCKCLR;
            }
            
            temp&=0xf0;
            for(i=0;i<8;i++)
            {
              temp1<<=1;
              SCKSET;
              if(PIN)
              {temp1|=0x01;}
              SCKCLR;
            }
            temp1&=0xf0;
            
            temp=temp|(temp1>>4);
            CECLR;
            DATAOUT;
            return temp;
    }
    
    
    void check_busy(void)
    {  uint8 temp=0xff;
       do{
           lcd_wrByte(0xfc);//11111,rw 1,rs 0 ,0
               temp=lcd_rdByte();
               temp=temp&0x80;
         } while(temp); 
    }
    
     
      您阅读这篇文章共花了:  
    二维码加载中...
    本文作者:最爱香茗      文章标题: 12864串行方式到底能不能读出数据?
    本文地址:http://www.gcsjl8.com/?post=129
    版权声明:若无注明,本文皆为“成长记忆”原创,转载请保留文章出处。