专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
求教:按着遥控器的+,-键不放,让数值连续的增加或减少.
2020-02-06 09:48
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
3358
19
19
按着遥控器的+,-键不放,让数值连续的增加或减少,解码程序该怎么写?
我原来的程序是按一下,数值变一下的。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
rjx
2020-02-08 14:03
本帖最后由 rjx 于 2019-3-31 10:12 编辑
这是我原来使用的红外遥控程序,可以单次按键,使用没有问题,在AVR单片机里使用的,用INT0中断。现在想增加长按键,即按住不放,数码管的数字可以连续增加或减少,我也知道是要判断连发码,但搞了几天也没搞出来,请教高手。应如何在原代码的基础上增加判断连发码的功能,诚信求教了。
uchar IR_buf[4]={0x00,0x00,0x00,0x00}; //IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
/********us延时程序,延时时间0.14ms(140us*)*******/
void Delayus(uint x)
{
char i, j;
for(i=0;i<x;i++)
{for(j=0;j<210;j++);}
}
interrupt [EXT_INT0] void ext_int0_isr(void) //用中断来处理接收到的红外信号。
{
uchar i,j,sum=0;
GICR |=(0<<INT0); //开INT0中断
Delayus(20); //延时20*0.14MS ,2.8MS
for(i = 0;i < 14;i++)
{
Delayus(1);
if(IRIN) //9MS内有高电平,则判断为干扰,退出处理程序
{
GICR |=(1<<INT0);
return; //返回
}
}
while(!(IRIN)); //等待9ms低电平过去
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IRIN); //等待4.5ms高电平过去
while(!(IRIN)); //等待变高电平
while(IRIN) //计算高电平时间
{
Delayus(1); //延时0.14ms
sum++; //对0.14ms延时时间进行计数
if(sum >= 30) //高电平时间过长,则退出处理程序
{
GICR |=(1<<INT0);
return;
}
}
IR_buf
= IR_buf
>> 1; //接受一位数据
if(sum >= 6)
{IR_buf
= IR_buf
| 0x80;} //若计数值大于6(高电平时间大于0.56),则为数据1
sum = 0; //若计数小于6,数据最高位补"0",说明收到的是"0",同时计时清零
}
}
if(IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{ GICR |=(1<<INT0); return;}
HW_Status=1;
}
void RR() //遥控器键控处理程序
{
if(HW_Status==1)
{ static uchar m;
if((IR_buf[2]==0xfb)||(IR_buf[2]==e)) //音量加
{
if( VOLUME_1<98)
{++ VOLUME_1;}
else if( VOLUME_1>=98)
{ VOLUME_1=98;}
}
if((IR_buf[2]==0xfa)||(IR_buf[2]==b)) //音量减
{
if( VOLUME_1>0)
{-- VOLUME_1;}
}
}
加载中...
查看其它19个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
这是我原来使用的红外遥控程序,可以单次按键,使用没有问题,在AVR单片机里使用的,用INT0中断。现在想增加长按键,即按住不放,数码管的数字可以连续增加或减少,我也知道是要判断连发码,但搞了几天也没搞出来,请教高手。应如何在原代码的基础上增加判断连发码的功能,诚信求教了。
uchar IR_buf[4]={0x00,0x00,0x00,0x00}; //IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
/********us延时程序,延时时间0.14ms(140us*)*******/
void Delayus(uint x)
{
char i, j;
for(i=0;i<x;i++)
{for(j=0;j<210;j++);}
}
interrupt [EXT_INT0] void ext_int0_isr(void) //用中断来处理接收到的红外信号。
{
uchar i,j,sum=0;
GICR |=(0<<INT0); //开INT0中断
Delayus(20); //延时20*0.14MS ,2.8MS
for(i = 0;i < 14;i++)
{
Delayus(1);
if(IRIN) //9MS内有高电平,则判断为干扰,退出处理程序
{
GICR |=(1<<INT0);
return; //返回
}
}
while(!(IRIN)); //等待9ms低电平过去
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IRIN); //等待4.5ms高电平过去
while(!(IRIN)); //等待变高电平
while(IRIN) //计算高电平时间
{
Delayus(1); //延时0.14ms
sum++; //对0.14ms延时时间进行计数
if(sum >= 30) //高电平时间过长,则退出处理程序
{
GICR |=(1<<INT0);
return;
}
}
IR_buf = IR_buf >> 1; //接受一位数据
if(sum >= 6)
{IR_buf = IR_buf | 0x80;} //若计数值大于6(高电平时间大于0.56),则为数据1
sum = 0; //若计数小于6,数据最高位补"0",说明收到的是"0",同时计时清零
}
}
if(IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{ GICR |=(1<<INT0); return;}
HW_Status=1;
}
void RR() //遥控器键控处理程序
{
if(HW_Status==1)
{ static uchar m;
if((IR_buf[2]==0xfb)||(IR_buf[2]==e)) //音量加
{
if( VOLUME_1<98)
{++ VOLUME_1;}
else if( VOLUME_1>=98)
{ VOLUME_1=98;}
}
if((IR_buf[2]==0xfa)||(IR_buf[2]==b)) //音量减
{
if( VOLUME_1>0)
{-- VOLUME_1;}
}
}
一周热门 更多>