-----------------------------------------------------------------------------*/
void get_code(void){
uchar i,dat,/*键码*/_dat;/*键码反码*/
uint temp=0;
for(i=0;i<16;i++){
if(arr[i]<7000){
//“0”
temp<<=1;
}
if(arr[i]>13000){
//“1”
temp<<=1;
temp|=1;
}
}
_dat=(uchar)(temp&0x00ff);/*键码*/
dat=(uchar)((temp>>8)&0x00ff);/*键码反码*/
/*“键码”与“键码反码相与,如果为0则解码正确*/
if((dat&_dat)==0){
ir_code=dat;
}
else{
TCNT1H = 0x00;
TCNT1L = 0x00;
ir_code=0xff;//解码出错
}
times=0;
index=0;
}
void init_devices(void)
{
CLI();
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x20;
SEI();
}
void main(void){
uchar i;
init_devices();
while(1){
if (OK_flag){
get_code();//解码
OK_flag=0;
}
for(i=0;i<200;i++){
dis_int(ir_code);//显示键码
}
}
}
//------------------------------------------------------------------------------
楼主程序今测试了下:
主要有两点改动
用M64,T3,晶体7.3728 ,GCC 20040214
1
void timer1_init(void)
{
TCCR3B = 0x00; //stop
TCNT3H = 0x00; //setup
TCNT3L = 0x00;
ICR3H = 0x00;
ICR3L = 0x08;
TCCR3A = 0x00;
/*一体化接收头的DATA引脚接到ATmega64的PE7(ICP3)引脚,采用上升沿捕捉的方法解码*/
/*晶振为7.3728M,8分频*/
TCCR1B = 0xC2; //start Timer @@@@@@@@@@@@@@@@@@@@@@@@@@@改动
}
2
SING(XXXXXXXXXXXXXXX)
{
uint value;
value=ICR3L;
value|=(uint)(ICR3H << 8);
TCNT3H = 0x00;
TCNT3L = 0x00;
times++;
if(times>18)&&(times<35){
//从第19个上升沿开始保存,直到第34个,短按时共有36个上升沿
arr[index]=value;
index++;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动
else if(times>35)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@改动
//else if(times>=35) //用此语句时第二个键值的第一位被上一键值的第36个脉冲复用,
{
//第35个上升沿到来时,解码完毕
times=0;
index=0;
OK_flag=1;
}
}
上一页 [1] [2]
本文关键字:程序 AVR单片机,单片机-工控设备 - AVR单片机