📄 timer0.c
字号:
/******************************************/
//文件名:Timer0.c
//功能: T/C0和INT0的应用
//作者: young
//时间: 2006.10.1
//目标MCU:ATmega8
//晶振: 8MHZ
/******************************************/
#include <iom8v.h>
#include <macros.h>
#include "Delay.h"
unsigned char KeyDown; //全局变量,用来记录按键按下次数
unsigned char CountNum; //记录T/C0中断,每中断一次是1/500S
unsigned char TimeNum[3]={0, 0, 0}; //记录中断时间,分,秒,百分秒
//初始化端口
void Init_Port(void)
{
DDRB=0xFF; //设置B口为输出模式
PORTB=0xFF; //置高电平
DDRC=0x7F;
PORTC=0x7F;
DDRD|=0x03;
PORTD=0xFF;
}
//初始化外部中断
void Init_Int(void)
{
MCUCR|=0x02; //INT0下降沿触发
GICR|=0x40; //打开INT0中断
GIFR|=0x40; //清除INT0中断标志位
}
//初始化T/C0
void Init_Timer0(void)
{
TCCR0=0x00; //T/C0工作于定时方式,先停止T/C0
TCNT0=0x06; //计数初始值6
TIMSK|=(1<<TOIE0); //开放TOV0中断
}
//显示定时时间
void Display(unsigned char *timer)
{
unsigned char i=0;
unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//依次显示"00:00.00"
for(i=0; i<6; i++)
{
PORTC&=~(1<<i);
switch(i)
{
case 1:
case 3:
PORTB=num[timer[i]]+0x80;
break;
default:
PORTB=num[timer[i]];
break;
}
delay_ms(1);
PORTC|=0xFF;
}
}
//INT0中断函数
#pragma interrupt_handler int0_fun:iv_INT0
void int0_fun(void)
{
KeyDown++;
switch(KeyDown)
{
case 1:
TCNT0=0x06; //计数初始值6
TCCR0=0x03; //打开T/C0,系统时钟64分频
break;
case 2:
TCCR0=0x00; //关闭T/C0
break;
default:
TimeNum[0]=TimeNum[1]=TimeNum[2]=0;//计时清零
KeyDown=0;
break;
}
}
//T/C0中断函数
#pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
void timer0_fun(void)
{
TCNT0=0x06 ; //重装计数初始值6
if(++CountNum==5)
{
CountNum=0; //计数到5次,计数值复位
TimeNum[2]++; //秒的百分位加1
if(TimeNum[2]==100)
{
TimeNum[2]=0;
TimeNum[1]++; //秒进位
}
if(TimeNum[1]==60)
{
TimeNum[1]=0;
TimeNum[0]++; //分进位
}
if(TimeNum[0]==60)
{
TimeNum[0]=0;
}
}
}
//主函数
void main()
{
unsigned char timer[6]={0, 0, 0, 0, 0, 0};
CLI(); //先关闭全局中断
Init_Port(); //初始化端口
Init_Int(); //初始化外部中断
Init_Timer0(); //初始化T/C0
KeyDown=0; //初始化全局变量
CountNum=0;
SEI(); //打开全局中断
while (1)
{
timer[0]=TimeNum[0]/10;
timer[1]=TimeNum[0]%10;
timer[2]=TimeNum[1]/10;
timer[3]=TimeNum[1]%10;
timer[4]=TimeNum[2]/10;
timer[5]=TimeNum[2]%10;
Display(timer); //显示时间
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -