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

📄 时钟程序.c

📁 基于pic18f452的时钟代码
💻 C
字号:
#include<p18f452.h>
#include<pwm.h>
#include<adc.h>
#include<delays.h>
#include<timers.h>
#include"p18LCD.h"


void choosekey();
void timeprocess();
void timedisplay();
void setdisplay();
void temprocess(unsigned int AD_temp);
void PORDinitialize();

unsigned char displaycode(unsigned char);
void ring();


#pragma udata access My_Access_RAM

near unsigned int AD_temp;


union
{
	unsigned int AD_10bit;    // contant is 10-bit A/D Result
    unsigned char AD[2];	  // AD[0] is A/D Low byte, AD[1] is A/D High Byte
} near AD_Result;

#pragma udata

static char hourl=0,hourh=0,minl=9,minh=0,secl=0,sech=5,day=5;
int result=0; 
unsigned char DS_Zero_FLG;
static int i=0,j=0;

const int r[]={100,0,100,0,100,0,100,0,200,0,200,0,200,0,200,0,400,0,400,0,400,0,400,0,600,0,600,0,600,0,600,0};     	




 #pragma code high_vector=0x08
 void low_interrupt (void)
{
 _asm GOTO timeprocess _endasm
 }

#pragma code

#pragma interruptlow timeprocess save=PROD




void choosekey(){
    
       if(INTCONbits.INT0IF==1)       //有外部中断
       {INTCONbits.INT0IF=0;

        

             //测试ra4  ?????
	 while(PORTAbits.RA4==1){             //RA4按下,设定时间

     OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
			ADC_CH0 & ADC_INT_OFF);
                    //AD模块初始化,用于选择按键,通道0
     Delay10TCYx(5);    //delay
     ConvertADC();      //start adc
     while(BusyADC()) {;}
     result=ReadADC();      //read result
     CloseADC();   
     

     if(((result/100)==5)&&(((result%100)/10)==9))
	{	Delay10KTCYx(80);minl++;   
      if(minl==10) minl=0;setdisplay();}     //k4设置分低位


    else if(((result/100)==3)&&(((result%100)/10)==4))
     {Delay10KTCYx(80);
 	minh++;   
         if(minh==6) minh=0;setdisplay();}      //k3设置分高位


     else if(((result/100)==4)&&(((result%100)/10)==0))
        {Delay10KTCYx(80);
	hourl++;   
          if((hourl==10)||((hourl>=4)&&(hourh>=2))) hourl=0;
            setdisplay();
	
      }                                //k2设置小时低位

       else if(((result/100)==5)&&(((result%100)/10)==1))
	{Delay10KTCYx(80);
		hourh++;   
          if((hourh==3)||((hourl>=4)&&(hourh>=2))) hourh=0;
            setdisplay();
          }                          //k1设置小时高位


         else if(((result/100)==3)&&(((result%100)/10)==9))
             {Delay10KTCYx(80);
	      day++;
           if(day==8) day=0; setdisplay();	}
		
	         }	         //k9设置星期
	}
	
      timedisplay();}                                                           //通过AD选择按键以设置时间




void setdisplay(){
      LCD_Set_Cursor(0,2);
      putcLCD(displaycode(hourh));
      LCD_Set_Cursor(0,3);
      putcLCD(displaycode(hourl));
      LCD_Set_Cursor(0,4);
      putcLCD(':');
      LCD_Set_Cursor(0,5);
       putcLCD(displaycode(minh));
      LCD_Set_Cursor(0,6);
      putcLCD(displaycode(minl));
      LCD_Set_Cursor(0,7);
      putcLCD(':');
      LCD_Set_Cursor(0,8);
      putcLCD(displaycode(sech));
      LCD_Set_Cursor(0,9);
      putcLCD(displaycode(secl));
      LCD_Set_Cursor(0,11);
    switch(day){
      case 1: putcLCD('M');
	      putcLCD('o');
	      putcLCD('n');break;
      case 2: putcLCD('T');
	      putcLCD('u');
	      putcLCD('e');break;
      case 3:  putcLCD('W');
              putcLCD('e');
              putcLCD('d');break;
      case 4: putcLCD('T');
              putcLCD('h');
              putcLCD('u');break;
      case 5:  putcLCD('F');
              putcLCD('r');
              putcLCD('i');break;
      case 6: putcLCD('S');
	      putcLCD('a');
	      putcLCD('t');break;
      case 7: putcLCD('S');
	      putcLCD('u');
	      putcLCD('n');
   }
       LCD_Set_Cursor(1,4);
       putcLCD('S');
       putcLCD('e');
       putcLCD('t');
       
       putcLCD(' ');
       putcLCD('t');
       putcLCD('i');
       putcLCD('m');
       putcLCD('e');
       putcLCD(' '); 
  }                       //设置时间时的显示



unsigned char displaycode(unsigned char data)
{      if(data==0)
         {   if(DS_Zero_FLG) return' ';
               else  return '0';
          }
       else  {  DS_Zero_FLG=0;
                return(data+='0');
                }
}                  //将要显示的数据转换为ASC码





void  timeprocess(){
     if(INTCONbits.TMR0IF==1)
       {INTCONbits.TMR0IF = 0;
                 secl++;

             
           if(secl==10){
                secl=0;sech++;
                      }            
	if(sech==6){sech=0;minl++;}
		if(minl==10){minl=0;minh++;
                        ring();}      //10分钟时铃声响

          if(minh==6){minh=0;hourl++;}

           if(hourl==10){hourh++;hourl=0;}
              if((hourh==2)&&(hourl==4)){secl=0;sech=0;minl=0;minh=0;
                       hourl=0;hourh=0;day++;
                           if(day==8) day=1;  }
            
             
             TMR0H=0XC2;	
             TMR0L=0XF8;
             timedisplay();     }


            choosekey();

}                                                   //时间处理

                          



void  timedisplay(){                                  //显示时间
              
        LCD_Set_Cursor(0,2);
      putcLCD(displaycode(hourh));
      LCD_Set_Cursor(0,3);
      putcLCD(displaycode(hourl));
      LCD_Set_Cursor(0,4);
      putcLCD(':');
      LCD_Set_Cursor(0,5);
       putcLCD(displaycode(minh));
      LCD_Set_Cursor(0,6);
      putcLCD(displaycode(minl));
      LCD_Set_Cursor(0,7);
      putcLCD(':');
      LCD_Set_Cursor(0,8);
      putcLCD(displaycode(sech));
      LCD_Set_Cursor(0,9);
      putcLCD(displaycode(secl));
      LCD_Set_Cursor(0,11);
    switch(day){
      case 1: putcLCD('M');
	      putcLCD('o');
	      putcLCD('n');break;
      case 2: putcLCD('T');
	      putcLCD('u');
	      putcLCD('e');break;
      case 3:  putcLCD('W');
              putcLCD('e');
              putcLCD('d');break;
      case 4: putcLCD('T');
              putcLCD('h');
              putcLCD('u');break;
      case 5:  putcLCD('F');
              putcLCD('r');
              putcLCD('i');break;
      case 6: putcLCD('S');
	      putcLCD('a');
	      putcLCD('t');break;
      case 7: putcLCD('S');
	      putcLCD('u');
	      putcLCD('n');

       }  
}



void ring(){
       
	OpenPWM1(0xff);
	if(j==32) j=0; 
        i=r[j++];
        SetDCPWM1(i);
        Delay10KTCYx(100);
        ClosePWM1();
        
}


void PORTinitialize()
{
	TRISD=0;              //D口用于输出
   INTCONbits.INT0IE=1;       //使能INT0外部引脚中断
   INTCON2bits.INTEDG0=1;     //上升沿触发中断
	PORTD=0x00;
	TRISA=0XFB;           //
   TRISB=0XFF;
   TRISCbits.TRISC2=0;
	
}




void temprocess(unsigned int AD_temp)                           //温度处理
{     

    

        
 putcLCD(' ');
putcLCD('T');
putcLCD('e');
putcLCD('m');
putcLCD('p');
putcLCD('=');		    DS_Zero_FLG=1;		putcLCD(displaycode(AD_temp/1000));				AD_temp=AD_temp%1000;							putcLCD(displaycode(AD_temp/100));				AD_temp=AD_temp%100;			putcLCD(displaycode(AD_temp/10));					AD_temp=AD_temp%10;		putcLCD(AD_temp+='0');	
		putcLCD(' ');
        putcLCD('C');
        putcLCD(' ');
        			
 
}





 
void main()
{  OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
			ADC_CH1 & ADC_INT_OFF); 
    PORTinitialize();
      OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_256);
      OpenTimer2(T2_PS_1_4&T2_POST_1_16);   
      INTCONbits.GIE = 1;
	   TMR0H=0XC2;	
	   TMR0L=0XF8;
           OpenLCD( );  
         
           
          timeprocess();
         timedisplay();
         while(1)
{OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
			ADC_CH1 & ADC_INT_OFF);
      ADCON0bits.GO=1;							// Start to convert the A/D		while(ADCON0bits.GO);	
		Delay10KTCYx(255) ;					// Waiting A/D until done		AD_temp=ReadADC();
		AD_temp=AD_temp/10;
       LCD_Set_Cursor(1,1);
        temprocess(AD_temp);}

}


⌨️ 快捷键说明

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