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

📄 clock.c

📁 This is the source code of a digital clock implemented using Atmel 8 bit AVR Controller(ATMega16). T
💻 C
字号:
#include <mega16.h>

#define HOLD_TIME 300

char Hour = 12, Min = 0, Sec = 0;
char Display_Seconds;
int Counter;

interrupt [TIM0_COMP] void TIMER0_COMP(void)
{
 if (Counter == 2100)
 {
  Display_Seconds = 0;
  Counter++;
 }
 else
  if (Counter == 12500) 
  {
   if (Sec == 59)
	{
	 if (Min == 59)
	 {
	  if (Hour == 23) 
	   Hour = 0;
	  else Hour++;
	  Min = 0;
	 }
	 else Min++;
	 Sec = 0;
	}
	else Sec++;
   Counter = 0;
   Display_Seconds = 1;
  } 
  else Counter++;
} 

void main (void)
{
 int Digit_1, Digit_2, Digit_3, Digit_4;
 char Select_Digit, Current_Digit;
 int Display_Persist;
 char Set_Min_Ok = 1, Set_Hour_Ok = 1;
 
 DDRA = 0xFF;	
 DDRB = 0x0F;
 DDRC = 0x00;
 DDRD = 0x00;
 PORTA = 0x00; 
 PORTB = 0x0F;     
 PORTC = 0x00;
 PORTD = 0x00;

 TCCR0 = 0x0A; 
 TCNT0 = 0x00;
 OCR0 = 0x86;  
 TIMSK = 0x02;
 ACSR = 0x80;
 SFIOR = 0x01;  
 #asm("sei")

 for ( ; ; )
 {
  
  if ((!PINC.1) && (Set_Hour_Ok))
  {
   Set_Hour_Ok = 0;
   if (Hour == 23) 
    Hour = 0;
   else
    Hour++;
  }
  if (PINC.1)
   Set_Hour_Ok = 1;
  
  if ((!PINC.0) && (Set_Min_Ok))
  {
   Set_Min_Ok = 0;
   if (Min == 59) 
    Min = 0;
   else
    Min++;
  }
  if (PINC.0)
   Set_Min_Ok = 1; 
  
  Digit_4 = Min % 10;
  Digit_3 = Min / 10;
  Digit_2 = Hour % 10;
  Digit_1 = Hour / 10;
  
  for (Select_Digit = 0; Select_Digit < 4; Select_Digit++)
  {
   switch (Select_Digit)
   {
   	case 0: Current_Digit = Digit_1; break;
   	case 1: Current_Digit = Digit_2; break; 
   	case 2: Current_Digit = Digit_3; break;
   	case 3: Current_Digit = Digit_4; break;
   }
  
   switch (Current_Digit)
   {
   	case 0: PORTA = 0xC0; break;
   	case 1: PORTA = 0xF9; break;
   	case 2: PORTA = 0xA4; break;
   	case 3: PORTA = 0xB0; break;
   	case 4: PORTA = 0x99; break;
   	case 5: PORTA = 0x92; break;
   	case 6: PORTA = 0x82; break;
   	case 7: PORTA = 0xF8; break;
   	case 8: PORTA = 0x80; break;
   	case 9: PORTA = 0x90; break;	
   }
   
   if ((Select_Digit == 1 || Select_Digit == 2) && (Display_Seconds)) 
    PORTA.7 = 0;
   
   switch (Select_Digit)
   {
           case 0: PORTB.3 = 0; break;
           case 1: PORTB.2 = 0; break; 
           case 2: PORTB.1 = 0; break;
           case 3: PORTB.0 = 0; break;
   }

   for (Display_Persist = 0; Display_Persist < HOLD_TIME; Display_Persist++);
   
   PORTB |= 0x0F;

  }
 }
}

⌨️ 快捷键说明

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