找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2626|回复: 9
打印 上一主题 下一主题
收起左侧

1602液晶疑难杂症

[复制链接]
跳转到指定楼层
楼主
ID:65751 发表于 2014-9-16 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 codenew 于 2014-9-16 20:46 编辑

先附上程序:
#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鸣器定义引脚IO口

void delays(uint x) //毫秒级延时函数
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
/***********1602液晶显示部分子程序****************/
sbit rs=P3^3;//LCD数据/命令选择端(H/L)
sbit rw=P3^4;//LCD读/写选择端(H/L)
sbit en=P3^5;//LCD使能控制
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低电平选择命令
        rw=1;  //RW(H/L),读操作
        en=1;
        while(P0&0x80); //当为0时表示不忙,退出循环。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()执行完后,en0。形成高脉冲,表示可对液晶读写。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//数据
        rw=0;
        P0=date;
        en=1;//ready()执行完后,en0。形成高脉冲,表示可对液晶读写。
        en=0;
}
void init1602()                         //上电后液晶显示初始化函数
{
        write_com(0x38);        //设置工作方式
        write_com(0x0c);        //设置光标
        write_com(0x06);        //设置输入方式
        write_com(0x01);        //清屏
        write_com(0x80);
        for(num=0;num<16;num++)
        {
           write_date(table[num]);
        }
        write_com(0x80+0x40);
        for(num=0;num<16;num++)
        {
           write_date(table1[num]);
        }
}

/**************************************************
函数功能:主函数
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鸣器
          en=0;
          P0=0xff;

        write_com(0x38);        //设置工作方式
        write_com(0x0c);        //设置光标
        write_com(0x06);        //设置输入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}        

评分

参与人数 2黑币 +60 收起 理由
YJGG + 10 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65751 发表于 2014-9-16 17:33 | 只看该作者
本帖最后由 codenew 于 2014-9-16 17:36 编辑

1.刷芯片,上电运行,第一行全部显示小方块,不正常。如图所示。
2.删除for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
改成下面的:
        write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
        write_date('5');
当然while(1);不能删除,上电运行,第一行还是全部显示小方块。
再删除write_date('5');,即保留        
    write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
再刷芯片,上电运行,可正常显示1234。
3.当刷芯片第一次是刷for语句,去掉主函数P0=0xff;,再把for语句换成
    write_date('1');
        write_date('2');
        write_date('3');
        write_date('4');
        write_date('5');
编译再刷芯片,上电运行,居然能显示12345。

aa.jpg (132.62 KB, 下载次数: 82)

小方块

小方块
回复

使用道具 举报

板凳
ID:65751 发表于 2014-9-16 19:54 | 只看该作者
本帖最后由 codenew 于 2014-10-3 16:27 编辑

     把数组的G去掉,即如下:
unsigned char code shuzi[]={"123456789ABCDEF"};
     在主函数中照样用:
     for(num=0;num<16;num++)
     {
     write_date(shuzi[num]);
     }
     while(1);
     刷芯片,上电运行,显示123456789ABCDEF正常,但最后一位乱码,如图所示。    最后一位乱码属正常,因为shizi[15]没有赋值。


j16.jpg (95.08 KB, 下载次数: 87)

j16.jpg
回复

使用道具 举报

地板
ID:65751 发表于 2014-9-16 20:28 | 只看该作者
本帖最后由 codenew 于 2014-9-16 20:44 编辑

       一开始时,编译提示*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS两个警告,主要是有两函数没有被调用。这两个函数是void delays(uint x)和void init1602()。
        我把void delays(uint x)和void init1602()这两个函数去掉,重新编译,提示0错误,0警告了。重新刷芯片,上电运行,可正常显示123456789ABCDEFG这十六个字符了。我不明白,为什么保留上面哪两个函数就显示不正常的?照理没调用应不影响的。
         正常显示123456789ABCDEFG的程序如下:
#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鸣器定义引脚IO口
sbit rs=P3^3;//LCD数据/命令选择端(H/L)
sbit rw=P3^4;//LCD读/写选择端(H/L)
sbit en=P3^5;//LCD使能控制

/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
/***********1602液晶显示部分子程序****************/
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低电平选择命令
        rw=1;  //RW(H/L),读操作
        en=1;
        while(P0&0x80);  //当为0时表示不忙,退出循环。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()执行完后,en0。形成高脉冲,表示可对液晶读写。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//数据
        rw=0;
        P0=date;
        en=1;//ready()执行完后,en0。形成高脉冲,表示可对液晶读写。
        en=0;
}

/**************************************************
函数功能:主函数
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鸣器
          en=0;
          P0=0xff;

        write_com(0x38);        //设置工作方式
        write_com(0x0c);        //设置光标
        write_com(0x06);        //设置输入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}        
回复

使用道具 举报

5#
ID:58502 发表于 2014-9-16 22:53 | 只看该作者

回帖奖励 +5

我先拿你最原先的程序调试,发现有2个函数未被调用,一个延时函数,一个1602初始化,改了之后正常显示
           #include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code table[]= {"Temp wireless   "};
unsigned char code table1[]={"Temp:           "};
unsigned char code shuzi[]={"123456789ABCDEFG"};

unsigned char num;
sbit BEEP=P3^6;         //蜂鸣器定义引脚IO口

/*void delays(uint x) //毫秒级延时函数
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}          */
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
/***********1602液晶显示部分子程序****************/
sbit rs=P2^6;//LCD数据/命令选择端(H/L)
sbit rw=P2^5;//LCD读/写选择端(H/L)
sbit en=P2^7;//LCD使能控制
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低电平选择命令
        rw=1;  //RW(H/L),读操作
        en=1;
        while(P0&0x80); //当为0时表示不忙,退出循环。
        en=0;
}
void write_com(uchar com)
{
        ready();
        rs=0;//命令
        rw=0;
        P0=com;
        en=1;//ready()执行完后,en为0。形成高脉冲,表示可对液晶读写。
        en=0;
}
void write_date(uchar date)
{
        ready();
        rs=1;//数据
        rw=0;
        P0=date;
        en=1;//ready()执行完后,en为0。形成高脉冲,表示可对液晶读写。
        en=0;
}
void init1602()                         //上电后液晶显示初始化函数
{
        write_com(0x38);        //设置工作方式
        write_com(0x0c);        //设置光标
        write_com(0x06);        //设置输入方式
        write_com(0x01);        //清屏
        write_com(0x80);
        for(num=0;num<16;num++)
        {
           write_date(table[num]);
        }
        write_com(0x80+0x40);
        for(num=0;num<16;num++)
        {
           write_date(table1[num]);
        }
}

/**************************************************
函数功能:主函数
***************************************************/
void main(void)
{         
          BEEP=1;                //禁止蜂鸣器
          en=0;
          P0=0xff;
                init1602();
        write_com(0x38);        //设置工作方式
        write_com(0x0c);        //设置光标
        write_com(0x06);        //设置输入方式
        write_com(0x01);        //清屏
        write_com(0x80);
          for(num=0;num<16;num++)
        {
           write_date(shuzi[num]);
        }
        while(1);
}   

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的积分奖励

查看全部评分

回复

使用道具 举报

6#
ID:65751 发表于 2014-9-17 11:04 | 只看该作者
楼上的主函数可去掉 init1602();,因为它后面的 write_com等等实际就是初始化,原意是在主函数中自己初始化,显示123456789ABCDEFG,不想调用void delays(uint x)和void init1602()。但为什么放着void delays(uint x)和void init1602()这两个函数,不调用它们,会出现奇怪现像呢。求解。
回复

使用道具 举报

7#
ID:65751 发表于 2014-9-17 20:39 | 只看该作者
谁来评评理呀,即把我首发的程序去掉void delays(uint x)和void init1602()函数,就能正常显示16个字符了,为什么会这样的,哪两个函数主程序根本没调用呀。
回复

使用道具 举报

8#
ID:65751 发表于 2014-9-17 21:16 | 只看该作者
重大进展,把我首发的程序中的函数void ready()改成如下,不删除void delays(uint x)和void init1602()函数也能正常显示123456789ABCDEFG这十六个字符了。
void ready()
{
        unsigned char sta;
        P0 = 0xFF;
        rs = 0;
        rw = 1;
        do        {
                en = 1;
                sta = P0;
                en = 0;
        }while(sta & 0x80);//当为0时表示不忙,退出循环。

}

原ready()函数为:
void ready()
{
        P0=0xff;
        rs=0;  //RS(H/L),低电平选择命令
        rw=1;  //RW(H/L),读操作
        en=1;
        while(P0&0x80); //当为0时表示不忙,退出循环。
        en=0;
}
应该是原来ready()函数有问题才会导致哪么多奇怪的问题,上面比较一下,原来错在哪呢?
回复

使用道具 举报

9#
ID:65751 发表于 2014-10-3 16:18 | 只看该作者
本帖最后由 codenew 于 2014-10-3 16:24 编辑

忘了总结,导致莫名的现像真正原因是40P锁紧器弹簧接触不良!

40p.jpg (16.53 KB, 下载次数: 79)

40p.jpg
回复

使用道具 举报

10#
ID:153199 发表于 2017-2-19 12:07 | 只看该作者
感谢楼主分享,我也遇到过由于此问题,无法写进程序
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表