#include
#include
#define uchar unsigned char
#define uint unsigned int
/***********对应的几个数码管显示*****************/
const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned long load=0;
uchar da
uint cnt=0;//定时中的中断次数
uchar temp=0;//超过65536时这个数需要
//
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)//数据处理
{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;//计数方式:T1下降沿
TCNT1H=0X00;//计数器赋初值
TCNT1L=0X00;
}
void main(void )
{
int_io();
PORTB=0X00;
PORTC=0XFF;
Delay_ms(500);
PORTB=0XFF;
/****************************/
TCNT0=0X06;//定时计数初使值为6
TCCR0=0X04;//T/C0工作在定时方式,系统时钟256分频
TIMSK=0X01;//定时局部使能T/C0
while(1)
{
process(load,da
display(da
if(TIFR&0X04)//用标志位来进行 >65536时的事件
{ // if(TIFR&0X20)
temp++;
TIFR=TIFR&0X04;
}
}
}
/************************/
///////////////以下是T0的定时中断
#pragma interrupt_handler time0:10
void time0(void)
{
uint tep=0;//读取高字TCNT1L的值
cnt++;
if(125==cnt)//125*256us,且此处用于调节精度;
{
cnt=0;//
/********以下为读取计数器的值***********/
load=0;
load=TCNT1L;//读取计数器低位的值
tep=TCNT1H*256;//读取计数器高位的值并处理
load=tep+load;//高位加低位
load=load+65536*temp;//处理完的数
/***********************/
TCNT1H=0X00;//重新赋初值
TCNT1L=0X00;
temp=0;
}
}
//TO用于定时,
上一篇:外部异步时钟的操作
下一篇:AVR单片机熔丝位设置技巧
推荐阅读最新更新时间:2024-03-16 15:09