|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-3-7 13:31:51
|
显示全部楼层
下面的程序是用1602液晶显示器显示ICR1的计算
希望懂的朋友帮忙解答一下
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#include"1602.c"
unsigned int Flag,Flag1;
unsigned char Data[6]={0,0,0,0,0,0};//初始值为0000,最后一个0是结束符
unsigned int Counter; //计数
unsigned int u;
void change(unsigned int i,unsigned char *p) //显示处理,,+48是因为液晶显示的是ASCII码
{
p[4]=i%10+48; //个
p[3]=i/10%10+48; //十
p[2]=i/100%10+48; //百
p[1]=i/1000%10+48; //千
p[0]=i/10000%10+48; //万
}
unsigned int ICR1_convert(void) //读取ICR1寄存器的转换函数
{
unsigned int temp1,temp2,temp3;
temp1=(unsigned int)ICR1L;
temp2=(unsigned int)ICR1H;
temp3=temp2;
temp2=0.1/(0.001*temp3);
return temp2;
}
void interrupt_init(void)
{
//定时器/计数器0中断初始化
TIMSK|=(1<<TICIE1)|(1<<TOIE0);
TCCR0|=(1<<CS00); //工作于普通模式,不分频
//定时器频率=8M/1=8000000
TCNT0=255; //初值设置,定时间=(256-255)/8000000=0.125us
//定时器/计数器1捕捉中断初始化
TCCR1B|=(1<<ICNC1)|(1<<CS10)|(1<<CS12); //开启捕捉噪声抑制器,下降沿方式
//TCCR1B|=(1<<ICNC1)|(1<<CS00)|(1<<CS10)|(1<<CS12); //开启捕捉噪声抑制器,上升沿方式
TIMSK|=(1<<TICIE1); //T/C1溢出中断允许
}
int main(void)
{ unsigned int i;
PORTB=0X00;
DDRB=0XFF;
PORTD=0X40;
DDRD=0Xbf;
LCD_init();
interrupt_init();
sei();
while(1)
{
change(u,Data);
LCD_write_string(4,0,"LOW_");
LCD_write_string(8,0,Data);
i=ICR1_convert(); //将转换赋给i
change(i,Data);
LCD_write_string(3,1,"HIGH_");
LCD_write_string(8,1,Data);
}
}
ISR(TIMER1_CAPT_vect) //定时器/计数器1捕捉中断//每一次下降沿执行一次下面的语句
{
TCNT1=0; //清零计数寄存器
u=Counter;
Counter=0;
//添加须要中断处理的程序
}
SIGNAL(TIMER0_OVF_vect) //定时器计数器2溢出中断
{
TCNT0=255;
Counter++;
//添加须要中断处理和程序
} |
|