标题: 为什么LCD1602的数字时钟显示不出来 大神们 [打印本页]
作者: 不会玩 时间: 2015-5-21 20:21
标题: 为什么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, 下载次数: 130)
-
QQ截图20150521201758.png
(3.19 KB, 下载次数: 115)
作者: 13682060295 时间: 2015-5-21 22:35
同问!
作者: sglf0201 时间: 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);
}
作者: wanglu071912 时间: 2015-5-24 10:42
TR0=0,未进入中断函数
作者: 不会玩 时间: 2015-5-24 21:09
对哦 谢谢哈
作者: 安阳市新世纪 时间: 2015-5-25 09:38
写数据之前要查看LCD1602忙吗,你程序没有的
作者: 龚红 时间: 2016-9-29 15:51
为什么要探忙,能解释下吗
作者: zhujiales 时间: 2016-9-29 16:56
对于任何外设访问都要探忙,但是好像跟你这个显示的没关系,你不能把程序模块化了吗,写的很乱,到最后自己都不好改。
作者: yulinyong 时间: 2017-5-6 23:16
初始化很重要
作者: a135587 时间: 2017-5-6 23:42
你的延时太多了 不用探忙的
作者: zhangjiayue 时间: 2017-5-6 23:49
TR0=0,未进入中断函数
作者: 1311638554 时间: 2017-5-7 00:16
我写的程序也是显示乱码。。。。。
作者: 1131710634 时间: 2017-5-7 08:28
TR0=0,未进入中断函数
作者: Ghroth 时间: 2017-5-7 11:06
你看看你的接口顺序对吗
作者: Ghroth 时间: 2017-5-7 11:06
同问求大佬兹磁
作者: zl2168 时间: 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文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: ljm126 时间: 2017-5-7 11:44
跪求,感觉好难!
作者: 1573104943 时间: 2017-5-7 12:27
其实不用查忙的,延时就行,忙这个条件有点苛刻
作者: 1573104943 时间: 2017-5-7 12:28
仿真是不用查忙的,实物中需要。因为仿真中单片机速度没有1602反应快
作者: 1573104943 时间: 2017-5-7 12:29
仿真不用查忙
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |