程序如下:
/***************************************************
程序功能:动态显示文字“welcome”
----------------------------------------------------
测试说明:观察液晶显示
****************************************************/
#include <msp430.h>
#include "Cry1602.h"
#include "Cry1602.c"
uchar *s1 = "welcome!";
void main( void )
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
uchar i;
WDTCTL = WDT_ADLY_16; //间隔定时器,定时16ms
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
LcdReset();
DispStr(4,0,s1);
LocateXY(0,9); //确定写入字符的显示位置
LcdWriteCommand(0x07, 1); //整体显示左移
for(i = 12; i > 0; i--)
{
LcdWriteData(0x20);
//延时250ms
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;
}
while(1)
{
LcdWriteCommand(0x05, 1); //整体显示右移
for(i = 24; i > 0; i--)
{
LcdWriteData(0x20);
//延时250ms
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;
}
LcdWriteCommand(0x07, 1); //整体显示左移
for(i = 24; i > 0; i--)
{
LcdWriteData(0x20);
//延时250ms
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;
}
}
}
头文件一部分:
/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x--位置的列坐标
y--位置的行坐标
返回值 :无
********************************************/
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,1);
}
请问一下:这个 LocateXY中x为列y为行,x取值为0-15,y取值为0和1,
LocateXY(0,9); 是不是反了
LocateXY(9,0);但我试验过了后者不行,为什么呢?想不懂了。
还有这个延时函数是如何达到250ms的?、
此帖出自
小平头技术问答
关于延时的部分,注意到你的看门狗定时器设置的定时间隔是16ms(WDTCTL = WDT_ADLY_16;),
然后你在清除看门狗中断标志之后让程序卡在循环(while(!(IFG1 & WDTIFG));)中,直到下一次看门狗中断标志产生。
由于你并没有使能看门狗中断,只是设置开启看门狗定时器,所以不会进入中断服务。
其实上面的语句只是看这代码猜测的,并未经过核实。另外,无轮如何这个延时都不是250ms,或许例程并没有太在意注释的准确性吧
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;只延迟了16ms,没有250,应该是备注错了
这句的缘故吧
一周热门 更多>