2465|7

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LCD1602显示问题 [复制链接]

程序如下:
/***************************************************
程序功能:动态显示文字“welcome”
----------------------------------------------------
测试说明:观察液晶显示
****************************************************/
#include  
#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的?、

最新回复

给你一个附件,你可以自己参照一下。  详情 回复 发表于 2016-1-25 13:43
 
点赞 关注

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
关于LCD1602的部分需要自己阅读资料去
关于延时的部分,注意到你的看门狗定时器设置的定时间隔是16ms(WDTCTL = WDT_ADLY_16;),
然后你在清除看门狗中断标志之后让程序卡在循环(while(!(IFG1 & WDTIFG));)中,直到下一次看门狗中断标志产生。
由于你并没有使能看门狗中断,只是设置开启看门狗定时器,所以不会进入中断服务。

其实上面的语句只是看这代码猜测的,并未经过核实。另外,无轮如何这个延时都不是250ms,或许例程并没有太在意注释的准确性吧
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
其实这个lcd1602你写对了时序就行了。这个的时序应该说不那么严格,所以你都可以参考下别人51的例程来写。
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

4
 
temp |= 0x40;  //如果在第2行

看这句,第二行比第一行地址还小,好像是0xC0吧,还有我觉得逻辑好难理解,干嘛不直接赋值
if(x==0) addr=0x80+y;
      else  addr=0xc0+y;

两句话搞定

点评

你这样写不是吧x看做是行了 ,y看做是第几列了 ,可以我的例程上x是看做列的,y是看做行的啊 ,是不是呢 ??  详情 回复 发表于 2016-1-25 16:51
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

5
 
那个250毫秒就是看门狗定时器,应该是多次中断的总时间吧
IFG1 &= ~WDTIFG;
while(!(IFG1 & WDTIFG));
IFG1 &= ~WDTIFG;只延迟了16ms,没有250,应该是备注错了
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(中级)

6
 
y &= 0x01;
这句的缘故吧
 
 
 

回复

943

帖子

3

TA的资源

纯净的硅(中级)

7
 
给你一个附件,你可以自己参照一下。

1602液晶静态显示.c

5.77 KB, 下载次数: 12

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

8
 
数码小叶 发表于 2016-1-25 12:47
temp |= 0x40;  //如果在第2行

看这句,第二行比第一行地址还小,好像是0xC0吧,还有我觉得逻辑好难 ...

你这样写不是吧x看做是行了 ,y看做是第几列了 ,可以我的例程上x是看做列的,y是看做行的啊 ,是不是呢 ??
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表