⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 我用PROTEUS做了一个基于PIC16F877A的万年历
💻 C
字号:
#include <pic.h>

#define uint unsigned int
#define uchar unsigned char
//**********函数声明*************
void  Init_LCD(void);
void LCD_Clear(void);
void delay_nms(unsigned int); 
void LCD_DisplayString (char, char ,unsigned char*);
void LCD_DisplayCharacter(char);
void LCD_WriteControl(uchar);

void tmr1_init(void);
void ad_init(void);

void set_key(void);
void add_key(void);
void reduce_key(void);
void right_key(void);
void left_key(void);
uchar key_result(void);
uchar get_key(void);
void time_seting(void);
//****************************************
uchar test1[]="Designer:Zhaobao";
uchar test2[]="Electronics 04-1";
bank2 uchar i=0;
bank2 uint count=0; //tmr1计数,计满1000为一秒

bank2 uchar ad_key_result; //存放ADKEY转换的值
bank2 uchar shift=0,add=0,reduce=0,set=0; //各个功能键
bank2 uchar key;  //存放键值

bank2 uchar second=0,minute=0,hour=0,day=1,month=1;
bank2 uint year=2008;
bank2 uchar tian1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年
bank2 uchar tian2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //平闰
//*********tmr1中断*****************
void interrupt time(void)
{TMR1H=0xfc;
 TMR1L=0x18;  //1ms
 TMR1IF=0; 
 count++;
 if(count>1000)
 {
  count=0;
 second++;
 if(second>=60)
 {
  second=0;
  minute++;
  if(minute>=60)
  {
   minute=0;
   hour++;
   if(hour>=24)
   {
    hour=0;
    day++;
    if((year%4==0)&&(year%100!=0)||(year%400==0))  //判断闰年
    { if(day>tian2[month-1])  //闰年
     {
      day=1;
      month++;
     }
    }
    else if(day>tian1[month-1])   //非闰年
         {
          day=1;
          month++;
         }
    if(month>=13)
     {
      month=1;
      year++;
     }
   }  
  }
 }
 }
}
//*****************时间显示*******************
void time_display()
{
 uchar temp1[]="    ";
 uchar temp2[]="  ";
 uchar temp3[]="SET ";
 LCD_WriteControl(0x80);     //起始地址
 switch(shift)
 {
  case 1:LCD_DisplayCharacter('M');break;
  case 2:LCD_DisplayCharacter('F');break;
  case 3:LCD_DisplayCharacter('S');break;
  case 4:LCD_DisplayCharacter('R');break;
  case 5:LCD_DisplayCharacter('Y');break;
  case 6:LCD_DisplayCharacter('N');break;
  default:LCD_DisplayCharacter(' ');break;
 }
 LCD_DisplayString(1,2,temp2);
 LCD_DisplayCharacter(year/1000+0x30);  //年的千位
 LCD_DisplayCharacter((year%1000)/100+0x30); //年的百位
 LCD_DisplayCharacter(((year%1000)%100)/10+0x30); //年的十位
 LCD_DisplayCharacter(((year%1000)%100)%10+0x30); //年的个位
 LCD_DisplayCharacter(' ');
 LCD_DisplayCharacter(month/10+0x30); //月的十位
 LCD_DisplayCharacter(month%10+0x30); //月的个位
 LCD_DisplayCharacter('-');
 LCD_DisplayCharacter(day/10+0x30); //日的十位
 LCD_DisplayCharacter(day%10+0x30); //日的个位

 
 if(set==0)
 LCD_DisplayString(2,1,temp1);
 else LCD_DisplayString(2,1,temp3);
 LCD_DisplayCharacter(hour/10+0x30);
 LCD_DisplayCharacter(hour%10+0x30);
 LCD_DisplayCharacter(':');
 LCD_DisplayCharacter(minute/10+0x30);
 LCD_DisplayCharacter(minute%10+0x30);
 LCD_DisplayCharacter(':');
 LCD_DisplayCharacter(second/10+0x30);
 LCD_DisplayCharacter(second%10+0x30);
}
//************时间调整****************
void time_seting()
{
 if(shift==1)  //秒位校正
  {
   if(add==1)
   {
    second++;
    if(second>59)second=0;
    add=0;
   }
   if(reduce==1)
   {
    second--;
    if(second>59) second=59;
    reduce=0;
   }
  }

  if(shift==2)  //分位校正
  {
   if(add==1)
   {
    minute++;
    if(minute>59)minute=0;
    add=0;
   }
   if(reduce==1)
   {
    minute--;
    if(minute>59)minute=59;
    reduce=0;
   }
  }

  if(shift==3) //时位校正  
  {
   if(add==1)
   {
    hour++;
    if(hour>23)hour=0;
    add=0;
   }
   if(reduce==1)
   {
    hour--;
    if(hour>23)hour=23;
    reduce=0;
   }
  }

  if(shift==4) //日校正
  {
   if(add==1)
   {
    day++;
    if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
     { if(day>tian2[month-1])day=1;}
    else if(day>tian1[month-1])day=1;
    add=0; 
   }
   if(reduce==1)
   {
    day--;
    if((year%4==0)&&(year%100!=0)||(year%400==0)) //闰年判断
      {if(day<=0||day>tian2[month-1]) day=tian2[month-1];}
    else if(day<=0||day>tian1[month-1]) day=tian1[month-1];
    reduce=0;
   }
  }
 
  if(shift==5) //月校正
  {
   if(add==1)
   {
    month++;
    if(month>12)month=1;
    add=0;
   }
   if(reduce==1)
   {
    month--;
    if(month>12)month=1;
    reduce=0;
   }
  }

  if(shift==6)  //年校正
  {
   if(add==1)
   {
    year++;
    add=0;
   } 
   if(reduce==1)
   {year--;
    if(year<2008)year=2008;
    reduce=0;
   }
  }
  
 
}
//********读键值*************
uchar key_result()
{
 uchar key_value;
 ADGO=1;
 do{;}while(1==ADGO);
 ADGO=0;
 ad_key_result=ADRESH;
 if(ad_key_result>0xa5) key_value=1;
   else if(ad_key_result>0x7b) key_value=2;
        else if(ad_key_result>0x61) key_value=3;
          else if(ad_key_result>0x50) key_value=4;
            else if(ad_key_result>0x44) key_value=5;
             else key_value=0;
return key_value;
            
}
//****************防抖动******************
uchar get_key()
{
 uchar key_temp;
 uint k;
 do{
    key_temp=key_result();   //取键值
    if(0!=key_temp)for(k=400;--k;);  //延时一段时间再取键值
   }while(key_temp!=key_result());  //若两次取得键值不相同,则说明键误按下,重新取键值。
 if(0!=key_temp)  //等键松开
 {
  do{
    do{;}while(0!=key_result());  //若没松开键,等待
    for(k=400;--k;);
    }while(0!=key_result()); //若二者不相等,说明是误操作,继续循环检测
 }
return key_temp;
}
//**************功能键*******************
void set_key()
{
 if(0==set){shift=0; time_display();}   //初始状态,显示时间
 if((1==set)||(0==set)) {time_seting(); time_display();}  //功能键按一次,进入时间校准模式
   

 PORTC=0x01;
}
//************左移键*************
void left_key()  //
{
 if(1==set)
 {shift--;
  if(shift<1) shift=6;
 }
  PORTC=0x10;
}
//************右移键*************
void right_key()
{
 if(1==set)
 {
  shift++; 
  if(shift>6)shift=1;
 }
 PORTC=0x08;
}
//********加键****************
void add_key()
{
 if(1==set)add=1;
 PORTC=0x02;
}
//*********减键******************
void reduce_key()
{
 if(1==set)reduce=1;
 PORTC=0x04;
}
//*****************************
//************主函数******************
void main()
{
 Init_LCD();
 tmr1_init();
 ad_init();
 LCD_Clear();
 LCD_DisplayString(1,1,test1);
 LCD_DisplayString(2,1,test2);
 delay_nms(500);
 LCD_Clear();
 TMR1IE=1;  //开中断
 while (1)
 { 
   key=get_key();
   if(1==key) {left_key();}
   if(2==key) {reduce_key();}
   if(3==key){set++;if(set>2)set=0;}
   if(4==key){add_key();}
   if(5==key){right_key();}
   set_key();
 
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -