程序如下:
#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。。。”,如此往复。
可是在第二行滚完后紧接着跟出了一堆乱码,才开始继续循环,求大神解释
|