打印
[MSP430]

新人头回发帖,求助大神,关于lcd1602乱码的问题

[复制链接]
1666|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呢哝我弄|  楼主 | 2014-4-28 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:

#include <msp430g2553.h>
#define uchar unsigned char
#ifndef _CRY1602_H
#define _CRY1602_H
#define uchar unsigned char
#define uint unsigned int
void DispStr(uchar x,uchar y,uchar *ptr);
void LocateXY(uchar x,uchar y);
void Disp1Char(uchar x,uchar y,uchar data);
void LcdReset(void);
void LcdWriteCommand(uchar cmd,uchar chk);
void LcdWriteData(uchar data);
void WaitForEnable(void);
void Delay5ms(void);
#endif
uchar *s1 = "                AN HONG ";
uchar *s3 = "                are you out of mind";                                       
#define datadir  P1DIR
#define dataport P1OUT
#define busy     0x80
#define ctrldir  P2DIR
#define CLR_RS P2OUT &= ~BIT0;      //RS = P2.0
#define SET_RS P2OUT |= BIT0;
#define CLR_RW P2OUT &= ~BIT1;      //RW = P2.1
#define SET_RW P2OUT |= BIT1;
#define CLR_EN P2OUT &= ~BIT2;      //EN = P2.2
#define SET_EN P2OUT |= BIT2;
void main(void)
{
        WDTCTL = WDT_ADLY_250;        //间隔定时器,定时250ms
        uchar *s2,*s4;
        uchar j,k,l,j1,k1,l1;
        uchar i = 0,i1=0;
        s2 = s1;
        s4 = s3;
        LcdReset();
        while(*s1++ != '\0') i++;        //计算字符串有效字符个数
        while(*s3++ != '\0') i1++;
        while(1)
        {
                for(j = 0;j < i;j++)
                {
                        l = j;
                        for(k = 0;k<16;k++)
                        {
                                if(l < i)
                                        Disp1Char(k,2,s2[l++]);
                                else
                                        Disp1Char(k,2,' ');
                        }
                        IFG1 &= ~WDTIFG;            //清除中断失效标志
                        while(!(IFG1 & WDTIFG));
                        IFG1 &= ~WDTIFG;
                }
       
                for(j1 = 0;j1 < i1;j1++)
                {
                        l1 = j1;
                        for(k1 = 0;k1<16;k1++)
                        {
                                if(l < i1)
                                        Disp1Char(k1,1,s4[l1++]);
                                else
                                        Disp1Char(k1,1,' ');
                        }
                        IFG1 &= ~WDTIFG;            //清除中断失效标志
                        while(!(IFG1 & WDTIFG));
                        IFG1 &= ~WDTIFG;
                }
       
     }
}


void DispStr(uchar x,uchar y,uchar *ptr)
{
  uchar *temp;
  uchar i,n = 0;
  temp = ptr;
  while(*ptr++ != '\0') n++;        //计算字符串有效字符个数
  for(i = 0; i < n; i++)
  {
    Disp1Char(x++,y,temp[i]);
    if(x == 0x0f)
    {
      x = 0;
      y ^= 1;
    }
  }
}

void LocateXY(uchar x,uchar y)
{
  uchar temp;
  temp = x&0x0f;
  y &= 0x01;
  if(y)   temp |= 0x40;//如果在第2行
  temp |= 0x80;
  LcdWriteCommand(temp,1);
}
void Disp1Char(uchar x,uchar y,uchar data)
{
  LocateXY(x,y);
  LcdWriteData(data);
}
void LcdReset(void)
{
  ctrldir |= 0x07;              //控制线端口设为输出状态
  datadir = 0xff;               //数据端口设为输出状态
  LcdWriteCommand(0x38,0);      //规定的复位操作
  Delay5ms();
  LcdWriteCommand(0x38,0);
  Delay5ms();
  LcdWriteCommand(0x38,0);
  Delay5ms();
  LcdWriteCommand(0x38,1);      //显示模式设置
  LcdWriteCommand(0x08,1);      //显示关闭
  LcdWriteCommand(0x01,1);      //显示清屏
  LcdWriteCommand(0x06,1);      //写字符时整体不移动
  LcdWriteCommand(0x0c,1);      //显示开,不开游标,不闪烁
}
void LcdWriteCommand(uchar cmd,uchar chk)
{
  if(chk) WaitForEnable();        //检测忙信号?
  CLR_RS;
  CLR_RW;
  _NOP();
  dataport = cmd;               //将命令字写入数据端口
  _NOP();
  SET_EN;                     //产生使能脉冲信号
  _NOP();
  _NOP();
  CLR_EN;
}
void LcdWriteData(uchar data)
{
  WaitForEnable();        //等待液晶不忙
  SET_RS;
  CLR_RW;
  _NOP();
  dataport = data;        //将四显示数据写入数据端口
  _NOP();
  SET_EN;                 //产生使能脉冲信号
  _NOP();
  _NOP();
  CLR_EN;
}
void WaitForEnable(void)
{
  P1DIR &= 0X00;          //将P1口切换为输入状态
  CLR_RS;
  SET_RW;
  _NOP();
  SET_EN;
  _NOP();
  _NOP();
  while((P1IN & busy) != 0);    //检测忙标志
  CLR_EN;
  P1DIR |= 0xff;      //将P1口切换为输出状态
}
void Delay5ms(void)
{
  uint i = 40000;
  while(i != 0)
  { i--;}
}
预期效果,上一行滚完“an。。。。”之后,下一行开始滚“are。。。”,如此往复。
可是在第二行滚完后紧接着跟出了一堆乱码,才开始继续循环,求大神解释

相关帖子

沙发
wangch_sh| | 2014-4-28 18:00 | 只看该作者
网上好多例子,对比一下时序。

使用特权

评论回复
板凳
呢哝我弄|  楼主 | 2014-4-28 19:25 | 只看该作者
wangch_sh 发表于 2014-4-28 18:00
网上好多例子,对比一下时序。

时序没问题啊

使用特权

评论回复
地板
ningling_21| | 2014-4-28 20:10 | 只看该作者
呢哝我弄 发表于 2014-4-28 19:25
时序没问题啊

时序没问题,用示波器对过了吗?

使用特权

评论回复
5
呢哝我弄|  楼主 | 2014-4-28 21:40 | 只看该作者
ningling_21 发表于 2014-4-28 20:10
时序没问题,用示波器对过了吗?

没有,咋对,表示是初学者,不太懂

使用特权

评论回复
6
ningling_21| | 2014-4-28 21:52 | 只看该作者
本帖最后由 ningling_21 于 2014-4-28 21:54 编辑
呢哝我弄 发表于 2014-4-28 21:40
没有,咋对,表示是初学者,不太懂

用示波器看波形,和资料里面的波形做对比....

首先要确定硬件没有问题...

使用特权

评论回复
7
ayb_ice| | 2014-4-29 06:04 | 只看该作者
感觉NOP太少了

使用特权

评论回复
8
呢哝我弄|  楼主 | 2014-4-29 21:14 | 只看该作者
ningling_21 发表于 2014-4-28 21:52
用示波器看波形,和资料里面的波形做对比....

首先要确定硬件没有问题... ...

我试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝