您的位置:首页 > 其它

jin1956121用c51编写的万年历 LCD1602液晶显示.定时闹钟

2009-12-11 10:04 525 查看

//晋广周2009/10/20日完成编写的万年历
//用LCD1602液晶显示.定时闹钟 .
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code  table[]="2000:01:01Week:W";//
uchar code table1[]="1:00:00:00#00:00";
sbit lcd_rs=P2^4;//定义LCD端口
sbit lcd_rw=P2^3;
sbit lcd_en=P2^2;
sbit k1=P3^0;//菜单键光标位
sbit k2=P3^1;//加键
sbit k3=P3^2;//减键
sbit k4=P3^3;//退出键
sbit werr=P3^2;
sbit DUAN=P2^0;//数码管段
sbit WEI=P2^1;//数码管位
void yue31();//大月
void yue30();//小月
void yue29();//闰天
void yue28();//平月
//void timing();
void Timing();
void week7();
void wei_1()
{
 WEI=1;
 P0=0;
 WEI=0;
}

void duan_1()
{
 DUAN=1;
 P0=0;
 DUAN=0;
}
uchar count, k1num;//声明秒的变量
char shi,fen,miao;//声明时分秒
uint nian, yue,ri,week;//声明年月日星期
uchar f,s,n;//定时器/
void delay(uchar z)//延时函数
{
 uchar x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_com(uchar com)//lcd写指令
{
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 P0=com;
 delay(5);
 lcd_en=1;
 delay(5);
 lcd_en=0;
}
void write_data(uchar date)//lcd写数据
{
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 P0=date;
 delay(5);
 lcd_en=1;
 delay(5);
 lcd_en=0;
}
void write_week(uchar add,uchar date)//计算星期显示位
{
 uchar ge;
 ge=date/1;
 write_com(0x80+0x00+add);
 write_data(0x30+ge);
}
void write_tim(uchar add,uchar date)
{
 uchar ge;
 ge=date/1;
 write_com(0x80+0x40+add);
  write_data(0x30+ge);
}
void write_fsm(uchar add,uchar date)//计算时分秒位
{
 uchar shi,ge;
 shi=date/10;
 ge=date%10;
 write_com(0x80+0x40+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_nyr(uchar add,uchar date)//计算月日位

 uint shi,ge;
 shi=date/10;
 ge=date%10;
 write_com(0x80+0x00+add);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void write_nian(uchar add,uchar date)//计算年位,年是百位
{
 uint bai,shi,ge;
 bai=date/100%10;
 shi=date/10;
 ge=date%10;
 write_com(0x80+0x00+add);
 write_data(0x30+bai);
 write_data(0x30+shi);
 write_data(0x30+ge);
}
void jiaxian()//设置键盘加显
{
 if(k1num!=0)
{
  if(k2==0)
  {
  delay(5);
  if(k2==0)
  {
  while(!k2);
  if(k1num==1)
  {
  miao++;
  if(miao==60)
  miao=0;
  write_fsm(8,miao);
  write_com(0x80+0x40+8);
  }
  if(k1num==2)
  {
  fen++;
  if(fen==60)
  fen=0;
  write_fsm(5,fen);
  write_com(0x80+0x40+5);
  }
  if(k1num==3)
  {
  shi++;
  if(shi==24)
  shi=0;
  write_fsm(2,shi);
  write_com(0x80+0x40+2);
  }
 if(k1num==4)
{
 ri++;
 if(ri==31)
 ri=1;
 write_nyr(8,ri);
 write_com(0x80+0x00+8);
}
 if(k1num==5)
{
 yue++;
 if(yue==12)
 yue=1;
 write_nyr(5,yue);
 write_com(0x80+0x00+5);
}
 if(k1num==6)
 { 
 nian++;
 if(nian==999)
 nian=0;
 write_nian(1,nian);
 write_com(0x80+0x00+1);
 }
 if(k1num==7)
 {
 week++;
 if(week>7)
 week=1;
 write_week(15,week);
 write_com(0x80+0x00+15);
 }
 if(k1num==8)
 {
 s++;
 if(s==24)s=0;
 write_fsm(11,s);
 write_com(0x80+0x40+11);
 }
 if(k1num==9)
 {
 f++;
 if(f==59)f=0;
 write_fsm(14,f);
 write_com(0x80+0x40+14);
 }
 if(k1num==10)
 {
 n++;
 if(n==3)
 n=1;
 write_tim(0,n);
 write_com(0x80+0x40+0);
 }
}
}
  
}
}
 
void jianxian()//设置键盘减显
{
 if(k1num!=0)
 {
  if(k3==0)//K3设置
  delay(5);
  if(k3==0)
 {
  while(!k3);
  if(k1num==1)
 { 
  miao--;
  if(miao==-1)
  miao=59;
  write_fsm(11,miao);
  write_com(0x80+0x40+11);
    
 }
  if(k1num==2)
 {
  delay(5);
   fen--;
  if(fen==-1)
   fen=59;
  write_fsm(8,fen);
  write_com(0x80+0x40+8);
    
  }
  if(k1num==3)
  {
  shi--;
  if(shi==-1)
  shi=23;
  write_fsm(5,shi);
  write_com(0x80+0x40+5);
  }
}
  
}
}
void keyk4()//K4是锁定
{
 if(k4==0)
 {
 delay(5);
 if(k4==0)
 TR0=1;
 {
 while(!k4);
 k1num=0;
 write_com(0x0c);
 }
 
 }
}
void keyk1()//菜单光标设置
{
 if(k1==0)
 {
  delay(5);
  if(k1==0)
  {
   while(!k1);
   k1num++;
   TR0=0;
   if(k1num==1)
   {
    write_com(0x80+0x40+8);
    write_com(0x0f); 
   }
   if(k1num==2)
   {
    write_com(0x80+0x40+5);
   }
   if(k1num==3)
   {
    write_com(0x80+0x40+2);
   }
 if(k1num==4)
 {
 
 write_com(0x80+0x00+8);
 }
 if(k1num==5)
{
 
 write_com(0x80+0x00+5);
}
 if(k1num==6)
 {
 write_com(0x80+0x00+1);
 }
   if(k1num==7)
 {
 write_com(0x80+0x00+18);
 }
 if(k1num==8)
 {
 write_com(0x80+0x40+11);
 }
 if(k1num==9)
 {
 write_com(0x80+0x40+14);
 }
 if(k1num==10)
 {write_com(0x80+0x40+0);}
  }
 }
  jiaxian();
  //jianxian();
   keyk4();
}

void init()//启动 LCD初始化数据
{
 uchar num;
 lcd_rs=0;
 lcd_en=0;
 shi=0;
 fen=0;
 miao=0;
 nian=0000;
 week=0x27;
 yue=1;
 ri=1;
 s=06;
 f=10;
 n=1;
 write_com(0x38);//不监察忙信号
 write_com(0x0c);//显示开光标设置
 write_com(0x06);//显示光标移动设置
 write_com(0x01);//显示清屏
 write_com(0x80);//数据指针
 write_com(0x80+0x00);
 for(num=0;num<16;num++)//延时15ms
 {
  write_data(table[num]);//年月日的数据延时
  delay(5);
 }
  write_com(0x80+0x40);
  for(num=0;num<16;num++)
  {
   write_data(table1[num]);//时的延时
   delay(5);
  }//时钟初始化设置
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1; 
}
void display()
{
 if(count==18)//是秒是的时间

 {
 count=0;
 miao++;
 if(miao==60)
  {
 miao=0;
 fen++;
 if(fen==60)
  {
 fen=0;
 shi++;
 if(shi==24)
 {
 shi=0;
 ri++;
 week++;
 }
 if(week>7){week=1;}//计算星期日
 if(yue==2)
 {
 if((nian%4==0&&nian%100!=0)|(nian%400==0))//计算闰年
 {yue29();}
 else {yue28();}
 }
 else if((yue==
8b9f
4)|(yue==6)|(yue==9)|(yue==11))//计算大小月
{
 yue30();
}
 else
 {yue31();}
 if(yue>12){yue=1;nian++;}
{
 if(nian>999)
 nian=0;
 write_nian(1,nian);
}
{
 write_nyr(5,yue);
}
{
 write_nyr(8,ri);
}
 write_fsm(2,shi);
}
 write_fsm(5,fen);
}
 write_fsm(8,miao);
{
 write_week(15,week);
}
 {
 write_fsm(11,s);
 }
 {
 write_fsm(14,f);
 }
 {
 write_tim(0,n);
 }
}
}
void yue31()//大月变量
{
 if(ri>31){ri=1;yue++;} 

void yue30()//小月变量
{
 if(ri>30){ri=1;yue++;}
}
void yue29()//闰天变量
{
 if(ri>29){ri=1;yue++;}
}
void yue28()//平月变量
{
 if(ri>28){ri=1;yue++;}
}
void week7()
{
 if(week==7)week=0x27;
}
void main()//主函数
{
 wei_1();
 duan_1();
 init();
 while(1)
 {
 keyk1();
 display();
 week7();
 Timing();
 }
}
void time0() interrupt 1//中断子函数
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 count++;//时钟
}
void Timing()//定时闹钟设置。
{
 if(n==1)
 {
 if(shi==s&&fen==f)
 
  werr=0;
 else werr=1;
 }
 
 if(n==2)
 {
 if(shi==s&&fen==f)
  werr=1;
 }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c delay date table