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

📄 keyled.c

📁 avr单片机入门小程序
💻 C
字号:
/*跑表和计时  
  8MHz   */
#include <iom128v.h>
#include <macros.h>
#include "delay.h"
unsigned char  temp;
unsigned char timer2;     //the num of 5ms
unsigned int  timer200;  // the num of  1s
unsigned char work_state; //to set the timer or clock,0表示计时,1表示跑表
unsigned char time_change; //to sign the state of change
unsigned char clock_start; // 跑表开始信号,0表示开始,1 表示暂停
unsigned char time[4]; //array of time
unsigned char clock[4]; //array of watch
const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
	0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
#pragma interrupt_handler timer0_com_isr:17  //timer0 compare interrupt

void display()
{
 unsigned char i,j,k;
 DDRA=0xff;
 PORTA=0xff;
 DDRC=0xff;
 PORTC=0xff;
 
 if(work_state==0)    //计时显示
{ 
 if(time_change==0x00)   // normal 
  {for(i=0;i<4;i++)
   {
   PORTA=seg_table[time[i]];
   PORTC=~(1<<(i+4));
   delay_1ms();
   PORTC|=0xf0;
   }
   }
 else if(time_change==0x01)  // change second 
       {
	    if(timer200<100)  //正常显示
         {
		  for(i=0;i<4;i++)
          {
            PORTA=seg_table[time[i]];
            PORTC=~(1<<(i+4));
            delay_1ms();
            PORTC|=0xf0;
		  }
	   }
	   else      //只显示分
        {for(i=2;i<4;i++)
         {
            PORTA=seg_table[time[i]];
            PORTC=~(1<<(i+4));
            delay_1ms();
            PORTC|=0xc0;
		  }
		  }
	 }
	  else if(time_change==0x02) //正常显示
	   {  if(timer200<100)
	     {
		 { for(i=0;i<4;i++)
           {
            PORTA=seg_table[time[i]];
            PORTC=~(1<<(i+4));
            delay_1ms();
            PORTC|=0xf0;
		  }
		  }
		  }
		else                  //只显示秒
		for(i=0;i<2;i++)
		 {
		   PORTA=seg_table[time[i]];
            PORTC=~(1<<(i+4));
            delay_1ms();
            PORTC|=0x30;
		 }
		 }
 }
//}
 //if(clock_start==0x00)    //跑表显示,当跑表已经启动时
  if(work_state==1)
  //{for(j=0;j<5;j++)
   {
    for(k=0;k<4;k++)
    {
    PORTA=seg_table[clock[k]];
    PORTC=~(1<<(k+4));
    delay_1ms();
    PORTC|=0xf0;
   }
  }
//}
}
void timer0_com_isr()  /* 2 ms*/
{
 TIFR=0xff;
// timer2++;     //10 ms
 timer200++;   //1 s,因为没有暂停的说法,所以一直加
//TCNT0=0x05;
TCNT0=0xd7;
 if(timer200==200)   //计时  1s 
 {
    timer200=0;
  	time[0]++;
	if(time[0]==10)  // second 个位 
	{
	 time[0]=0;
     time[1]++;
	 if(time[1]==6)  //second 十位
	  {
	   time[1]=0;
	   time[2]++;
	    if(time[2]==10) // 分个位
		 {
		  time[2]=0;
		  time[3]++;
		  if(time[3]==6)
		  time[3]=0;
		  time[2]=0;
  		  time[1]=0;
  		  time[0]=0;
		 } //time[2]
	  }  //time[1]
	}  //time[0]
	
 }   // 1s
 
 if(work_state==0x01&&clock_start==0) //跑表
 {
  timer2++;
  if(timer2==0x02)
  {timer2=0;
  clock[0]++;
  if(clock[0]==10)
  {
   clock[0]=0;
   clock[1]++;
   if(clock[1]==10)
   {
   	clock[1]=0;
	clock[2]++;
	if(clock[2]==10)
	{
	 clock[2]=0;
	 clock[3]++;
	  if(clock[3]==10)
	  {
	  clock[3]=0;
	 clock[0]=0;
	 clock[1]=0;
	 clock[2]=0;
	 }
	}
   }
  }
  }
 } 

 display();
}   //timer0_com_isr

void wait()
{
 while((PINB&0xf0)!=0xf0)
 {
  delay(20);
  while((PINB&0xf0)!=0xf0)
  ;
 }
}
void main()
{
 unsigned char i;
 timer2=0;
 timer200=0;
 work_state=0;
 time_change=0x00;
 clock_start=1; //停止跑表
/*  定时器0 定时 5 ms,general mode ,溢出 interrupt */ 
 TCCR0=0x07;   //general mode
 //TCNT0=0x05;
 TCNT0=0xd7;
 TIMSK=0x01;

 DDRB=0x0f; //set PB7~PB4 PULL-UP resistor
 PORTB=0xfe;
 for(i=0;i<4;i++)
 {
  time[i]=0;
  clock[i]=0;
 }
 SEI(); 
 while(1)
  {  
 
	while((PINB&0xf0)==0xf0)
	 {
	  delay(20);
	  while((PINB&0xf0)==0xf0)
	   ;
	 }
	temp=PINB&0xf0;
	 switch(temp)
	 {
	 case 0xe0:  //key 0 
	  if(work_state==0)
		 {
	 	  work_state=1;     //跑表模式
		  clock_start=1;    //跑表启动
		  for(i=0;i<4;i++)
		  clock[i]=0;
		 }
		else
		  work_state=0x00;
		  clock_start=0;
		  wait();
		  break;
	case 0xd0:  //key 1
	     if(work_state==0x00)
		 {
		  if(time_change==0x00)
		    time_change=0x01;
		  else if(time_change==0x01)
		    time_change=0x02;
		  else if(time_change==0x02)
		    time_change=0x00;
		}
		
		 if(work_state==0x01)  //跑表
		    {if(clock_start==0x0) //跑表已启动
		     {
			  for(i=0;i<4;i++)
			  clock[i]=0;
			 }
			 }
		
		wait();		     
		  break;
	 case 0xb0:  //key 2
	    if(work_state==0x0) // 计时模式
		  {if(time_change==0x1) //change second
		   {time[0]++;
		   if(time[0]==0xa)
		    {time[0]=0;
		     time[1]++;
		     if(time[1]==0x6)
		     time[1]=0;
			}
		   }
		   else if(time_change==0x02)  //change minute
		   {
		    time[2]++;
			if(time[2]==0xa)
			{time[2]=0;
			 time[3]++;
			 if(time[3]==0x6)
			 time[3]=0;
			 }
		   }
		  }
		 else if(clock_start==0x00)   //跑表模式,已经启动
		 clock_start=1;     //暂停
		 else
		  clock_start=0;
		 wait();
		  break;
	 case 0x70:  //key 3
	 	  if(work_state==0x00)  // 计时模式
		   {
		   	if(time_change==0x01) // 秒
			{
			 time[0]--;
			 if(time[0]==0xff)
			 {
			  time[0]=9;
			  time[1]--;
			  if(time[1]==0xff)
			  time[1]=5;
			 }
			}
		   else if(time_change==0x02)  //decrease minute
		   {
		   	time[2]--;
			if(time[2]==0xff)
			{
			 time[2]=9;
			 time[3]--;
			 if(time[3]==0xff)
			 time[3]=5;
			}
		   }
		   }
		  wait();
		  break;
	default:
	     break;
	      
	}
  }

}

⌨️ 快捷键说明

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