标题: 为什么我的LCD1602单片机程序显示日期时间错乱? [打印本页]
作者: 1311638554 时间: 2017-5-7 00:41
标题: 为什么我的LCD1602单片机程序显示日期时间错乱?
下面是代码。。。。。。。。只显示年或者月或者日这样单个是正常的,一起显示就不对了
- #include<reg52.h>
- #include <intrins.h>
- #include <math.h>
- #include <stdio.h>
- #include <1602.h>
- #include <24c02.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code word1[]={" Welcome........"};
- void second_display();
- void minute_display();
- void hour_display();
- void day_display();
- void month_display();
- void year_display();
- void init();
- void delay(uint z);
- void time();
- void display();
- void lcdready();
- uint s,min,h,d,m,y,i;
- uchar second[2];
- uchar minute[2];
- uchar hour[2];
- uchar day[2];
- uchar month[2];
- uchar year[4];
- sbit LE=P2^0;
- sbit DB=P0;
- void main()
- {
- LCD_Initial(); //液晶初始化
- GotoXY(0,0);
- Print_slow(word1);
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- init();
- while(1)
- {
-
- GotoXY(4,0);
- Print("-");
- GotoXY(7,0);
- Print("-");
- GotoXY(2,1);
- Print(":");
-
- GotoXY(5,1);
- Print(":");
- year_display();
- month_display();
- day_display();
- hour_display();
- minute_display();
- second_display();
- }
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void year_display()
- {
- LE=1;
- year[0]=y/1000+'0';
- year[1]=y%1000/100+'0';
- year[2]=y%1000%100/10+'0';
- year[3]=y%10+'0';
- GotoXY(0,0);
- Print(year);
- delay(50);
-
- LE=0;
- }
- void month_display()
- {
- LE=1;
- month[0]=m/10+'0';
- month[1]=m%10+'0';
- GotoXY(5,0);
- Print(month);
- delay(50);
- LE=0;
- }
- void hour_display()
- {
- LE=1;
- hour[0]=h/10+'0';
- hour[1]=h%10+'0';
- GotoXY(0,1);
- Print(hour);
- delay(50);
- LE=0;
- }
- void minute_display()
- {
- LE=1;
- minute[0]=min/10+'0';
- minute[1]=min%10+'0';
- GotoXY(3,1);
- Print(minute);
- delay(50);
- LE=0;
- }
- void second_display()
- {
- LE=1;
- second[0]=s/10+'0';
- second[1]=s%10+'0';
- GotoXY(6,1);
- Print(second);
- delay(50);
- LE=0;
- }
- void day_display()
- {
- LE=1;
- day[0]=d/10+'0';
- day[1]=d%10+'0';
- GotoXY(8,0);
- Print(day);
- delay(50);
- LE=0;
- }
- void init()
- {
- s=0;
- min=0;
- h=0;
- d=1;
- m=1;
- y=2001;
- i=0;
- LE=0;
- EA=1;
- ET0=1;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=1;
- }
- void T0_rpt() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- i++;
- time();
- }
- void time()
- {
- if(i==20)
- {
- i=0;
- s++;
- if(s==60)
- {
- s=0;
- min++;
- if(min==60)
- {
- min=0;
- h++;
- if(h==60)
- {
- h=0;
- min=0;
- s=0;
- d++;
- if(d==29)
- if((y%4!=0)&&(m==2))
- {
- d=1;
- m++;
- if(m==13)
- {
- m=1;
- y++;
- }
- }
- if(d==30)
- if((y%4==0)&&(m==2))
- {
- d=1;
- m++;
- if(m==13)
- {
- m=1;
- y++;
- }
- }
- if(d==31)
- if((m==4)||(m==6)||(m==9)||(m==11))
- {
- d=1;
- m++;
- if(m==13)
- {
- m=1;
- y++;
- }
- }
- if(d==32)
- if((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))
- {
- d=1;
- m++;
- if(m==13)
- {
- m=1;
- y++;
- }
- }
- }
- }
- }
- }
- }
复制代码
-
360截图20170507003846335.jpg
(153.46 KB, 下载次数: 80)
作者: ghkjhk 时间: 2017-5-7 11:19
没有看见你的print函数。你没有贴
作者: zl2168 时间: 2017-5-7 11:33
本帖最后由 zl2168 于 2017-5-7 14:45 编辑
实例91 具有校正功能的时钟1302(LCD1602显示)
先Proteus仿真,确认有效。
实例91 带校正时钟1302(LCD1602显示).rar
(52.68 KB, 下载次数: 20)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
作者: a135587 时间: 2017-5-7 13:00
你没有写显示函数 一起不行可能是显示指针有错误
作者: 1311638554 时间: 2017-5-7 16:19
这个函数在1602.h的头文件里
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
作者: 1311638554 时间: 2017-5-7 16:20
显示函数在1602.h的头文件里
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |