ATMEGA8計(jì)數(shù)器
#include
#include
#define uchar unsigned char
#define uint unsigned int
/***********對(duì)應(yīng)的幾個(gè)數(shù)碼管顯示*****************/
const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned long load=0;
uchar da
uint cnt=0;//定時(shí)中的中斷次數(shù)
uchar temp=0;//超過(guò)65536時(shí)這個(gè)數(shù)需要
//
void display(uchar *p)
{
uchar i,j,sel=0x01;
for(j=0;j<2;j++)
for(i=0;i<4;i++)
{PORTB=~table[p[i]];
PORTC=sel;
Delay_us(2000);
sel=sel<<1;
}
}
void process(unsigned long t,uchar *p)//數(shù)據(jù)處理
{unsigned long i=t;
if(i<=9999)
PORTD=PORTD|0X03;
else if((i<=99999)&&(i>9999))
{
i=i/100;
PORTD=PORTD&0XFE;
PORTD=PORTD|0X02;
}
else if(i>99999)
{
PORTD=PORTD|0X01;
PORTD=PORTD&0XFD;
i=i/1000;
}
p[3]=i/1000;
i=i%1000;
p[2]=i/100;
i=i%100;
p[1]=i/10;
i=i%10;
p[0]=i;
}
void int_io(void)
{DDRB=DDRC=0XFF;
DDRD=0XDF;
PORTC=PORTB=0XFF;
PORTD=0XFF;
SREG=0X80;//全局使能
TCCR1B=0X06;//計(jì)數(shù)方式:T1下降沿
TCNT1H=0X00;//計(jì)數(shù)器賦初值
TCNT1L=0X00;
}
void main(void )
{
int_io();
PORTB=0X00;
PORTC=0XFF;
Delay_ms(500);
PORTB=0XFF;
/****************************/
TCNT0=0X06;//定時(shí)計(jì)數(shù)初使值為6
TCCR0=0X04;//T/C0工作在定時(shí)方式,系統(tǒng)時(shí)鐘256分頻
TIMSK=0X01;//定時(shí)局部使能T/C0
while(1)
{
process(load,da
display(da
if(TIFR&0X04)//用標(biāo)志位來(lái)進(jìn)行 >65536時(shí)的事件
{ // if(TIFR&0X20)
temp++;
TIFR=TIFR&0X04;
}
}
}
/************************/
///////////////以下是T0的定時(shí)中斷
#pragma interrupt_handler time0:10
void time0(void)
{
uint tep=0;//讀取高字TCNT1L的值
cnt++;
if(125==cnt)//125*256us,且此處用于調(diào)節(jié)精度;
{
cnt=0;//
/********以下為讀取計(jì)數(shù)器的值***********/
load=0;
load=TCNT1L;//讀取計(jì)數(shù)器低位的值
tep=TCNT1H*256;//讀取計(jì)數(shù)器高位的值并處理
load=tep+load;//高位加低位
load=load+65536*temp;//處理完的數(shù)
/***********************/
TCNT1H=0X00;//重新賦初值
TCNT1L=0X00;
temp=0;
}
}
//TO用于定時(shí),
評(píng)論