📄 dynamic_scanning.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 + -