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

📄 main.c

📁 Digital Clock Source using ATmega8515 and 7Segment
💻 C
字号:
/*

*** 雀肺 楷搬档 **

* MCU : ATmega8515
* RTC : DS1302
		PORTE
			0-CE
			1-IO
			2-CLK
* SEGMENT : Common Anode
		PORTD :Segment Data(8bit)
		
		PORTB : SCAN
			0~3-DIGIT
			4-LED

* BUTTON
		PORTA
			0~3
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "delay.h"
#include "ds1302.h"
#include "seg.h"
#include "key.h"

//                       (0,    1,    2,    3,    4,    5,    6,    7,    8,    9)
static U8 segment[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

enum {mode_min, mode_hour};

// DS1302肺何磐 矫埃阑 罐酒坷扁 困茄 函荐
static U8	second=0;
static U8	minute=0;
static U8	hour=0;

// 技弊刚飘狼 阿 磊府俊 秦寸窍绰 函荐
static U8 second0=0;
static U8 second1=0;
static U8 minute0=0;
static U8 minute1=0;
static U8 hour0=0;
static U8 hour1=0;

// 惑怕函拳俊 荤侩登绰 函荐
static U8	mode_flag=0;	// mode 捞悼
static U8	current_pos=0;	// 矫埃, 盒阑 函版矫 函版窍绊 乐绰 葛靛狼 困摹
static U8	read_flag=0;		// 矫埃阑 荐沥且 悼救 DS1302俊辑 单捞磐甫 罐酒坷瘤 给窍霸

void display_time(void);


SIGNAL(SIG_OVERFLOW0)
{
	display_time();

	TCNT0 = 249;

}


int main()
{
	// 林函 IO 檬扁拳
	Init_DS1302();	
	Init_KEY();
	Init_SEG();


	TCCR0 = 0x05;	// 1/1024 橇府胶纳老矾
	TCNT0 = 249; 	// 1/100檬甫 困茄 鸥捞赣 0x64(100)
	TIMSK = 0x02;	// timer0 interrupt enable
	TIFR = 0x00;	

	sei();

	while(1)
	{

		if (read_flag == 0)
		{
			second = DS1302_Read(DS1302_SECOND);
			minute = DS1302_Read(DS1302_MINUTE);
			hour = DS1302_Read(DS1302_HOUR);

			second0 = (U8)second & 0x0F;
			second1 = (U8)(second >> 4)& 0x07;

			minute0 = (U8)minute & 0x0F;
			minute1 = (U8)(minute >> 4)& 0x07;


			hour0 = (U8)hour & 0x0F;
			hour1 = (U8)(hour >> 4) & 0x03;

			// led 濒糊烙
			if ((second % 2) == 0)			
				sbi(SCAN_PORT, SCAN_LED);				
			else
				cbi(SCAN_PORT, SCAN_LED);				
		}


		// 荤侩磊 虐 瘤沥
		if (KEY_MODE == 0)
		{
			read_flag = 1; // DS1302俊辑 矫埃 罐酒 坷瘤 给窍霸 窍妨绊
						
			switch (mode_flag)
			{
				case 0 :
					current_pos = mode_min;
					mode_flag=1;
					break;					

				case 1 :
					current_pos = mode_hour;
					mode_flag=2;
					break;

				case 2 :
					mode_flag=0;					
					read_flag = 0;  // DS1302俊辑 矫埃 罐酒 坷霸

					minute = ((minute1<<4) | minute0);
					hour = ((hour1<<4) | hour0);

  					DS1302_Write(DS1302_SECOND, 0x00); 		// second 00
					DS1302_Write(DS1302_MINUTE, minute);
					DS1302_Write(DS1302_HOUR, hour&0x7f);    	// 24hour set
					break;
				default :
						break;
			} // end switch

			delay_ms(20);
		}

		else if ((KEY_UP == 0))
		{
			if (current_pos == mode_min)
			{
				minute0++;				
				if (minute0 == 10)
				{
					minute0=0;
					minute1++;
						if (minute1 == 6)
							minute1 = 0;						
				}
			}

			else if (current_pos == mode_hour)
			{
				hour0++;
				
				if (hour0 == 10)
				{
					hour0=0;
					hour1++;						
				}

				if ((hour1 == 2) && (hour0 == 5))
				{
					hour1 = 0;
					hour0 = 0;
				}
			}
			delay_ms(20);
		}

		else if (KEY_DOWN == 0)
		{
			if (current_pos == mode_min)
			{
				minute0--;				
				if (minute0 == 0)
				{
					minute0=9;					
					if (minute1 == 0)
						minute1 = 6;
					--minute1;
				}
			}
			else if (current_pos == mode_hour)
			{
				hour0--;
				
				if (hour0 == 0)
				{
					hour0 = 9;
					hour1--;
					if (hour1 == 0)
						hour1 = 3;						

				}				
			}
			delay_ms(20);
		}


	} // end while		

	return 0;
} // end main

void display_time(void)
{
		// 矫埃(hour)狼 惑困磊府
		SEG_PORT = segment[hour1];
		SCAN_PORT = 0x08;
		delay_us(250);
		delay_us(250);

		// 矫埃(hour)狼 窍困磊府
		SEG_PORT = segment[hour0];
		SCAN_PORT = 0x04;
		delay_us(250);
		delay_us(250);

		// 盒(minute)狼 惑困磊府
		SEG_PORT = segment[minute1];
		SCAN_PORT = 0x02;
		delay_us(250);
		delay_us(250);

		// 盒(minute)狼 窍困磊府
		SEG_PORT = segment[minute0];
		SCAN_PORT = 0x01;
		delay_us(250);
		delay_us(250);
}

⌨️ 快捷键说明

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