Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193114
  • 博文数量: 23
  • 博客积分: 2556
  • 博客等级: 少校
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 15:57
文章分类

全部博文(23)

文章存档

2012年(2)

2010年(6)

2009年(4)

2008年(11)

我的朋友

分类: C/C++

2009-04-10 16:01:51

#include
#include
#define uchar unsigned char
#define uint unsigned int
//********端口以及变量定义***********//
sbit rs = P2^0;  //lcd数据命令选择位   
sbit rw = P2^1;  //lcd写入读出选择位
sbit ep = P2^2;  //lcd使能位
sbit p15=P1^5;   //调时模式选择位
sbit p16=P1^6;   //+1位
sbit p17=P1^7;   //-1位
uint year=2000,month=1,day=1,hour=0,minute=0,second=0;   //设置初始显示的时间日期
uchar sec100=0;   //1秒的计数变量,加满100为1秒
uchar mod=0;      //调时标志位
//延时子程序----------------------------------------------------
delay(uchar ms)
{            
    uchar i;
    while(ms--)
    {
        for(i = 0; i< 250; i++)
     {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
     }
    }
}
//测试LCD忙碌状态----------------------------------------
bit lcd_bz()
{            
    bit result;
    rs = 0;
    rw = 1;
    ep = 1;
    result = (bit)(P0 & 0x80); //读出lcd忙碌标志位
    ep = 0;
    return result;   //函数返回值,返回1表示lcd忙碌,返回0表示lcd空闲
}
//写入指令数据到LCD-----------------------------------------
lcd_wcmd(uchar cmd)
{            
    while(lcd_bz());  //等待lcd到空闲
    rs = 0;
    rw = 0;
    ep = 0;
    P0 = cmd;   //将指令写入lcd
    ep = 1;
    ep = 0;  
}
//设定显示位置子程序-----------------------------------------
lcd_pos(uchar pos)
{            
    lcd_wcmd(pos | 0x80);  //将显示地址写入lcd
}
//写一个字符数据到LCD----------------------------------------
lcd_wdat(uchar dat)
{           
    while(lcd_bz());  //等待lcd到空闲
    rs = 1;
    rw = 0;
    ep = 0;
    P0 = dat;  //将数据写入lcd
    ep = 1;
    ep = 0; 
}
//写数据串到LCD----------------------------------------------
//写n位数据到指定posi的位置------------------------------------
lcd_datas(uchar posi,int dat,char n)  //在posi的位置显示名字为dat的n位数据
{
    uchar i,j,data1;
    int s;
    lcd_pos(posi);
    for(i=1;i<=n;i++)    //从第一位开始显示,到第n位显示完毕
    {
        s=1;            
        for(j=1;j<=n-i;j++)
        s=s*10;
        data1=dat/s;
        lcd_wdat(data1+'0');
        dat=dat%s;
    }
}
//LCD初始化--------------------------------------------------
lcd_init()
{                        //LCD初始化设定
    lcd_wcmd(0x38);      //
    lcd_wcmd(0x0c);      //
    lcd_wcmd(0x06);      //
    lcd_wcmd(0x01);         //清除LCD的显示内容
}
//显示一屏时间------------------------------------------------
display_lcd()
{    
    lcd_wcmd(0x01);         //清除LCD?
    delay(1);
    lcd_datas(3,year,4);    //显示第一行数据
    lcd_wdat('/'); 
    lcd_datas(8,month,2);
    lcd_wdat('/'); 
    lcd_datas(11,day,2);
    lcd_datas(67,hour,2);       //显示第二行数据
    lcd_wdat(':'); 
    lcd_datas(70,minute,2);
    lcd_wdat(':'); 
    lcd_datas(73,second,2); 
}
//显示空字符----------------------------------------------------
no_display(uint pos,char n)  //pos:显示的地址。n:要显示的位数
{
    lcd_pos(pos);
    while(n--)
    {
        lcd_wdat(' ');
    }
}
//年加1子程序---------------------------------------------
void inc_year()
{
   year++;
   if(year==9999)
   year=0000;
    lcd_datas(3,year,4);
}
//月加1子程序---------------------------------------------------
void inc_month()
{
   month++;
   if(month>12)
   {
   month=01; 
   inc_year();
   }
    lcd_datas(8,month,2);
}
//天加1子程序-------------------------------------------
void inc_day()
{
    day++;
    if(month==4||month==6||month==9||month==11)
        { 
        if(day>30)
        day=01;
        inc_month();
     }
    else if(month==2)
        {
         if((year%400==0)||(year%4==0)&&(year%100!=0)) 
            {
            if(day>29)
            day=1;
            inc_month();
         }
         else if(day>28)    
            {day=1;
            inc_month();}
          
        }
    else
    {
      if(day>31)
      day=01;
      inc_month();
    }
    
    lcd_datas(11,day,2);
}
//小时加1程序------------------------------------------------------
void inc_hour()
{
    hour++;
    if(hour > 23)
    {
        hour = 0;
        inc_day();
    }
    lcd_datas(67,hour,2);
}
//分加1程序-----------------------------------------------
void inc_min()
{
    minute++;
    if(minute > 59)
    {
        minute = 0;
        inc_hour();
    }
    lcd_datas(70,minute,2);
}
//秒加1程序-------------------------------------------
void inc_sec()
{
    second++;
    if(second > 59)
    {
        second = 0; 
        inc_min();
    }
    lcd_datas(73,second,2);
}
//调时闪动程序---------------------------------------------------
flash()
{
    switch(mod)
    {
    case 1:     no_display(3,4);    break;
    case 2:     no_display(8,2);    break;
    case 3:     no_display(11,2);   break;
    case 4:     no_display(67,2);   break;
    case 5:     no_display(70,2);   break;
    }
}
//中断处理程序---------------------------------------------------------------
void timer0() interrupt 1 using 0
{
      TH0=0xd8;
      TL0=0xf0;
   
      sec100++;
      if(sec100 == 50 && mod != 0)
      flash();
   
    if(sec100 == 100)
    {
        sec100 = 0;
        inc_sec();
        display_lcd();
    }
}
//闰年调整--------------------------------------------------------------
void incday()
{
    day++;
    if(month==4||month==6||month==9||month==11)
        { 
        if(day>30)
        day=01;
     }
    else if(month==2)
        {
        if((year%400==0)||(year%4==0)&&(year%100!=0)) 
            {
            if(day>29)
            day=1;
         }
        else if(day>28)
            day=1;
      }
    else
    {
      if(day>31)
      day=01;
     }
 }
//时间调整程序----------------------------------------------
bit inc_time()
{
    bit t;
    t=0;
    if(p16==0)
      {  
       delay(10);
       if(p16==0)
         {
          while(p16==0);
          t=1;   
          }
       }
    return t;
}
bit dec_time()
{
    bit m;
    m=0;
    if(p17==0)
      {  
       delay(10);
       if(p17==0)
         {
          while(p17==0);
          m=1;   
          }
      }
    return m;
}
//************************************************************//
//*****************主程序*************************************//
//************************************************************//
main()
{
    TMOD=0x01;
    TH0=0xd8;
    TL0=0xf0;
 
    lcd_init(); 
    delay(10);
    display_lcd();
    ET0=1; 
    TR0=1;
    EA=1;
 
    while(1)
{
    if(p15==0)
      {  
       delay(10);
       if(p15==0)
         {
          while(p15==0);
          mod++;     
          if(mod>5)
            mod=0;
          } 
       }
//--------------------------
   if(mod==1)
      {
       if(inc_time()==1)
       {
        year++;
        if (year==9999)
         year=0;
        lcd_datas(3,year,4);
       }
       if(dec_time())
       {
       year--;
       lcd_datas(3,year,4);
       }
      }
//----------------------------------
      else if(mod==2)
      { 
       if(inc_time()==1)
       {
        month++;
        if(month>12)
        month=1;
        lcd_datas(8,month,2);
       }
       if(dec_time())
       {
       month--;
       if(month==0)
        month=12;
       lcd_datas(8,month,2);
       }
      }
//----------------------------------
        else if(mod==3)
        { 
            if(inc_time()==1)
         {
                incday();      
                lcd_datas(11,day,2);
            }  
//------------------------------------------
            if(dec_time())
      {
                day--;
                if(month==4||month==6||month==9||month==11)
             { 
                    if(day==0)
                    day=30;
             }
                else if(month==2)
           {
                    if((year%400==0)||(year%4==0)&&(year%100!=0)) 
               {
                     if(day==0)
                     day=29;
               }
                    else if(day==0)
                  day=28;
          }
          else
          {
                    if(day==0)
                 day=31;
          
          }
                lcd_datas(11,day,2);
      }
     }
//------------------------------------------
      else if(mod==4)
      { 
       if(inc_time()==1)
       {
        hour++;
       if(hour==24)
        hour=0;
        lcd_datas(67,hour,2);
       }
     if(dec_time())
       {
       hour--;
       if(hour==0xffff)
       hour=23;
       lcd_datas(67,hour,2);
       }
      }
      else if(mod==5)
      { 
       if(inc_time()==1)
         {
        minute++;
        if(minute==60)
          minute=0;
        lcd_datas(70,minute,2);
        }
    if(dec_time())
       {
       minute--;
       if(minute>60)
        minute=59;
       lcd_datas(70,minute,2);
       }
      }
}
}
阅读(1042) | 评论(0) | 转发(0) |
0

上一篇:双屏VC实现

下一篇:MINIGUI扫雷游戏

给主人留下些什么吧!~~