[求助] 12864调试

ena   2017-1-20 20:47 楼主
现在有一个12864的屏,采用的是双595扩展的串口,单片机采用的是IAP15W4K61S4,选用的是内部24MHZ的晶振。调了两天没调出来,不知道哪里出了问题!还请大家帮忙看一下。12864采用的是不带字库的,RST脚没接
#include
#define uchar unsigned char
#define uint unsigned int
sbit        EXP_CLK        =        P3^6;
sbit        EXP_DATA        =        P3^7;
sbit        KEY_D_ST1        =        P3^4;
sbit        KEY_C_ST1        =        P3^5;
uchar Port;
void SendCommand(uchar command);
void WriteData(uchar dat);
void LcdDelay(uchar time);
void SetOnOff(uchar onoff);
void ClearScreen(uchar screen);
void SetLine(uchar line);
void SetColum(uchar colum);
void SetStartLine(uchar startline);
void SelectScreen(uchar screen);
void Show1616(uchar lin,uchar colum,uchar *address);
void InitLcd();
void Show_english(uchar lin,uchar colum,uchar *address);
void SendChrToPeriphery(uchar chr);
void SetKeyDisCT(bit bbit);

void delayms(uint ms);
void delayus(uint us);

void InitPort(void)
{       
        P0M1 = 0x00;
        P0M0 = 0x00;
        P0 = 0xe0;
       
        P1M1 = 0xc0;                               
        P1M0 = 0x00;
        P1 = 0xeb;

        P2M1 = 0x00;
        P2M0 = 0x00;
        P2 = 0xfa;
       
        P3M1 = 0x00;
        P3M0 = 0x00;
        P3 = 0;

        P4M1 = 0x00;
        P4M0 = 0x00;
        P4 = 0xe7;

        P5M1 = 0x00;
        P5M0 = 0x00;
        P5 = 0xf9;               
       
        P6M1 = 0x00;
        P6M0 = 0x00;
        P6 = 0x7e;
       
        P7M1 = 0x00;
        P7M0 = 0x00;
        P7 = 0xff;
        WDT_CONTR = 0x35;

}

const uchar code hzk[] =
{


};


void main()
{
   uchar i,line,colum,j ;
   uchar *address ;
         InitPort();
         Port=0xff;
         SendChrToPeriphery(Port);          //ê1Äü
         SetKeyDisCT(1);
         WDT_CONTR = 0x35;
   InitLcd();
   while(1)
  {
                WDT_CONTR = 0x35;
    line=1;       
    colum=0;       
    address=hzk;
    SetOnOff(1);
    for(i=0;i<14;i++)
    {
       if(i<8)       
       {
         SelectScreen(0);
         Show_english(line,colum,address);
         address+=16;
         colum+=8;       
                         }
                        else if(i>=8)
                        {
         if(i<13)       
        {           
          SelectScreen(1);
          Show_english(line,colum,address);
          address+=16;
          colum+=8;
        }
        else       
        {
          Show1616(line,colum,address);
          address+=32;
          colum+=16;       
        }
       }
    }
        }
}

void SendChrToPeriphery(unsigned char chr)   
{
        unsigned char cthr;
        for ( cthr = 0 ;cthr < 8;cthr ++ )
        {
                EXP_DATA = chr & 0x80;                       
                chr <<= 1;
                EXP_CLK = 1;                                       
                EXP_CLK = 0;
        };
}

void SetKeyDisCT(bit bbit)      //μØÖ·ê1Äü½Å
{
                        KEY_C_ST1 = bbit;
            LcdDelay(5);
                        KEY_C_ST1=0;
}

void SetKeyDisDT(bit bbit)        //êy¾Yê1Äü½Å
{
                  KEY_D_ST1 = bbit;
            LcdDelay(5);
                        KEY_D_ST1=0;
}

void LcdDelay(uchar time)      
{
   while(time--);
}

void delayus(uint us)
{
  uint m;
        for(m=0;m         {
     LcdDelay(24);
        }
}

void delayms(uint ms)
{
         uint m;
   for(m=0;m         {
     delayus(1000);
        }
}
void SendCommand(uchar command)     //·¢ËíÃüáî
{
         
         Port&=0xe3;
         SendChrToPeriphery(Port);          //
         SetKeyDisCT(1);
         delayus(500);

   SendChrToPeriphery(command);
         SetKeyDisDT(1);
         
         Port&=0xeb;
         SendChrToPeriphery(0xeb);          //ê1Äü
         SetKeyDisCT(1);
         
         Port&=0xeb;
         SendChrToPeriphery(0xe3);          //ê1Äü
         SetKeyDisCT(1);
       
         delayms(10);
}


void WriteData(uchar dat)           //·¢Ëíêy¾Y
{

         Port&=0xe7;
         SendChrToPeriphery(0xe7);         
         SetKeyDisCT(1);
       
         delayus(500);
       
   SendChrToPeriphery(dat);
         SetKeyDisDT(1);

         Port&=0xef;
         SendChrToPeriphery(0xef);         
         SetKeyDisCT(1);
         
         LcdDelay(130);
         Port&=0xe7;
         SendChrToPeriphery(0xe7);         
         SetKeyDisDT(1);
         
         delayms(10);
}


void SetOnOff(uchar onoff)
{
   if(onoff==1)
  {
    SendCommand(0x3f);
  }
  else
  {
    SendCommand(0x3e);
  }
}



void SetLine(uchar line)
{
   line=line&0x07;       
   line=line|0xb8;       
   SendCommand(line);
}



void SetColum(uchar colum)       
{
   colum=colum&0x3f;       
   colum=colum|0x40;       
   SendCommand(colum);
}



void SetStartLine(uchar startline)
{
   startline=startline&0x3f;
   startline=startline|0xc0;
   SendCommand(startline);
}



void SelectScreen(uchar screen)         //Ñ¡ÔñÆá
{
   switch(screen)
   {
     case 0:
                         Port&=0xfd;
                         SendChrToPeriphery(Port);
                   SetKeyDisCT(1);
             break;
     case 1:
                         Port&=0xfe;
                         SendChrToPeriphery(Port);
                   SetKeyDisCT(1);
             break;
     case 2:
                         Port&=0xfc;
                               SendChrToPeriphery(Port);
                   SetKeyDisCT(1);
             break;
    }
}



void Show1616(uchar lin,uchar colum,uchar *address)  //ÏÔê¾oo×Ö
{
   uchar i;
   SetLine(lin);
   SetColum(colum);
   for(i=0;i<16;i++)
   {
     WriteData(*address);
     address++;
   }
   SetLine(lin+1);
   SetColum(colum);
  for(i=0;i<16;i++)
  {
     WriteData(*address);
     address++;
  }
}



void Show_english(uchar lin,uchar colum,uchar *address)          //ÏÔê¾ó¢ÎÄ
{
  uchar i;
  SetLine(lin);
  SetColum(colum);
  for(i=0;i<8;i++)
  {
   WriteData(*address);
   address++;
  }
  SetLine(lin+1);
  SetColum(colum);
  for(i=0;i<8;i++)
  {
    WriteData(*address);
    address++;
  }
}

void ClearScreen(uchar screen)                 //ÇåÆá
{
   uchar i,j;
   SelectScreen(screen);
   for(i=0;i<8;i++)
   {
     SetLine(i);
     SetColum(0);
     for(j=0;j<64;j++)
     {
       WriteData(0);
     }
   }
}

void InitLcd()
{
  SetOnOff(0);
  ClearScreen(2);
  SetLine(0);
  SetColum(0);
  SetStartLine(0);
  SetOnOff(1);
}

  • QQ截图20170120204358.png

回复评论 (11)

调试1286,先把读写程序写完,往液晶发送数据,看可以不,不行就要考虑时序了,完了再写其他,这两个不能保证,写再多也没用
点赞  2017-1-20 22:16
595没必要,12864有串行模式,想做更快捷的可以用spi操作。
点赞  2017-1-21 01:02

4楼 ena 

引用: huo_hu 发表于 2017-1-21 01:02
595没必要,12864有串行模式,想做更快捷的可以用spi操作。

这种型号的12864只有并口的,而且单片机的串口不够,
点赞  2017-1-21 10:33

5楼 ena 

引用: 数码小叶 发表于 2017-1-20 22:16
调试1286,先把读写程序写完,往液晶发送数据,看可以不,不行就要考虑时序了,完了再写其他,这两个不能保 ...

恩,是的现在就是缩小了很多,可还是不行的
不知道什么原因,RST通过203电阻接的高电平,不测忙,只通过延时函数
点赞  2017-1-21 10:34
引用: ena 发表于 2017-1-21 10:34
恩,是的现在就是缩小了很多,可还是不行的
不知道什么原因,RST通过203电阻接的高电平,不测忙,只通过 ...

我也从来不测忙,关键你这不通用,没法替你调试,有逻辑分析仪没,看看你的595出来的数据好着没,或者接点led也可以。建议你从头重新写个看看,都2天了,万一哪个坑是你一直没发现的就白浪费时间了
点赞  2017-1-21 13:12

7楼 ena 

引用: 数码小叶 发表于 2017-1-21 13:12
我也从来不测忙,关键你这不通用,没法替你调试,有逻辑分析仪没,看看你的595出来的数据好着没,或者接 ...

,何止两天啊
点赞  2017-1-21 19:14

8楼 ena 

引用: 数码小叶 发表于 2017-1-21 13:12
我也从来不测忙,关键你这不通用,没法替你调试,有逻辑分析仪没,看看你的595出来的数据好着没,或者接 ...

如果是只写,R/W脚可不可以一直是低电平?复位脚通过203电阻直接接VCC可以吧?
点赞  2017-1-21 20:47
引用: ena 发表于 2017-1-21 20:47
如果是只写,R/W脚可不可以一直是低电平?复位脚通过203电阻直接接VCC可以吧?

可以,电阻其实都可以省略
点赞  2017-1-21 20:52
引用: ena 发表于 2017-1-21 19:14
,何止两天啊

额。。。。。。一步步来吧,体会过那种好几天卡住的感受,最好让旁边的人帮你看下,这种情况很大可能是自己掉坑了
点赞  2017-1-21 20:54
引用: 数码小叶 发表于 2017-1-21 20:54
额。。。。。。一步步来吧,体会过那种好几天卡住的感受,最好让旁边的人帮你看下,这种情况很大可能是自 ...

主要是也急,现在搞得心都乱了。而且后面还有其他的,这个整不好,下面就没法进行
点赞  2017-1-21 21:09
引用: ena 发表于 2017-1-21 21:09
主要是也急,现在搞得心都乱了。而且后面还有其他的,这个整不好,下面就没法进行

这个时候,你要丢掉之前的所有思维,以一个旁观者的角度,把他当成是别人的设计,重新走一遍,从原理到代码,
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2017-1-22 13:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复