|
楼主 |
发表于 2011-12-2 15:20:18
|
显示全部楼层
回复【9楼】walshao 万少
-----------------------------------------------------------------------
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#define uchar unsigned char
#define uint unsigned int
uchar CodeTab[] =
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, // 0, 1, 2, 3, 4, 5
0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, // 6, 7, 8, 9, A, b
0x39, 0x5e, 0x79, 0x71 // C, d, E, F
};
uchar buffer[4]={0,0,0,0};
void port_init()
{
DDRD=0xff;
PORTD=0xff; //PA口设置为输出
DDRB=0xff;
PORTB=0xff; //PB口设置为输出
}
void ad_init()
{
ADMUX|=(1<<REFS0); //参考电压选择AVCC,模拟通道选择ADC0,单端输入
SFIOR|=(1<<ADTS1)|(1<<ADTS0); //定时器计数器0比较匹配作为触发源
ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//ADC使能,ADC使能中断,128预分频
}
void timer0_init()
{
TCNT0=0;
OCR0=90;
TCCR0|=(1<<WGM01)|(1<<CS02); //CTC模式,256预分频
TIFR|=(1<<OCF0); //清除比较匹配中断标志
TIMSK|=(1<<OCIE0); //输出比较匹配中断使能
}
void dat_buffer(uint dat)
{
uchar i;
for(i=0;i<4;i++)
{
buffer=dat%10;
dat/=10;
}
}
void display()
{
PORTB=~(1<<PB4);
PORTD=CodeTab[buffer[3]]|0x80;
_delay_ms(2);
PORTB=~(1<<PB5);
PORTD=CodeTab[buffer[2]];
_delay_ms(2);
PORTB=~(1<<PB6);
PORTD=CodeTab[buffer[1]];
_delay_ms(2);
PORTB=~(1<<PB7);
PORTD=CodeTab[buffer[0]];
_delay_ms(2);
}
int main()
{
uint i;
ad_init(); //ad转换初始化设置
timer0_init(); //定时器计数器0比较匹配初始化
port_init(); //IO口初始化设置
_delay_us(100);
sei(); //打开总中断
while(1);
}
ISR(ADC_vect)
{
ADCSRA|=(1<<ADSC);
uint ad_result,ad_dat;
ad_dat=ADC;
ad_result=(unsigned long)ad_dat*5000/1024; //换算成电压值
dat_buffer(ad_result);
display();
}
ISR(TIMER0_COMP_vect)
{
display();
}
那麻烦你看一下了。 |
|