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

📄 testmega8.c

📁 atmega8控制的4位时钟
💻 C
字号:
//********************************************************************
//标志寄存器:  7    6    5    4    3    2    1      0
//                                                闹钟开/关   
//********************************************************************


#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<avr/delay.h>
#include"io_bit.h"
#define uchar unsigned char
uchar a[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0xef};  //LED码"0,1,2,3,4,5,6,7,8,9,-"
uchar b[]={0x08,0x04,0x02,0x01};                                    //位选
uchar w=0,x=0,y=0,z=0,s=0;
uchar hh=0,hl=0,mh=0,ml=0;
uchar v,j=0xff,kg=0;
unsigned int ii=0x42a,iii=0;
unsigned int c=0;
unsigned int u;
uchar signal=0;      //标志寄存器
void led(uchar h,uchar hh,uchar m,uchar mm)  //数码管扫描程序模块
{     uchar i;
      
     PORTD=a[h]; PORTC=b[3];
      for(i=0;i<60;i++)
     {}  
    
     PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
          
	   
	 PORTD=a[hh]; PORTC=b[2];
      for(i=0;i<60;i++)
     {}   
     PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
     if(c!=0)
        {c=c-1;PORTD=0XFE; PORTC=b[2];
	        	for(i=0;i<10;i++){}
              PORTC=0X0;PORTD=0Xff; for(i=0;i<60;i++){} }    

     PORTD=a[m]; PORTC=b[1];
     
     for(i=0;i<60;i++)
     {}
     PORTC=0X0; PORTD=0XFF;for(i=0;i<40;i++){}
     PORTD=a[mm]; PORTC=b[0];
     for(i=0;i<60;i++)
     {}   
     PORTC=0X0;PORTD=0XFF; for(i=0;i<40;i++){} 
  
     }
	 
 //void alarm()   //设定闹钟
//{ unsigned int k=0;
 // while((PINB&0X1)==0x0){}               //确定按键已经放开    
//  do
//  {
//   v=PINB;       //判断有无按键按下
//	   v=v&0x0f;
//       switch(v)
//       {//case 0x3b: cli();if(hh==1&&hl>4){break;}	               
		//		   hh=hh+1;   
        //           if(hh==3){hh=0;} 
		//	       for(u=0;u<500;u++)
	    //           {led(hh,hl,mh,ml);} ;
        //           break;
	               
 //       case 0x0b:cli(); hl=hl+1;  
 //                  if(hl==10){hl=0;hh=hh+1;}
 //                  if((hh==2)&&(hl==4)){hh=0;hl=0;}
//				   if((hh==2)&&(hl==5)){hl=0;}
//	               for(u=0;u<500;u++)
//	               {led(hh,hl,mh,ml);} ;
 //                  sei();break;
	               
		//case 0x3e:cli(); mh=mh+1;  
        //           if(mh==6){mh=0;}
	    //           for(u=0;u<500;u++)
	    //           {led(hh,hl,mh,ml);} ;
	    //              break;
	               
//		case 0x07:cli(); ml=ml+1;  
//                   if(ml==10){ml=0;mh=mh+1;}
 //                  if(mh==6){mh=0;}
//	               for(u=0;u<500;u++)
//	               {led(hh,hl,mh,ml);} ;
//	                sei(); break;
//        case 0x0d:cli();if((signal&0x01)==0){signal|=0x01;for(u=0;u<500;u++){led(hh,hl,mh,ml);}break;}//开闹钟
//		          if(signal&0x01){signal&=0xfe;for(u=0;u<500;u++){led(10,10,10,10);}break;}//关闹铃
 //    }
//     if(hh==2&&hl==4){hh=0;hl=0;}
//	  k=k+1;
//	 if((k<0x01cf)&&((signal&0x01)==0x01)){c=0XFFFF;led(hh,hl,mh,ml);}//显示定时时间
//	 else if(k<0x01cf){c=0;led(10,10,10,10);}//显示“----" 
//   }
//  while((PINB&0X1)!=0);    //按键退出

 // while((PINB&0X1)==0x0)
 //  {}               //确定按键已经放开

//}

void check1(void)    //	检查时钟进位
{ 
	  if(z==10){z=0;y=y+1;}
      if(y==6){y=0;x=x+1;}
      if(x==10){x=0;w=w+1;}
      if((w==2)&&(x==4)){w=0;x=0;}  
	  if((w==hh)&&(x==hl)&&(y==mh)&&(z==ml)&&(s==0)&&((signal&0x01)==0x01)){kg=0xff;} //开闹钟            
}       



   	  
SIGNAL(SIG_OVERFLOW2) //中断服务程序,减1秒模块 
{
      j=~j;
      TIFR|=_BV(TOV1);    //清中断标志寄存器       
	  c=0x01CF;	
      s=s+1;
	  if(s==60){s=0;z=z+1;check1();} 
	 
}


int main()      //主函数
{
DDRD=0XFF;                           //定义d口输出
DDRC=0XFF;
DDC4_0;
DDB6_0;
DDRB=0X00;                           //定义b口输入
PORTB=_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3);                         
TIMSK=0X00;        //关溢出中断允许
ASSR=_BV(AS2);     //选择32768时钟源
TCCR2=0x05;  //128分频
while(ASSR&0X07)    //等待
{}
SREG=0x80;     //开全局中断
//TIFR|=_BV(TOV2);  //请溢出中断标志

TIMSK=0x40;     //允许TIMER2溢出中断

//sei();                  //开中断

   while(1)
    { 
       v=PINB;       //判断有无按键按下
	   v=v&0x0f;
       switch(v)
       {//case 0x3b: cli(); w=w+1;  
        //           if(w==3){w=0;} 
	    //           for(u=0;u<500;u++){led(w,x,y,z);} ;break;	               
        case 0x0E:cli(); x=x+1; 
				   check1();              //检查进位
				   if(w==2&&x==5){x=0;}
	               for(u=0;u<500;u++){led(w,x,y,z);} ;break;	               	               
		//case 0x3e:cli(); y=y+1;  
        //           if(y==6){y=0;}
	    //           for(u=0;u<500;u++) {led(w,x,y,z);} ;break;	              	               
		case 0x0D:cli(); z=z+1; 
				   check1();   //检查进位
	               for(u=0;u<500;u++){led(w,x,y,z);} ;break;	               
  //      case 0x0e:alarm();break;
	//	case 0x3e:kg=0x0;break;
	               
	    }
		 sei();
//		 while((kg==0xff)&&(j==0xff)&&((signal&0x01)==0x01))
//		 {
//		  DDC4_1;                    
//		  _delay_loop_2(ii);
 //         PC4_1;
//          _delay_loop_2(ii);
//          PC4_0;
//		  v=PINB;
//		  v=v&0x20;
//		  if(v==0x00){kg=0x0;}
//         }
        
        led(w,x,y,z);
     }
   
  

}




⌨️ 快捷键说明

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