单片机学习小组
登录
直播中
杨云
7年用户
774经验值
私信
关注
NEC解码协议的代码程序该怎样去实现呢
开启该帖子的消息推送
协议
解码
NEC
一个完整的NEC解码协议是由哪些部分组成的?
NEC解码协议的代码程序该怎样去实现呢?
回帖
(1)
蔡维林
2022-1-24 13:43:02
一、时序
一个完整的NEC解码协议,由以下几个部分组成,其中数据位为低位先行
详细的数据格式如下,其中如果一直按住一个按钮的时候,会隔110ms左右发一次引导码
二、代码实现
#include
#include
static uint64_t time_100us = 0;
static bool ir_pin_status = false;
static EN_IR__NEC_STATE_T en_ir_state = EN_IR_NEC_STATE_IDLE;
static uint8_t ir_receive_data_count= 0;
static uint32_t ir_receive_data= 0;
static uint8_t ir_key_code= 0;
static void device_ir_NEC_poll(TASK_PARAM)//定时器中断,100us触发一次,根据具体器件实现
{
time_100us ++;
if(time_100us >60000){
time_100us = 0;
}
}
static void device_ir_external_irq_pressed(void)//外部中断,配置为ir接收引脚,上升沿和下降沿都触发
{
ir_pin_status = platform_gpio_get_level(IR_PIN);//获取当前ir输入电平,高电平证明是上升沿触发,反之下降沿
switch(en_ir_state ){
case EN_IR_NEC_STATE_IDLE ://空闲状态
if(ir_pin_status ==0){//下降沿触发
en_ir_state = EN_IR_NEC_STATE_PREAMBLE_START_LOW;//状态改为等待9ms低电平引导码
}
break;
case EN_IR_NEC_STATE_PREAMBLE_START_LOW://9ms低电平引导判断
if((ir_pin_status ==1)&&(time_100us >=70)&&(time_100us <=110)){//满足9ms电平引导时序
en_ir_state = EN_IR_NEC_STATE_PREAMBLE_START_HIGH;//状态改为等待高电平引导码
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
break;
case EN_IR_NEC_STATE_PREAMBLE_START_HIGH://4.5ms高电平引导或repeat
if(ir_pin_status ==0){//下降沿触发
if((time_100us >=35)&&(time_100us <=60)){//4.5ms高电平引导
en_ir_state = EN_IR_NEC_STATE_RECEIVE_DECODE;//状态改为接收数据
ir_receive_data_count= 0;//清空接收计次
ir_receive_data= 0;//清空接收数据
} else if ((time_100us >=15)&&(time_100us <35)){//2.25ms高电平repeat
en_ir_state = EN_IR_NEC_STATE_RECEIVE_REPEAT;//状态改为repeat
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
break;
case EN_IR_NEC_STATE_RECEIVE_DECODE://接收数据
if(ir_pin_status == 0){//下降沿触发(即只判断高电平持续时间)
if((time_100us <=8)&&(time_100us >=3)){//满足(1.12-0.56ms)存入低电平
ir_receive_data >>= 1;
}else if((time_100us >=12)&&(time_100us <=20)){//满足(2.25-0.56ms)存入高电平
ir_receive_data = ((ir_receive_data >> 1) | 0x80000000);
}else{//校验失败
en_ir_state = EN_IR_NEC_STATE_IDLE;
}
if(++ir_receive_data_count >= 32){//接收到4个字节(两个头码和两个数据),后停止接收
device_ir_NEC_decode(ir_receive_data);//数据解码
en_ir_state = EN_IR_NEC_STATE_IDLE;//回到空闲状态
}
}
break;
case EN_IR_NEC_STATE_RECEIVE_REPEAT:
//自由选择是否继续报上一个键值
break;
}
time_100us = 0;//每次判断完数据,需要把计数清空
}
static bool device_ir_NEC_decode(uint32_t code)
{
uint8_t head_code_low = code &0x000000FF; //取出低8位数据
uint8_t head_code_high = (code &0x0000FF00) >> 8; //取出低8-16位数据
uint8_t key_code = (code &0x00FF0000) >> 16; //取出低16-24位数据
uint8_t key_code_minus = (code &0xFF000000) >> 24; //取出低24-32位数据
if((head_code_low ==IR_NEC_HEAD_CODE_LOW) && //判断是否是头码低位
(head_code_high ==IR_NEC_HEAD_CODE_HIGH) && //判断是否是头码高位
(key_code ==((~key_code_minus )&0xFF))){ //判断key_code_minus 是否是key的反码
ir_key_code = key_code;//获取键值
return true;
}
ir_key_code = 0;
return false;
}
bool device_ir_NEC_get_key(uint8_t *p_key)//用于给其他应用模块取得键值
{
if(!ir_key_code){
*p_key = ir_key_code;
ir_key_code =0;//获取过键值后,清空键值
return true;
}
return false;
}
一、时序
一个完整的NEC解码协议,由以下几个部分组成,其中数据位为低位先行
详细的数据格式如下,其中如果一直按住一个按钮的时候,会隔110ms左右发一次引导码
二、代码实现
#include
#include
static uint64_t time_100us = 0;
static bool ir_pin_status = false;
static EN_IR__NEC_STATE_T en_ir_state = EN_IR_NEC_STATE_IDLE;
static uint8_t ir_receive_data_count= 0;
static uint32_t ir_receive_data= 0;
static uint8_t ir_key_code= 0;
static void device_ir_NEC_poll(TASK_PARAM)//定时器中断,100us触发一次,根据具体器件实现
{
time_100us ++;
if(time_100us >60000){
time_100us = 0;
}
}
static void device_ir_external_irq_pressed(void)//外部中断,配置为ir接收引脚,上升沿和下降沿都触发
{
ir_pin_status = platform_gpio_get_level(IR_PIN);//获取当前ir输入电平,高电平证明是上升沿触发,反之下降沿
switch(en_ir_state ){
case EN_IR_NEC_STATE_IDLE ://空闲状态
if(ir_pin_status ==0){//下降沿触发
en_ir_state = EN_IR_NEC_STATE_PREAMBLE_START_LOW;//状态改为等待9ms低电平引导码
}
break;
case EN_IR_NEC_STATE_PREAMBLE_START_LOW://9ms低电平引导判断
if((ir_pin_status ==1)&&(time_100us >=70)&&(time_100us <=110)){//满足9ms电平引导时序
en_ir_state = EN_IR_NEC_STATE_PREAMBLE_START_HIGH;//状态改为等待高电平引导码
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
break;
case EN_IR_NEC_STATE_PREAMBLE_START_HIGH://4.5ms高电平引导或repeat
if(ir_pin_status ==0){//下降沿触发
if((time_100us >=35)&&(time_100us <=60)){//4.5ms高电平引导
en_ir_state = EN_IR_NEC_STATE_RECEIVE_DECODE;//状态改为接收数据
ir_receive_data_count= 0;//清空接收计次
ir_receive_data= 0;//清空接收数据
} else if ((time_100us >=15)&&(time_100us <35)){//2.25ms高电平repeat
en_ir_state = EN_IR_NEC_STATE_RECEIVE_REPEAT;//状态改为repeat
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
}else{
en_ir_state = EN_IR_NEC_STATE_IDLE;//校验失败,返回空闲状态
}
break;
case EN_IR_NEC_STATE_RECEIVE_DECODE://接收数据
if(ir_pin_status == 0){//下降沿触发(即只判断高电平持续时间)
if((time_100us <=8)&&(time_100us >=3)){//满足(1.12-0.56ms)存入低电平
ir_receive_data >>= 1;
}else if((time_100us >=12)&&(time_100us <=20)){//满足(2.25-0.56ms)存入高电平
ir_receive_data = ((ir_receive_data >> 1) | 0x80000000);
}else{//校验失败
en_ir_state = EN_IR_NEC_STATE_IDLE;
}
if(++ir_receive_data_count >= 32){//接收到4个字节(两个头码和两个数据),后停止接收
device_ir_NEC_decode(ir_receive_data);//数据解码
en_ir_state = EN_IR_NEC_STATE_IDLE;//回到空闲状态
}
}
break;
case EN_IR_NEC_STATE_RECEIVE_REPEAT:
//自由选择是否继续报上一个键值
break;
}
time_100us = 0;//每次判断完数据,需要把计数清空
}
static bool device_ir_NEC_decode(uint32_t code)
{
uint8_t head_code_low = code &0x000000FF; //取出低8位数据
uint8_t head_code_high = (code &0x0000FF00) >> 8; //取出低8-16位数据
uint8_t key_code = (code &0x00FF0000) >> 16; //取出低16-24位数据
uint8_t key_code_minus = (code &0xFF000000) >> 24; //取出低24-32位数据
if((head_code_low ==IR_NEC_HEAD_CODE_LOW) && //判断是否是头码低位
(head_code_high ==IR_NEC_HEAD_CODE_HIGH) && //判断是否是头码高位
(key_code ==((~key_code_minus )&0xFF))){ //判断key_code_minus 是否是key的反码
ir_key_code = key_code;//获取键值
return true;
}
ir_key_code = 0;
return false;
}
bool device_ir_NEC_get_key(uint8_t *p_key)//用于给其他应用模块取得键值
{
if(!ir_key_code){
*p_key = ir_key_code;
ir_key_code =0;//获取过键值后,清空键值
return true;
}
return false;
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
协议
解码
NEC
怎样
去
编写IR
NEC
协议
的驱动
程序
呢
2022-02-14
889
怎样
去
编写基于38khz的
NEC
协议
红外接收编码与
解码
的
程序
2022-02-15
1835
怎么使用psoc 4
解码
IR
NEC
协议
代码
2019-01-09
1660
如何利用
NEC
协议
实现
红外遥控?
2021-04-19
1712
如何用
NEC
协议
模拟家电遥控器对设备进行遥控操作
呢
2021-11-25
1535
怎样
读取
NEC
格式的遥控器编码
程序
呢
2022-02-14
1411
Lora sx1278是
怎样
利用串口
协议
去
实现
数据传输的
呢
2022-02-21
1738
怎样
实现
普通IO口对LED灯亮度的控制
呢
2022-01-17
1191
基于51单片机红外避障循迹模块的
代码
程序
该
怎样
去
实现
呢
2022-03-01
1803
stm32通过串口向上位机发送数据的
程序
该
如何
去
实现
呢
2021-12-10
1401
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分