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

📄 dynamic_scanning.c

📁 这个是一个简单的avr单片机电子成年历程序。
💻 C
字号:
#include<avr/io.h>
#include<util/delay.h>
#include<inttypes.h>
#include<avr/interrupt.h>
#include<avr/signal.h>

volatile unsigned char SECOND=0;//volatile 
unsigned char MINUTE=21;
unsigned char HOUR=16;
unsigned char DATE=20;
unsigned char WEEK=1;
unsigned char MONTH=4;
unsigned char YEAR=9;
unsigned char CENTURY=20;
unsigned char display_data[15];//={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};
unsigned char display_code[11]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管段码表
//{0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段码表


/***********************************************
                   中断服务函数
***********************************************/
SIGNAL(SIG_OVERFLOW1)
{
	SECOND++;
	TCNT1L=0X2F;//定时器初始化
	TCNT1H=0XFC;
}


/***********************************************
                   时间处理函数
***********************************************/
void processing_time()
{
	unsigned int CENTURY_A;
	if(SECOND>59)//判断是否到1分钟
	{
		SECOND=0;
		MINUTE++;
	}
	if(MINUTE>59)//判断是否到1小时
	{
		MINUTE=0;
		HOUR++;
	}
	if(HOUR>23)//判断是否计数到一天
	{
		HOUR=0;
		DATE++;
		WEEK++;
	}
	if(MONTH>12)//判断是否到一年
	{
		MONTH=1;
		YEAR++;
	}
	switch(MONTH)//判断是否到一个月
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			if(DATE>31)
			{
				DATE=1;
				MONTH++;
			}break;
		case 4:
		case 6:
		case 9:
		case 11:
			if(DATE>30)
			{
				DATE=1;
				MONTH++;
			}break;
		case 2://闰年判断并判断2月
			{
				CENTURY_A=CENTURY*100+YEAR;
				if(((CENTURY_A%4==0)&&(CENTURY_A%100!=0))||(CENTURY_A%400==0))
				{
					if(DATE>29)
					{
						DATE=1;
						MONTH++;
					}
				}
		    	else if(DATE>28)
					{
						DATE=1;
						MONTH++;
					}
			}break;
	}
	if(WEEK>8)
	{
		WEEK=1;
	}
	if(WEEK==7)
	{
		WEEK=8;
	}
	//void processing_week(void);
}


/***********************************************
                   显示处理函数
***********************************************/
void display_count(void)
{
	display_data[0]=CENTURY/10;
	display_data[1]=CENTURY%10;
	display_data[2]=YEAR/10;
	display_data[3]=YEAR%10;
	display_data[4]=MONTH/10;
	display_data[5]=MONTH%10;
	display_data[6]=DATE/10;
	display_data[7]=DATE%10;
	display_data[8]=0x0A;
	display_data[9]=WEEK;
	display_data[10]=HOUR/10;
	display_data[11]=HOUR%10;
	display_data[12]=MINUTE/10;
	display_data[13]=MINUTE%10;
	display_data[14]=SECOND/10;
	display_data[15]=SECOND%10;
}


/***********************************************
                   显示函数
***********************************************/
void display(void)
{
	unsigned char i,x;

	for(i=0;i<16;i++)
	{
		x=display_code[display_data[i]];
		PORTA=0X00;
		PORTA=x;
		PORTB=i;
		display_count();
	}
}


/***********************************************
                     主函数
***********************************************/
int main(void)
{

	DDRA=0X00;
	DDRB=0XF0;

	TCNT1L=0X2F;//定时器初始化
	TCNT1H=0XFC;

	TCCR1A=0;//设为定时器功能
	TCCR1B=5;//预分频数1024
	TIMSK=(1<<TOIE1);//TIMSK为定时器、计数器的中断屏蔽寄存器
					 //TOIE1即TIMER1的溢出中断使能位,置1清零
	TCNT1L=0X2F;//定时器初始化
	TCNT1H=0XFC;

	sei();//开全局中断

	while(1)
	{
		processing_time();
		display();
	}
}

⌨️ 快捷键说明

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