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

📄 mainclockwws.c

📁 PIC单片机为基础实现的时钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
}
/*********************************************************************
初始化函数:void initial()                                          
功能:对端口定义和T1的控制器设置                               
*********************************************************************/
void initial()
{   

    T1CON=0x0f;      
/////////////////////////////外接32K晶振,工作模式为计数器
    TRISB=0x8f;     
/////////////////////////////RB3为按键寻找位设置为输入口,RB7电平变化中断11001111
    TRISC=0x00;
/////////////////////////////RC5连接LED显示闪烁功能脚.RC2连接蜂明器都为输出格式
    TRISD=0X00;     
////////////////////////////////////////////
//第一段数码管段选位RD5.共阳极,高电平显示///
//第二段数码管段选位RD4.共阳极,高电平显示///
//第三段数码管段选位RD3.共阳极,高电平显示///
//第四段数码管段选位RD3.共阳极,高电平显示///
////////////////////////////////////////////
    PORTB=0X08;     
/////////////////////////////键盘的行线送低电平,为寻键作准备RB3=1,当RB3=0则响应中断
    PORTD=0X00;
/////////////////////////////关断每一段数码管显示
    RC5=1;
}
/*******************************************************************
蜂鸣器函数void speaker(char x)和LED闪烁程序void twinkle(char x)   
功能:提供蜂明器的响应函数和开机工作指示灯作用闪烁数次               
*******************************************************************/
void speaker(char x)
{  
  for(k=0;k<x;k++)    //执行响应次数x
  { 
	  RC2=1;          //高电平响应,低电平关闭
      DELAY1();       //长延时
      RC2=0;          //关闭蜂明器 
      DELAY1();       //长延时
   }
}	
void twinkle(char x)
{ 
  for(k=0;k<x;k++)   //执行闪烁次数x
  { 
    RC5=0;           //低电平闪烁,高电平关闭
    DELAY1();        //长延时
    RC5=1;           //熄灭LED
    DELAY1();        //长延时
  }
}
/********************************************************************
检测闹钟时间与时钟是否相等程序 void checkclock()
功能: 检测闹钟时间是否已经到了
调用情况: 主程序循环调用
*********************************************************************/
void checkclock()
{
         time=0; ///////////////主循环次数清零//次操作与本函数没有关系,为后面程序服务。清零计时值
        if(wakeup1[3]==clock[3]&&wakeup1[2]==clock[2]&&wakeup1[1]==clock[1]&&wakeup1[0]==clock[0])  
///////////////////////////////闹钟1数组与时间常数数组小时分钟数相等,等待响应
           {speaker(1);}  
///////////////////////////////当时钟时间与闹钟时间相等的时候.蜂明器响一声.持续一分钟
        
        if(wakeup2[3]==clock[3]&&wakeup2[2]==clock[2]&&wakeup2[1]==clock[1]&&wakeup2[0]==clock[0])
///////////////////////////////闹钟2数组与时间常数数组小时分钟数相等,等待响应
          {speaker(1);}  
///////////////////////////////当时钟时间与闹钟时间相等的时候.蜂明器响一声.持续一分钟
}
/******************************************************************
时间更新函数:void clkcf()                                      
功能:当时间到达一分钟时.主循程序调用一次.对时间数组clock[4]的更新  
******************************************************************/

void clkcf()
 {
    clock[0]=clock[0]+1;            //当分钟时间到加一
    if(clock[0]==10)                //当分钟时间到10时则分钟十位加一
    { 
     clock[0]=0;                    //当分钟个位满十则清零
     clock[1]=clock[1]+1;           //当分钟时间到10时则分钟十位加一
     if(clock[1]==6)                //当分钟十位为6时则小时个位加一
      {
       clock[1]=0;                  //分钟十位清零
       clock[2]=clock[2]+1;         //当分钟十位为6时则小时个位加一
        if(clock[2]==10)            //当小时个位时间到10时则小时十位加一
       {     clock[2]=0;            //小时个位清零
             clock[3]=clock[3]+1;}  //小时十位加一
       if(clock[3]==2&&clock[2]==4) //当时间加为24小时时清零
       {     clock[2]=0;            //小时个位清零
	         clock[3]=0;}           //小时十位清零
      }
     }
}
/*********************************************************
数码管显示函数: void yw1641(char z)  第一段数码管显示函数 
                void yw1642(char z)  第二段数码管显示函数 
                void yw1643(char z)  第三段数码管显示函数 
                void yw1644(char z)  第四段数码管显示函数 
功能:显示每一段数码管,以利于动态扫描显示                  
*********************************************************/
void yw1641(char z)
{   
    RD5=0;RD4=0;RD3=0;RD2=0;     //显示前关闭每一段的显示     
    tab=led[z];                  //取数码管显示段码,无小数点  
    for(k=0;k<8;k++)             //164的8位移位循环           
	{   RD1=0;                   //164移位时钟至低            
		tab=tab<<1;              //段码数据移位送入溢出位CARRY
	    RD0=CARRY;               //164AB断口取溢出位CARRY     
            
	    RD1=1;                   //164移位时钟至高,产生时钟   
    }
    RD5=1;       //打开显示段
}
void yw1642(char z)
{  
    RD5=0;RD4=0;RD3=0;RD2=0;
    tab=led1[z];               //取数码管显示段码,无小数点
    for(k=0;k<8;k++)
	{   RD1=0;
		tab=tab<<1;
	    RD0=CARRY;
            
	    RD1=1;
    }
    RD4=1;      //打开显示段
}
void yw1643(char z)
{   
    RD5=0;RD4=0;RD3=0;RD2=0;
    tab=led[z];              //取数码管显示段码,有小数点的显示
    for(k=0;k<8;k++)
	{   RD1=0;
		tab=tab<<1;
	    RD0=CARRY;
            
	    RD1=1;
    }
    RD3=1;      //打开显示段
}
void yw1644(char z)
{   
    RD5=0;RD4=0;RD3=0;RD2=0;
    tab=led[z];            //取数码管显示段码,无小数点
    for(k=0;k<8;k++)
	{   RD1=0;
		tab=tab<<1;
	    RD0=CARRY;
            
	    RD1=1;
    }
    RD2=1;       //打开显示段
}    
/***************************************************************
键盘服务程序: void keyscanw() 内部时间闹钟按键调整服务程序返回key值
              void keyscan()  外部模式进入时间闹钟调整按键选择程序返回mode值
功能:   返回key值和mode值,选择调整时间闹钟和选择进入调整值
*****************************************************************/
void keyscanw()        //内部时间闹钟按键调整服务程序返回key值
{   
    RD5=0;RD4=0;RD3=0;RD2=0;
    tab=0xff;          //先送入11111111关断数码管每一位,为按键程序服务.防止误判
    for(k=0;k<8;k++)    
	{   RD1=0;
		tab=tab<<1;
	    RD0=CARRY;
            
	    RD1=1;
    }
    tab=0x7f;          //送入01111111,送入一位为0,即当有一个按键按下时即有反应
        number=0;
    for(k=0;k<8;k++)
	{   
		RD1=0;
		tab=tab<<1;
	    RD0=CARRY;     
	    RD1=1;
        number++;
        DELAY3();      //每一位移位完成延时一定时间.有充分的低电平等待按键响应
        if(RB3==0)     //当有按键时进入
        {   DELAY3();  //延时防止颤抖
	        if(RB3==0) //再次判断如果真有按键则进入
            {
            switch(number)     //判断number的值当为某一位时有按键时响应
            { case 3: key=3;  break;   
              case 4: key=2;  break;
              case 5: key=1;  break;
              case 8: key=4;  break;
              default:  key=0;       //如果没有则返回0
             }
           while(1)
                 {
                  if(RB3==1) break;     //当按键弹起的时候则退出
                 }
             }
        }
    }
}  
void keyscan()    //外部模式进入时间闹钟调整按键选择程序返回mode值
{       
    RD5=0;RD4=0;RD3=0;RD2=0;
    tab=0xff;    //先送入11111111关断数码管每一位,为按键程序服务.防止误判
    for(k=0;k<8;k++)
	{   RD1=0;
		tab=tab<<1;
	    RD0=CARRY;
            
	    RD1=1;
    }
    tab=0x7f;   //送入01111111,送入一位为0,即当有一个按键按下时即有反应
    number=0;
    for(k=0;k<8;k++)
	{  
		RD1=0;
		tab=tab<<1;
	    RD0=CARRY;     
	    RD1=1;
        number++;   //判断b的值当为某一位时有按键时响应
        DELAY3();
        if(RB3==0)    
        {  DELAY3();
	        if(RB3==0)
            {
            switch(number)
            { case 3: mode=3;  break;
              case 4: mode=2;  break;
              case 5: mode=1;  break;
              case 8: mode=4;  break;
              default:  mode=0;
              }
           while(1)
                  {
                     if(RB3==1) break;
                  }
             }
         }
    }
} 
/*************************************************************************
 延时函数:   void DELAY1()    void DELAY2()   void DELAY3()///////////////
/*功能: 延时函数.DELAY1()在蜂明器和闪烁程序中调用/////////////////////////
/*               DELAY2()在循环显示中的显示段延时 ////////////////////////
/*                DELAY3()在寻键中的位移判断调用//////////////////////////
/************************************************************************/    
   
void DELAY1()
{
for(i=12000;i>0;i--);
}
void DELAY2()
{
	for(i=635;i>0;i--);
}

void DELAY3()
{
	for(i=135;i>0;i--);
}

⌨️ 快捷键说明

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