找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么LCD1602的数字时钟显示不出来 大神们

  [复制链接]
跳转到指定楼层
楼主
这是程序#include<reg51.h>#define LCD_data P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit LCDE=P2^2;
unsigned char m,miao,fen=12,shi=10;
unsigned char line1[16]={"  BEIJING TIME  "};
unsigned char line2[16]={"15-5-22  :  :  "};
unsigned char line3[16]={"Study LCD1602-)"};
unsigned char line4[16]={"Design by DWJ"};
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'};
void delay(unsigned int t)
{
  unsigned int i,j;
  for(i=t;i>0;i--)
   for(j=200;j>0;j--);
   }
void wr_com(unsigned char comm)
{
   LCDE=0;
   RS=0;
   RW=0;
   LCDE=1;
   LCD_data=comm;
   LCDE=0;
   }
void wr_data(unsigned char dat)
{
    LCDE=0;
        RW=0;
        RS=1;
        LCDE=1;
        LCD_data=dat;
        LCDE=0;
        }
unsigned char rd_bf(void)
{
unsigned char bflag;
LCDE=0;
RS=0;
RW=1;
LCDE=1;
bflag=LCD_data&0x80;
LCDE=0;
return(bflag);}
void Init_1602(void)
{
  wr_com(0x38);
  delay(10);
  wr_com(0x01);
  delay(10);
  wr_com(0x06);
  delay(10);
  wr_com(0x38);
  delay(10);
  wr_com(0x0c);
}
void display_1602(void)
{
  unsigned char i;
  wr_com(0x80);
  delay(1);
  for(i=0;i<16;i++)
  {wr_data(line1[i]);
  delay(1);
  while(rd_bf());}
  wr_com(0xc0);
  for(i=0;i<16;i++)
  {wr_data(line2[i]);
  delay(1);
  while(rd_bf());}
  }
  void main()
  {   TMOD=0x01;
      TH0=0x3c;
          TL0=0x0B0;
          EA=1;ET0=1;TR0=0;
        Init_1602();
        while(1)
{ line2[15]=tab[miao%10];line2[14]=tab[miao/10];
   line2[12]=tab[fen%10];line2[11]=tab[fen/10];
   line2[9]=tab[shi%10];line2[8]=tab[shi/10];
   delay(5);
   display_1602();}}
   void t0(void) interrupt 1
   {
        TH0=0x3c;
        TL0=0x0B0;
        m++;
        if(m==20)
        { m=0;
          miao=miao+1;
          if(miao==60){miao=0;fen=fen+1;}
          if(fen==60){fen=0;shi=shi+1;}
          if(shi==24){shi=0;}
          }
          }

QQ截图20150521201751.png (6.87 KB, 下载次数: 104)

QQ截图20150521201751.png

QQ截图20150521201758.png (3.19 KB, 下载次数: 92)

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

使用道具 举报

沙发
ID:80407 发表于 2015-5-21 22:35 | 只看该作者
同问!
回复

使用道具 举报

板凳
ID:69240 发表于 2015-5-22 10:50 | 只看该作者
我自己是焊了个LCD1602的时钟,就是不想看代码,代码风格不一样,很脑大的。我把我的LCD1602.c贴出来,宋老师的风格,功能模块化,好查错,你对比分析一下吧,这个.c是一定没问题的。

#include<reg52.h>
#define lcdDB P0
sbit lcdRS = P1^0;
sbit lcdRW = P1^1;
sbit lcdE = P1^5;

void lcdready()     //探忙
{
  unsigned char sta;
        lcdDB = 0xFF;
        lcdRS = 0;
        lcdRW = 1;
        do{
                lcdE = 1;
                sta = lcdDB;
                lcdE = 0;
        }while(sta & 0x80);
}

void lcdwritecmd(unsigned char cmd)      //写入命令
{
  lcdready();
        lcdRS = 0;
        lcdRW = 0;
        lcdDB = cmd;
        lcdE = 1;
        lcdE = 0;
}

void lcdwritedat(unsigned char dat)      //写入数据
{
  lcdready();
        lcdRS = 1;
        lcdRW = 0;
        lcdDB = dat;
        lcdE = 1;
        lcdE = 0;
}

void lcdsetaddr(unsigned char x, unsigned char y)      //设置显示位置
{
  unsigned char addr;
        if(y == 0)
                addr = 0x00 + x;
        else
                addr = 0x40 + x;
        lcdwritecmd(addr | 0x80);
}

void lcdshowstr(unsigned char x, unsigned char y, unsigned char *str)     //显示内容
{
  lcdsetaddr(x, y);
  while(*str != '\0')
        {
          lcdwritedat(*str++);
        }               
}

/***********************************************************
void lcdareaclear(unsigned char x, unsigned char y, unsigned char len)    //局部清除
{
  lcdsetaddr(x, y);
        while(len--)
        {
          lcdwritedat(' ');
        }
}

void lcdfullclear()     //整屏清除
{
  lcdwritecmd(0x01);
}
**********************************************************************/

void lcdgbss(unsigned char x, unsigned char y, bit gb)     //光标闪烁:1开0关
{
        if(gb == 1)
                lcdwritecmd(0x0F);
        else
                lcdwritecmd(0x0C);
        lcdsetaddr(x, y);
}

void initlcd()        //初始化
{
  lcdwritecmd(0x38);
        lcdwritecmd(0x0C);
        lcdwritecmd(0x06);
        lcdwritecmd(0x01);       
}




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

地板
ID:76853 发表于 2015-5-24 10:42 | 只看该作者
TR0=0,未进入中断函数

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:80172 发表于 2015-5-24 21:09 | 只看该作者
wanglu071912 发表于 2015-5-24 10:42
TR0=0,未进入中断函数

对哦 谢谢哈
回复

使用道具 举报

6#
ID:78515 发表于 2015-5-25 09:38 | 只看该作者
写数据之前要查看LCD1602忙吗,你程序没有的

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:138194 发表于 2016-9-29 15:51 | 只看该作者
为什么要探忙,能解释下吗
回复

使用道具 举报

8#
ID:140642 发表于 2016-9-29 16:56 | 只看该作者
对于任何外设访问都要探忙,但是好像跟你这个显示的没关系,你不能把程序模块化了吗,写的很乱,到最后自己都不好改。
回复

使用道具 举报

9#
ID:19568 发表于 2017-5-6 23:16 | 只看该作者
初始化很重要
回复

使用道具 举报

10#
ID:197554 发表于 2017-5-6 23:42 来自手机 | 只看该作者
你的延时太多了  不用探忙的
回复

使用道具 举报

11#
ID:197560 发表于 2017-5-6 23:49 | 只看该作者

TR0=0,未进入中断函数
回复

使用道具 举报

12#
ID:196174 发表于 2017-5-7 00:16 | 只看该作者
我写的程序也是显示乱码。。。。。
回复

使用道具 举报

13#
ID:129350 发表于 2017-5-7 08:28 | 只看该作者
TR0=0,未进入中断函数
回复

使用道具 举报

14#
ID:197635 发表于 2017-5-7 11:06 | 只看该作者
你看看你的接口顺序对吗
回复

使用道具 举报

15#
ID:197635 发表于 2017-5-7 11:06 | 只看该作者
同问求大佬兹磁
回复

使用道具 举报

16#
ID:111634 发表于 2017-5-7 11:34 | 只看该作者
本帖最后由 zl2168 于 2017-5-7 14:43 编辑

实例91  具有校正功能的时钟1302(LCD1602显示)
先Proteus仿真,确认有效。
实例91 带校正时钟1302(LCD1602显示).rar (52.68 KB, 下载次数: 19)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。


回复

使用道具 举报

17#
ID:197655 发表于 2017-5-7 11:44 | 只看该作者
跪求,感觉好难!
回复

使用道具 举报

18#
ID:116078 发表于 2017-5-7 12:27 | 只看该作者
其实不用查忙的,延时就行,忙这个条件有点苛刻
回复

使用道具 举报

19#
ID:116078 发表于 2017-5-7 12:28 | 只看该作者
仿真是不用查忙的,实物中需要。因为仿真中单片机速度没有1602反应快
回复

使用道具 举报

20#
ID:116078 发表于 2017-5-7 12:29 | 只看该作者
仿真不用查忙
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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