[原创] 解决了一个不可解决的问题

ddllxxrr   2011-7-15 10:26 楼主

 

一块段显小屏,LCM046 一个单片机STC89C58RD+,一个串口下载器。

 

要完成一个大任务的一个小部分-----------点亮段式LCD。

 

呵呵,这个对我来说小菜一盘,没太在意。

 

因为我以前就点亮过只不过那个东东存在(对人)安全的问题,木有投产。

 

喝一会儿荼,看了一会网,拿起电烙焍开干哈。

 

不到20分实验板搭完,下载很顺利。

 

可是一加电,我的天啊,不显示。

 

由于这个程序是我以前调通的,所以很是吃惊。查了下资料又查了下程序,到晚上还是没搞定。

 

第二天,我查了管脚波形都有啊,娘地。我又从网上找来例程下了,还是不显,我又换了一块屏,由于这个屏,我手

 

里有一块,换上去还不显示。我晕。。。。就这样第二天在欲闷中度过。

 

第三天来了,我在网上买的东东到,是个大东东,检查了一天,没事,我又点了下屏还是不亮。我要极度闷了。

 

今天来了,我发动总攻。用示波仔细观察,见CS和WR都一样,但我单片机就只有一片,因为这个是实验电路。

 

莫非是片子??????

 

我就一片啊,且下载完好。

 

聪明人总是有办法地,你看那个聪字,就是说耳朵总是明地。

 

我把以前的CS WR DA换到了P0.0 P0.1 P0.2,以前为P1.0 P1.1 P1.2 我把程序下进。

 

你猜怎么着。。。。。

 

清清楚楚地显示着1234。

 

附程序

 

#include <reg51.H>
/*cs=p0.7   WRPort=p0.5    data=p0.4*/
sbit CS=P0^0;//P0^7 ;
sbit WRPort=P0^1;//P0^5;
sbit DA=P0^2;//P0^4;
///////////////////////////////////////////////////////////
void timedelay(unsigned int time);
void WRPortcom(unsigned char *p);
void WRPortdd(unsigned char *p);
void WRPortda(unsigned char *p);
void walp(unsigned char *p);
void clearLCD();
void Set1(unsigned char wei,unsigned char n);
void SetNum(unsigned int num);
///////////////////////////////////////////////////////////
unsigned char command;
unsigned char lcdaddr;
unsigned char lcddata;
const unsigned char nums[10]={0xEB,0x60,0xAD,0x8F,0x4E,0xC7,0xE7,0x8A,0xEF,0xCF};    // 0--9 数字对应表
///////////////////////////////////////////////////////////
void main(void)
{
    unsigned char *p;
    p=&command;
    CS=1;
    WRPort=1;
    DA=1;
    timedelay(500);

    *p=0x29;    WRPortcom(p);   //initialize
    *p=0x18;    WRPortcom(p); //rc
    *p=0x01;    WRPortcom(p);   //sys en
    *p=0x03;    WRPortcom(p);   //lcd on
    *p=0x05;    WRPortcom(p);   //close WDT

    clearLCD();

    while(1)
      {
        SetNum(1234);   
      }       
}
///////////////////////////////////////////////////////////
//          基本硬件操作                                ///
///////////////////////////////////////////////////////////

void WRPortcom(unsigned char *p)
{  
    unsigned char i;
    CS=1; timedelay(3);   CS=0; timedelay(3);
    WRPort=0; timedelay(3);   DA=1; timedelay(3);   WRPort=1; timedelay(3);
    WRPort=0; timedelay(3);   DA=0; timedelay(3);   WRPort=1; timedelay(3);
    WRPort=0; timedelay(3);   DA=0; timedelay(3);   WRPort=1; timedelay(3);

    for(i=8;i>0;i--)
    {
     timedelay(3);
     if(*p&0x80) 
      {
        DA=1;timedelay(3);
      } 
     else   
      {
        DA=0;timedelay(3);
      }
        WRPort=0;timedelay(5);
        WRPort=1;timedelay(5);
        *p=(*p)<<1; 
    }

    DA=0;timedelay(3);
        WRPort=0;timedelay(5);
    WRPort=1;timedelay(5);
    CS=1;timedelay(3);
    DA=1;timedelay(3);
}
///////////////////////////////////////////////////////////
void WRPortdd(unsigned char *p)
{  
    unsigned char i;
    CS=1; timedelay(10);  CS=0; timedelay(10);
    WRPort=0; timedelay(3);   DA=1; timedelay(3);   WRPort=1; timedelay(3);
    WRPort=0; timedelay(3);   DA=0; timedelay(3);   WRPort=1; timedelay(3);
    WRPort=0; timedelay(3);   DA=1; timedelay(3);   WRPort=1; timedelay(3);
    WRPort=0; timedelay(3);   DA=0; timedelay(3);   WRPort=1; timedelay(3);

    for(i=5;i>0;i--)
    {
      if(*p&0x80) 
      {
        DA=1;timedelay(3);
      } 
      else   
      {
        DA=0;timedelay(3);
      }
      WRPort=0;timedelay(5);
      WRPort=1;timedelay(5);
      *p=(*p)<<1; 
    }


}
///////////////////////////////////////////////////////////
void WRPortda(unsigned char *p)
{
    unsigned char i;
    for(i=4;i>0;i--)
       {

          if(*p&0x01) 
     {
          DA=1;timedelay(3);
     } 
          else   
     {
          DA=0;timedelay(3);
     }
          WRPort=0;timedelay(5);
          WRPort=1;timedelay(5);
          *p=(*p)>>1; 
       }
}
///////////////////////////////////////////////////////////
void timedelay(unsigned int s)          // s*10 (us)
{
   int i,j;
   for(i=0;i<10;i++)
   for (j=0;j<s;j++);
}
///////////////////////////////////////////////////////////
void clearLCD()                         //清LCD屏
{
    unsigned char i;
    CS=1; timedelay(3);   CS=0; timedelay(3);
    lcdaddr=0x00;                   //地址开始

    for (i=0;i<8;i++)
    {
      lcddata=0x00;  
      WRPortdd(&lcdaddr);      
      WRPortda(&lcddata);
      WRPort=1;
      DA=1;
      CS=1;                       //写一个地址结束(一条数据4位)
      timedelay(10);
          lcdaddr=lcdaddr+0x08*(i+1);   //清屏data
    }
}

 

///////////////////////////////////////////////////////////
//              数据显示                                 //
///////////////////////////////////////////////////////////
void Set1(unsigned char wei,unsigned char n)
{
     unsigned char i;
     CS=1;    timedelay(3);
     CS=0;    timedelay(3);
         lcdaddr=0x00+(wei-1)*2*8;           //取前5位作为A0--A4
     lcddata=nums[n];
     WRPortdd(&lcdaddr);
   
     for(i=8;i>0;i--)
          {
         if(lcddata&0x80) 
          {
            DA=1;timedelay(3);
          } 
         else   
          {
            DA=0;timedelay(3);
          }
         WRPort=0;timedelay(5);
         WRPort=1;timedelay(5);
         lcddata=(lcddata)<<1; 
          }
}
///////////////////////////////////////////////////////////
void SetNum(unsigned int num)
{  
    Set1( 1,(num/1000) );
    Set1( 2,(num/100)%10 );
    Set1( 3,(num/10)%10 );
    Set1( 4,num%10 ); 
}


 

 

ZXC.bmp

 

 

原来是P1.1同P1.0管脚坏了,他俩谁变都根着变。不敢保留写出分享,呵呵

 

 

[ 本帖最后由 ddllxxrr 于 2011-7-15 10:28 编辑 ]
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复评论 (3)

编程编的不错啊
点赞  2011-7-15 11:49
嘿嘿,是啊,有时候钻到死胡同里然后突然来了灵感一下解决问题的感觉确实很爽啊
点赞  2011-7-15 12:04
IO失效这个太恼人了
点赞  2011-7-15 12:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复