搜索
bottom↓
回复: 20

12864串行方式到底能不能读出数据?

[复制链接]

出0入0汤圆

发表于 2013-1-10 00:33:14 | 显示全部楼层 |阅读模式
本帖最后由 xutiemu 于 2013-1-10 00:36 编辑

(驱动芯片ST7920带字库)

关于这个问题,我始终得到的是两种结果:
1,不能,我在这个论坛上至少看到不下十个帖子谈到这个问题,至少不下100人说不能。
2,能。我从这个论坛上我找到一段代码支持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);
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-1-10 00:35:04 | 显示全部楼层
如果芯片本身就不支持串行读出,你发再多指令也无益

出0入0汤圆

发表于 2013-1-10 01:35:26 | 显示全部楼层
ST7920数据手册上原文:
ST7920 is in serial interface mode when pulling down PSB pin. Two pins (SCLK and SID) are used to complete the
data transfer. Only write data is available in the serial interface mode.
另外我看了一下LZ贴的两个代码,第一个返回部分是
return ((0xf0&temp1)+(0x0f&temp2));
第二个返回部分是
        temp=temp|(temp1>>4);
        CECLR;
        DATAOUT;
        return temp;
第一个直接把前一个字节高4位跟后一个字节低4位组合返回
第二个是把前一个字节高4位和后一个字节高四位组合的- -|

出0入0汤圆

发表于 2013-1-10 08:16:02 | 显示全部楼层
st7920有点莫名其妙
应该有其它串行驱动的 芯片 的液晶可以串行读出,不过没试过去折腾

出0入0汤圆

发表于 2013-1-10 08:23:18 | 显示全部楼层
应该是不能.没去折腾 ,话说回来读数据回来有的慢.我是直接建立显存在STM8里.效果很好

出0入0汤圆

 楼主| 发表于 2013-1-10 08:41:13 | 显示全部楼层
dashashi 发表于 2013-1-10 01:35
ST7920数据手册上原文:
ST7920 is in serial interface mode when pulling down PSB pin. Two pins (SCLK a ...

我倾向于2个字节都是高字节的算法,但无论如何,忙标志不会受此影响,GDram一试就能试出来,现在忙标志都不行。

出0入0汤圆

 楼主| 发表于 2013-1-10 08:45:08 | 显示全部楼层
dashashi 发表于 2013-1-10 01:35
ST7920数据手册上原文:
ST7920 is in serial interface mode when pulling down PSB pin. Two pins (SCLK a ...

从英文上看,好像不能,可是为什么有些人就说可以了呢?

出0入0汤圆

 楼主| 发表于 2013-1-10 09:14:50 | 显示全部楼层
zhikai_wu 发表于 2013-1-10 08:23
应该是不能.没去折腾 ,话说回来读数据回来有的慢.我是直接建立显存在STM8里.效果很好 ...

我的m16总过才1k的sram,

出0入0汤圆

发表于 2013-1-10 12:38:06 | 显示全部楼层
串行的好像只能写,不能读!!!

出0入0汤圆

发表于 2013-1-10 14:10:38 | 显示全部楼层
xutiemu 发表于 2013-1-10 09:14
我的m16总过才1k的sram,

换STM8吧,便宜好用

出0入76汤圆

发表于 2013-1-10 21:42:37 | 显示全部楼层
明确的说,串行方式直接从ST7920是没法读出来的。

出0入0汤圆

 楼主| 发表于 2013-1-10 23:24:45 | 显示全部楼层
foxpro2005 发表于 2013-1-10 21:42
明确的说,串行方式直接从ST7920是没法读出来的。

串行方式我已经实现了字符,文字,浮点数,图片的支持,估记打点在不开辟缓存的情况下是无法实现了。
现在我正在写4线并行模式,可以解决这个问题,做到项目级驱动。

出0入76汤圆

发表于 2013-1-10 23:48:20 | 显示全部楼层
xutiemu 发表于 2013-1-10 23:24
串行方式我已经实现了字符,文字,浮点数,图片的支持,估记打点在不开辟缓存的情况下是无法实现了。
现 ...

嗯,预祝你成功,加油....

出0入0汤圆

发表于 2013-1-11 07:34:26 来自手机 | 显示全部楼层
能不能串行读数据,看芯片手册,不过串行一般不支持读

出20入186汤圆

发表于 2013-1-11 08:57:53 | 显示全部楼层
没必要去读,首先串行不需要检测忙标志,第二,显存直接在MCU里就行,也不用读

出0入0汤圆

发表于 2013-1-11 10:32:39 | 显示全部楼层
用并行4线制可以读又省四个IO口

出0入0汤圆

发表于 2013-8-5 18:44:53 | 显示全部楼层
并不是所有的MCU的RAM都多的用不完,你要想想还有许多低成本低RAM的MCU。

出0入0汤圆

发表于 2013-8-5 19:12:59 来自手机 | 显示全部楼层
我接触过的几款数据手册明文表示串行不可读。

出0入0汤圆

发表于 2013-8-6 09:50:20 | 显示全部楼层
曾经也为这个问题困惑,谢谢各位的讨论。

出0入0汤圆

发表于 2014-5-16 11:01:19 | 显示全部楼层
我想知道,我如何在12864上面显示一个16*32的图片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-7-18 13:22:26 | 显示全部楼层
本帖最后由 gosfon 于 2014-7-18 13:27 编辑

别说是串行模式,我在并行模式中读出来的忙标识位总是1,用万用表测得的电压是1.9V左右,参考了好几个代码版本,时序也改了很久。不知道是不是我的LCD12864的问题
后来,我索性不要查忙函数,将延时加长一点,终于好使了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-23 17:27

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

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