本人编写有一个 年,月,日时钟,时钟没有问题了,就是在年,月,日有问题,不知为什么
times New Roman">LCD1602写第以行有个黑点去不了,仿真时候黑点就不见了,就正常了。还有一个 问题是在判断日的时候老是出问题,if,switch语句都改过使用过。都不能正常判断年,月,日希望高手帮看下我程序哪出问题了,谢谢~~
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit rw=P2^5;
sbit rs=P2^6;
sbit re=P2^7;
sbit key=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
const uchar table1[]=" make in the maker is";
const uchar table2[]=" 2013-05-09 niu niu";
const uchar table3[]=" 00:00:00 ";
char aa=0,miao,fen,shi,ri,yue,ii;
int year;
void delay(uint z) //
延时函数
{
uint i,j;
for(i=0;i<110;i++)
for(j=z;j>0;j--);
}
void wrint_com(uchar com) //
写指令函数
{
rs=0;
rw=0;
P0=com;
re=0;
delay(2);
re=1;
delay(5);
re=0;
}
void wrint_dat(uchar dat) //
写数据函数
{
rs=1;
rw=0;
P0=dat;
re=0;
delay(2);
re=1;
delay(5);
re=0;
}
void innt1(void) //
液晶初始化函数1
{
delay(5);
wrint_com(0x38);
delay(2);
wrint_com(0x38);
delay(2);
wrint_com(0x38);
wrint_com(0x38);
wrint_com(0x08);
wrint_com(0x01);
wrint_com(0x06);
wrint_com(0x0c);
}
void sfm(char ad,char datt)
{
char ge,si;
ge=datt%10;
si=datt/10;
wrint_com(0x80+0x40+ad);
wrint_com(0x0c);
wrint_dat(0x30+si);
wrint_dat(0x30+ge);
}
void nyr(char add,int date)
{
char ge, si, bai, qian,i;
if(date<=32)
{
si=date/10;
ge=date%10;
wrint_com(0x80+add);
wrint_dat(0x0c);
wrint_dat(0xb0);
wrint_dat(0x30+si);
wrint_dat(0x30+ge);
delay(10);
}
else
{
qian=date/1000;
bai=date%1000/100;
si=date%1000%100/10;
ge=date%1000%100%10/1;
wrint_com(0x80+add);
wrint_dat(0x0c);
for(i=0;i<2;i++)
{
wrint_dat(0x20);
}
wrint_dat(0x30+qian);
delay(5);
wrint_dat(0x30+bai);
delay(5);
wrint_dat(0x30+si);
delay(5);
wrint_dat(0x30+ge);
}
}
void innt2(void) //
液晶显示初始化函数2
{
uchar num;
wrint_com(0x80);
for(num=0;num<26;num++)
{
wrint_dat(table1[num]);
delay(1);
}
delay(1);
wrint_com(0x80+0x40);
for(num=0;num<26;num++)
{
wrint_dat(table2[num]);
delay(1);
}
delay(1500);
for(num=0;num<14;num++)
{
wrint_com(0x18);
delay(30);
}
delay(2000);
wrint_com(0x01);
wrint_com(0x80);
for(num=0;num<18;num++)
{
wrint_dat(table2[num]);
delay(2);
}
wrint_com(0x80+0x40);
for(num=0;num<16;num++)
{
wrint_dat(table3[num]);
delay(1);
}
nyr(0x09,ri);
nyr(0x06,yue);
nyr(0x00,year);
sfm(0x04,shi);
sfm(0x07,fen);
sfm(0x0a,miao);
}
void cursor(void)
{
if(ii!=0)
{
wrint_com(0x0f);
if(ii==1)
{
wrint_com(0x80+0x40+0x0a+0x01);
}
if(ii==2)
{
wrint_com(0x80+0x40+0x07+0x01);
}
if(ii==3)
{
wrint_com(0x80+0x40+0x04+0x01);
}
if(ii==4)
{
wrint_com(0x80+0x09+0x03);
}
if(ii==5)
{
wrint_com(0x80+0x09);
}
if(ii==6)
{
wrint_com(0x80+0x6);
}
}
}
int pdt(char n, char y, char r)
{
switch(y<=12)
{
case 2: if((n%4==0&&n%100!=0)||(n%400==0))
{
if(r==30)
{
ri=0;
break;
}
else if (r==-1)
{ri=29;break;}
else{ri=r;break;}
}
else{
if(r==29)
{ri=0;break;}
else if (r==-1)
{ri=28;break;}
else
{ri=r;break;}
}break;
case 4:
case 6:
case 9:
case 11: if(r==31)
{ri=0;break;}
else if(r==-1)
{ri=30;break;}
else{ri=r;break;}
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:if(r==32)
{ri=0;break;}
else if(r==-1)
{ri=31;break;}
else{ri=r;break;}
}
return ri;
}
void anj(void)
{
if(key==0)
{
delay(2);
if(key==0)
{
TR0=0;
ii++;
while(!key);
delay(5);
while(!key);
}
}
if(ii==7)
{
ii=0;
TR0=1;
wrint_com(0x0c);
}
if(ii!=0)
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
delay(5);
while(!key1);
}
if(ii==1)
{
miao++;
if(miao==60)
{
miao=0;
}
sfm(0x0a,miao);
}
if(ii==2)
{
fen++;
if(fen==60)
{
fen=0;
}
sfm(0x07,fen);
}
if(ii==3)
{
shi++;
if(shi==24)
{
shi=0;
}
sfm(0x04,shi);
}
if(ii==4)
{
pdt(year,yue,ri);
ri++;
pdt(year,yue,ri);
nyr(0x09,ri);
nyr(0x06,yue);
nyr(0x00,year);
}
if(ii==5)
{
yue++;
if(yue==13)
{}
else
{
nyr(0x06,yue);
nyr(0x00,year);
}
if(yue==13)
{
yue=0;
nyr(0x06,yue);
nyr(0x00,year);
}
}
if(ii==6)
{
year++;
if(year==9999)
{year=0;}
nyr(0x00,year);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
}
if(ii==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
sfm(0x0a,miao);
}
if(ii==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
sfm(0x07,fen);
}
if(ii==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
sfm(0x04,shi);
}
if(ii==4)
{
pdt(year,yue,ri);
ri--;
pdt(year,yue,ri);
nyr(0x09,ri);
nyr(0x06,yue);
nyr(0x00,year);
}
if(ii==5)
{
yue--;
if(yue==-1)
{}
else
{
nyr(0x06,yue);
nyr(0x00,year);
}
if(yue==-1)
{
yue=12;
nyr(0x06,yue);
nyr(0x00,year);
}
}
if(ii==6)
{
year--;
if(year==-1)
{year=9999;}
nyr(0x00,year);
}
}
}
}
jishi(void)
{
if(aa==20)
{
aa=0;
miao++; if(miao==60)
{}
else{sfm(0x0a,miao);}
if(miao==60)
{
miao=0;
sfm(0x0a,miao);
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
switch(12<=yue)
{
case 2: if((year%4==0&&year%100!=0)||(year%400==0))
{
if(ri==30)
{
ri=0; yue++; break;
}
}
else
{
if(ri==29)
{
ri=0;
yue++; break;
}
}
case 4:
case 6:
case 9:
case 11: if(ri==30) {ri=0;yue++;} break;
default: if(ri==32) {ri=0;yue++;} break;
}
nyr(0x09,ri);
nyr(0x06,yue);
nyr(0x00,year);
if(yue==13)
{}
else
{
nyr(0x06,yue);
nyr(0x00,year);
}
if(yue==13)
{
yue=0;
nyr(0x06,yue);
year++;
if(year==9999)
{year=0;}
// nyr(0x09,ri);
// nyr(0x06,yue);
nyr(0x00,year);
}
}
sfm(0x04,shi);
}
sfm(0x07,fen);
}
}
}
void zinit(void)
{
EA=1; //
打开总中断
TMOD=0x01; //
设置定时1工作方式
ET0=1; //
开启定时器1
TR0=0; //
启动定时器0
TH0=(65536-50000)/256;//
给定时器装载时间数据初值为50毫秒 给TH0高八位
TL0=(65536-50000)%256;//
给TH0低八位
}
int main(void)
{
miao=55;fen=58;shi=23;
year=2012;yue=11;ri=30;
zinit();
innt1();
innt2();
TR0=1;
while(1)
{
jishi();
anj();
cursor();
}
return 0;
}
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}

file:///C:DOCUME~1ADMINI~1LOCALS~1Tempksohtmlwps_clip_image-15670.png
-
1
一周热门 更多>