NEC协议的遥控器参考代码
红外遥控协议标准(NEC RC5)及编程
红外遥控协议标准(NEC/RC5/RC5X)及编程目录1.NEC码遥控器技术标准2.RC5/RC5X码遥控器技术标准3.解码原理及算法(NEC)4.实例代码(NEC)1.NEC码遥控器技术标准特点:8位的系统码和8位的命令码长度为了增加可靠性,地址码(即用户码)和命令码都要发送两次脉冲宽度调制载波频率为38K每一位的时间长度为1.12ms或2.25ms其逻辑1与逻辑0的表示如图所示:逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。
所以我们根据脉冲时间长短来解码。
推荐载波占空比为1/3至1/4。
NEC协议格式:首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit 的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。
然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit的命令码的反码。
地址和命令发送两次。
第二次发送时,所有的位取反,用来验证第一次发送的消息。
如果开发者不用验证,则可以忽略验证的数据,或者将地址或命令扩展为16bit以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:就是说,发了一次命令码之后,不会再发送命令码,而是每隔110ms时间,发送一段重复码。
重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成。
需要注意的是:1838红外一体接收头为了提高接受灵敏度。
输入高电平,其输出的是相反的低电平。
2、编程注意事项2.1红外接收头引脚信号是相反的电平。
2. 2数据从LSB(低位)开始发送,所以选择右移方式接收数据。
四个字节的数据都是先发送D0,最后发送D7。
所以接收到1位数据后,给变量的最高位赋值,右移。
或者先右移,再给变量的最高位赋值。
2.3.可以用一个数组保存32个数据的持续时间,用于后面判断高低电平。
用定时器对两个数据(中断)之间的时间计时,并保存这个持续时间用于以后判断是位1还是位0。
nec码红外遥控完整编码
nec码红外遥控完整编码红外遥控编码程序如下:NEC .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_CUSTOMER_1 DB ? ;遥控器头码(客户码)低八位a_CUSTOMER_2 DB ? ;遥控器头码(客户码)高八位#define CUS_6221_1 00110100b ;1234H#define CUS_6221_2 00010010b ;@------------------------------------------------NEC_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************;;遥控码发送:SEND_REMOTE_CODE:clr WDT ;清除进位标志,检测遥控发送的有效的按键SZ fg_SendActive ;SZ表示以0结尾的字符串JMP READY_SEND ;跳转到READY_SEND模块retREADY_SEND:NEC_CODE:mov A,a_KEY_NUM ;将数值发送到寄存器A中,直接寻址mov M_TBLP,ATABRDL a_REM_CODE ;查表专用指令;读取遥控头码(客户码)低八位数值 MOV A,CUS_6221_1MOV a_CUSTOMER_1,AMOV A,CUS_6221_2MOV a_CUSTOMER_2,A以上为READY_SEND运行模块,同时是为后面NEC码发送的准备;首先将一个按键的数值已以直接寻址方式发送到寄存器A中,将寄存器A的是发送到M_TBLP 中,然后查表a_REM_CODE,将CUS_6221_1的值发送到寄存器中,在赋值给遥控器头码(客户码)低八位a_CUSTOMER_1,同理,将CUS_6221_2赋值给遥控器头码(客户码)低八位a_CUSTOMER_2,随后即开始发送NEC遥控码。
RC-5码和NEC码技术标准
RC-5码和NEC码技术标准本技术标准包含RC-5码和NEC码两部分RC-5码遥控器技术标准特点:5位地址码和6位命令码(RC5X为7位)Bi-phase coding(即Manchester coding)双相编码载波频率为36KHz每发一位数据的时间是1.778ms(即36KHz频率下64个周期)载波调制:图1 逻辑0和1的波形RC-5码协议使用36KHz频率的双相编码红外载波。
每一位的时间都是等长的为1.778ms,并且每一位中有一半的时间为36KHz载波的高电平,另一半为低电平,如图1所示逻辑“1”和“0”的波形。
当为逻辑“0”时,其前一半时间为高电平;而为逻辑“1”时,后一半时间为高电平。
注:如果前后两位的值相同,在发第二个值时需要转换电平;如果前后两位值不同,在发第二个值时不需要转换电平。
这样叫作双向编码。
协议:下图是一个RC-5码的逻辑队列。
图2 RC-5码的逻辑队列前两位为开始位,并且必须设为逻辑1。
注意当红外接收器接收到开始位时,1bit时间的一半已经过去了。
对于扩展的RC-5码,开始位S2用来作为命令码的第六位,即共有7位的命令码。
第三位是翻转位,当一个键值发出然后再按下时该位会取反,这样接收器就会知道该键是一直按下,还是被重新按下了。
接下来的5位是IR设备地址码,地址码按从MSB到LSB发送;跟着地址码的是6位命令码,命令码也是从MSB开始发送。
这样一个消息由14bit组成,一个消息的周期加起来是25ms。
但有时一个消息的周期会短一点,因为S1前一半是空转,而且命令码的最后一位的后一半也可能是空转的。
图3 连续按键波形如果常按某一键,消息则会每隔114ms发送一次,并且在这些消息中bit3翻转位会一直维持同一值,如图3。
图4 完整的波形每一帧数据之前都有16bit等待时间和2bit扫描时间,如图4所示。
采用的RC5码遥控器的波形图如下:(MENU按键)键值命令:以下是根据RC-5码键值命令标准确定的海信电视机RC-5码遥控器键值规范。
NEC遥控编码解析
一NEC编码介绍(来自网络)NEC编码的一帧(通常按一下遥控器按钮所发送的数据)由引导码、地址码及数据码组成,,如下图所示,把地址码及数据码取反的作用是加强数据的正确性。
引导码及数据的定义如下图所示,当一直按住一个按钮的时候,会隔110ms 左右发一次引导码(重复),并不带任何数据以下是用示波器采集到的一直按住某个按钮时的波形:按一下按钮的波形:二解析程序预置条件:每125us产生一次中断用于计数算法介绍:统计两个下降沿之间的计数个数。
如果是在103左右,则认为收到了引导码。
如果是18左右,则认为接收到逻辑1;如果在9左右,则认为接收到逻辑0。
在125us的定时器中断服务程序中,调用如下程序进行编码解析。
uchar port_recv_cnt = 120;uchar port_recv_bit_cnt = 0;uchar port_recv_low_cnt = 0;bit port_recv_low_flg = 0;bit port_recv_high_flg = 0;bit port_recv_start_flg = 0;unsigned long idata port_recv_data = 0;/* NTC remote receive programme */void Port_Recv_Proc(){uchar oposite_data1;uchar oposite_data2;if(0 == PORT_RECV_LINE){if(!port_recv_low_flg){// 第一次接收低电平,开始计数器计数port_recv_cnt = 0;port_recv_low_flg = 1;port_recv_high_flg = 0;return;}else if(!port_recv_high_flg){// 低电平计时port_recv_cnt++;return;}else{// 低->高->低,认为一次计数完成,清除标志,下次重新计时port_recv_low_flg = 0;if(port_recv_cnt >= 120) //异常{port_recv_high_flg = 0;port_recv_start_flg = 0;return;}else if(port_recv_cnt >= 100) // 引导码{port_recv_start_flg = 1;port_recv_bit_cnt = 0;return;}else if(port_recv_cnt >= 40) //异常{port_recv_bit_cnt = 0;port_recv_start_flg = 0;return;}else if(port_recv_cnt >= 15) // 逻辑1{port_recv_data = port_recv_data << 1;port_recv_data = port_recv_data | 0x01;port_recv_bit_cnt++;}else //逻辑0{port_recv_data = port_recv_data << 1;port_recv_bit_cnt ++;}// 一共有32bitif(port_recv_bit_cnt < 32){return;}else{port_recv_bit_cnt = 0;if(!port_recv_start_flg) // 一定要有引导码{return;}port_recv_start_flg = 0;oposite_data1 = ((port_recv_data & 0xff00)/0xff) ; //数据位校验oposite_data2 = (port_recv_data & 0xff);if(0xff != (oposite_data2 +oposite_data1) )return;remote_key_cnt = oposite_data2;}}}else{if(!port_recv_low_flg)return;port_recv_cnt++; // 高电平计数port_recv_high_flg = 1;return;}}。
nec遥控协议
原码,第二个为反码
ucharnec_status=0;//遥控器的按键状态信息。0:无按
键;1:一次按键;2:连续按键
ucharnec_actflag=0;//用于带到主函数里的按键响应
标志。0:不动作;1:动作
#ifndefnec_inF_s_h
#definenec_inF_s_h
voidnec_init();//初始化函数,注意一定要拉高,拉
就错误了
(
nec_dat=1;
}
voidnec_delay()//延时0.8ms左右,要求要非常精确,
这是正确读数的关键
(
uchari;
for(i=0;i }
/*voidnec_act()//按键响应程序,根据自己需要写
(
nec_getdat() ; //先扫描一遍红外信号
if(nec_actflag==1)//如果是正确的红外信号才处理,
(
num=0;while((nec_dat==0)
if(nec_dat==1)
(
nec_delay();nec_delay();nec_delay();
if(nec_dat==1)nec_status=2;
else
(
nec_id[0]=0x01;
NEC协议的红外遥控器驱动程序
是不是觉得红外遥控 +51单片机是绝妙组合?但是在编程时才发现超级纠结?其实也 没那么纠结,自己摸索摸索,总能找出办法来的。
本程序占用了 51单片机的定时器 0以及中断1两个资源,为的是使单片机能接收到每 一个红外脉冲信号, 一个都不能少。
如果舍不得用这两个资源,还有另一种查询的办法,就 是不一定每个信号都能收到,可自己琢磨一下。
需要全套NEC 协议红外遥控器资料的,到网上找,到处都有,而且很全。
另外,对着资料写程序如果实在写不出,可以找个示波器,把波形录下来好好研究研 究。
毕竟有些时候资料会过时,只要里面有一点东西变化了, 程序就完全不一样了。
这种弯 路,尽量少走。
本程序只是头文件,具体到应用上还要各位自己动脑筋了,希望对大家有所帮助。
共 同学习,共同进步! 69 70 71 68 64 67 07 21 09 22 25 13 12 24 94 08 28 90 66 82 74 NEC 协议的红 外遥控器按 键对应数字 一览/******************************************************************INF_NEC.h用于NEC 协议的遥控器,主控器为 51单片机。
用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码。
注意:本驱动占用 51单片机的外部中断1以及定时器0两个资源,编程时注意 不要再乱动这两个资源。
*******************************************************************/#in clude<reg52.h> #defi ne uchar un sig ned char#defi ne uint un sig ned intuchar nec_cod[2]={0,1};〃遥控器的编号,编号 uchar nec_dat[2]={0,1};〃遥控器的数据,数据 #ifndef __INF_NEC_#defi ne __INF_NEC extern void n ec_i nit(); extern void n ec_act();#en difvoid nec_init() //外中断1及定时器0的初始化函数{TMOD=(TMOD&0xf0)|0x02; // 定时器0模式2,8位自动重装//11.0592MHz 晶振,计数 230次,大概时间 250us//定时器0使能,先关着〃外部中断1使能,用来接收红外信号〃开总中断void nec_act()//按键功能程序{if(( nec_dat[0]==~ nec_dat[1]) &&(n ec_flag==3)){switch( nec_dat[0]){case 69: break;case 70: break;case 71: break;case 68:break;case 64:break; uchar nec_flag=0;//nec_flag:遥控码的标志位。
红外线遥控器(nec编码方式)
抗干扰优化
通过调整编码方式或增加滤波器等手段,增强遥控器的抗干扰能 力。
测试结果与结论
测试结果显示,该红外线遥控器 在有效范围内能够正常工作,按 键响应准确,抗干扰能力较强。
通过调试优化,进一步提高了遥 控器的性能和稳定性。
结论:该红外线遥控器符合预期 要求,可以用于实际应用中。
在NEC编码中,脉冲的宽度和间隔时间 被分为两种不同的比例,即1:2和1:1, 通过这两种比例的不同组合,可以表示 出0和1两种不同的二进制位。
当发送数据时,首先发送起始位,然 后是数据位,最后是停止位。起始位 是一个较长的脉冲和一个较短的间隔 时间,数据位由一系列的脉冲和间隔 时间组成,停止位是一个较短的脉冲 和一个较长的间隔时间。
红外线遥控器(NEC编码方式)
目 录
• 红外线遥控器简介 • NEC编码方式简介 • 红外线遥控器(NEC编码方式)的电路设计 • 红外线遥控器(NEC编码方式)的软件设计 • 红外线遥控器(NEC编码方式)的测试与调试
01 红外线遥控器简介
红外线遥控器的原理
红外线遥控器利用红外线作为信号传输介质,通过调制信号来控制设备的开关或功 能。
THANKS FOR WATCHING
感谢您的观看
01
采用NEC编码算法,将按键信息转换为红外线信号。
解码算法
02
将接收到的红外线信号解码为按键信息。
测试与调试
03
对编码和解码算法进行测试和调试,确保其正确性和稳定性。
05 红外线遥控器(NEC编码 方式)的测试与调试
测试方法
1 2
发射距离测试
测试遥控器在不同距离下的信号发射效果,确保 遥控器在有效范围内能够正常工作。
NEC控制代码(客户)
Response: At the time of a failureA1H 98H 01H xxH 02H DATA01 DATA02 CKS(*1) (*2) (*4) (*3)-----------------------------------------------------------------------------------------------------------------------------------------附:NEC /NP4100+ 4100W+控制代码下表显示了PC 功能及其相关代码数据。
功能代码数据电源打开:02H 00H 00H 00H 00H 02H电源关闭:02H 01H 00H 00H 00H 03H输入选择COMPUTER 1:02H 03H 00H 00H 02H 01H 01H 09H输入选择COMPUTER 2:02H 03H 00H 00H 02H 01H 02H 0AH输入选择COMPUTER 3(DVI或HDMI):02H 03H 00H 00H 02H 01H 1AH 22H输入选择COMPONENT:02H 03H 00H 00H 02H 01H 10H 18H输入选择VIDEO:02H 03H 00H 00H 02H 01H 06H 0EH输入选择S-VIDEO:02H 03H 00H 00H 02H 01H 0BH 13H影像静音打开02H 10H 00H 00H 00H 12H影像静音关闭02H 11H 00H 00H 00H 13H声音静音打开02H 12H 00H 00H 00H 14H声音静音关闭02H 13H 00H 00H 00H 15H屏幕静音打开02H 14H 00H 00H 00H 16H屏幕静音关闭02H 15H 00H 00H 00H 17H高宽比自动:03H 10H 00H 00H 05H 18H 00H 00H 05H 00H 35H4:3 :03H 10H 00H 00H 05H 18H 00H 00H 00H 00H 30H16:9 :03H 10H 00H 00H 05H 18H 00H 00H 02H 00H 32H15:9 03H 10H 00H 00H 05H 18H 00H 00H 0DH 00H 3DH16:10 03H 10H 00H 00H 05H 18H 00H 00H 0CH 00H 3CH横向放大(仅适用于NP4100+) 03H 10H 00H 00H 05H 18H 00H 00H 03H 00H 33H字符框(仅适用于NP4100W+) 03H 10H 00H 00H 05H 18H 00H 00H 01H 00H 31H自然03H 10H 00H 00H 05H 18H 00H 00H 0EH 00H 3EHAUTO ADJUST 02H 0FH 00H 00H 02H 05H 00H 18H附:NEC RS-232串口和8针园口控制口接线示意图(NEC机型有2种波特率:19200、38400,对应说明书)增加11年机型控制命令(示例:NP-M350X+,NEC机器各控制命令一样,只是增加了LAN 和HDMI输入选择等控制命令)----------------LAN、USB。
NEC%三菱%索尼%飞利普%东芝等6种红外遥控器编码及程序
HT48CA0 APPLICATION NOTE. Application CircuitHOLTEK HT48CA0 (64KEY).Working Register Define;*****************************************************;@***** Filename : SAMPLE.ASM (Remote 64KEY) ******;@************** OSC:455KHz CARRY:38KHz ***********;@****************** HT48CA0 ******************;;*****************************************************;;***** System memory Map *****M_INDIRECT1 equ [00h] ;Indirect addressing register M_MP0 equ [01h] ;Data Memory pointM_ACC equ [05h] ;AccumulatorM_PCL equ [06h] ;Program Counter Lower-order M_TBLP equ [07h] ;Table PointerM_TBLH equ [08h] ;Table Higher-order byteM_STATUS equ [0ah] ;Micro controll statusPORT_A equ [12h] ;PA I/O registerPORT_B equ [14h] ;PB I/O registerPORT_C equ [16h] ;PC Output registerPORT_AC equ [3Eh] ;PA Temp register;-----------------------------------;;--- System FLAG define ---#define fg_CF M_STATUS.0 ;CARRY Flag#define fg_ZF M_STATUS.2 ;ZERO Flag;;--- I/O Pin define ---#define pn_IR PORT_C.0 ;Carry Output Port;;--- Address Define ---#define DATA_RAM 20h ;HT48CA0;;--- Instruction Define ---#define NOP2 JMP $+1 ;Long NOP Define;@------------------------------------------------SAMPLE .SECTION 'DATA';; --- Temp RAM ---a_SR10 DB ? ;;WORK Temp Registera_SR11 DB ? ;;a_SR12 DB ? ;;a_SR13 DB ? ;;;;--------- Program RAM --------a_SCAN_STEP DB ? ;;Scan Key Colummn Step Numbera_PREV_KEY DB ? ;;Save Previous Key Numbera_KEY_NUM DB ? ;;Scan Key Numbera_COL_VALUE DB ? ;;Read on column value to a_COL_VALUE KD_TEMP DB ? ;;Key Debounce Check TimesNKD_TEMP DB ? ;;Key Release Confirm Times;;--- User FLAG define ---fg_SendActive DBIT ;;VALIDITY KEY Flagfg_PressRec DBIT ;;Check Column Multi_Key Flagfg_REPEAT DBIT ;;REPEAT KEY Flagfg_Multi_Key DBIT ;;INVALID KEY FlagHT48CA0 REMOTE CONTROL FLOWCHARTSCAN KEY PROCEDURE FLOWCHARTREAD KEY PROCEDURE FLOWCHARTTIME DELAY PROCEDURE FLOWCHART. Main Program;;==================================================================== ;@========================= Main Program ============================= ;;==================================================================== SAMPLE_CODE .SECTION 'CODE'org 00hMAIN:;------------------------------------------clr WDT;@ ===== Initial Port =====;; +--------- PB7: O PULL-HIGH;; |+-------- PB6: O PULL-HIGH;; ||+------- PB5: O PULL-HIGH;; |||+------ PB4: O PULL-HIGH;; ||||+----- PB3: O PULL-HIGH;; |||||+---- PB2: O PULL-HIGH;; ||||||+--- PB1: O PULL-HIGH;; |||||||+-- PB0: O PULL-HIGHset PORT_Aclr PORT_AC;; +--------- PA7: WAKE-UP I PULL-HIGH;; |+-------- PA6: WAKE-UP I PULL-HIGH;; ||+------- PA5: WAKE-UP I PULL-HIGH;; |||+------ PA4: WAKE-UP I PULL-HIGH;; ||||+----- PA3: WAKE-UP I PULL-HIGH;; |||||+---- PA2: WAKE-UP I PULL-HIGH;; ||||||+--- PA1: WAKE-UP I PULL-HIGH;; |||||||+-- PA0: WAKE-UP I PULL-HIGHset PORT_B;; +-- PC0: O PULL-HIGHmov A,11111111bmov PORT_C,A;@===== Clear RAM ( HT-48CA0 : 20h-3Fh ) =====CLEAR_RAM:mov A,DATA_RAM ;; 1. RAM Start Addressmov M_MP0,A ;;mov A,032d ;; 2. Amount of RAMCLEAR_RAM_1: ;;clr M_INDIRECT1 ;;inc M_MP0 ;;SDZ M_ACC ;;JMP CLEAR_RAM_1 ;;CLEAR_RAM_END: ;;;@----- Default RAM value -----DEFAULT_RAM:clr a_SCAN_STEP;T1=455KHz /4 = 8.79 uS ;;%%%%%%%%%%%%%%%%%%%%%%%%%% Main Prog. Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% START_MAIN_PROC:;@*********** Polling System Event ***********POLLING_EVENT:CALL SCAN_KEY_MATRIX ;SCAN KEY PROCEDURECALL F_DELAY ;TIME DELAY PROCEDURECALL SEND_REMOTE_CODE ;SEND CODE PROCEDURESZ fg_Multi_Key ;Check Invalid KeyJMP POLLING_EVENT ;SZ fg_SendActive ;Check Validity KeyJMP POLLING_EVENT ;SZ a_KEY_NUM ;Check NO Key PressJMP POLLING_EVENT ;SLEEP:clr PORT_A ;Ready WakeUp Low Levelhalt ;System HaltJMP POLLING_EVENT ;Any Key WakeUp ;;%%%%%%%%%%%%%%%%%%%%%%%%%% Subroutine Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;@************* SUBROUTINE[xx]: Scan 64 Key Matrix (8x8) ************SCAN_KEY_MATRIX:;;--- READ KEY PROCEDURE ---clr wdt ;;Initiate Processclr a_KEY_NUM ;clr fg_PressRec ;clr a_SCAN_STEP ;clr fg_Multi_Key ;mov A,01111111b ;mov PORT_AC,A ;NEXT_COLUMN:rlA PORT_AC ;mov PORT_A,A ;Scan Column PA PORT OUTPUTmov PORT_AC,A ;NOP ;;;--- READ PB PORT ---SET PORT_B ;;SET PB0,PB1 Pull-UpMOV A,PORT_B ;;Read on column value to a_COL_VALUE mov a_COL_VALUE,A ;;mov A,001dmov a_SR11,Amov A,11111110b ;;mov a_SR10,Amov A,a_COL_VALUE ;; This column value to ACCSNZ a_COL_VALUE.7JMP KEY_ROW_7SNZ a_COL_VALUE.6JMP KEY_ROW_6SNZ a_COL_VALUE.5JMP KEY_ROW_5SNZ a_COL_VALUE.4JMP KEY_ROW_4SNZ a_COL_VALUE.3JMP KEY_ROW_3SNZ a_COL_VALUE.2JMP KEY_ROW_2SNZ a_COL_VALUE.1JMP KEY_ROW_1SNZ a_COL_VALUE.0JMP KEY_ROW_0NOP2nopJMP COL_WITHOUT_KEYKEY_ROW_7:rl a_SR10 ;; a_SR10 rotate to "01111111b"inc a_SR11KEY_ROW_6:rl a_SR10 ;; a_SR10 rotate to "10111111b"inc a_SR11KEY_ROW_5:rl a_SR10 ;; a_SR10 rotate to "11011111b"inc a_SR11KEY_ROW_4:rl a_SR10 ;; a_SR10 rotate to "11101111b"inc a_SR11KEY_ROW_3:rl a_SR10 ;; a_SR10 rotate to "11110111b"inc a_SR11KEY_ROW_2:rl a_SR10 ;; a_SR10 rotate to "11111011b"inc a_SR11KEY_ROW_1:rl a_SR10 ;; a_SR10 rotate to "11111101b"inc a_SR11KEY_ROW_0:xor A,a_SR10 ;;Check ROW Multi-KeySZ fg_ZFJMP COL_WITH_KEYCOL_ERROR_KEY:set fg_Multi_KeyCOL_WITHOUT_KEY:NOP2NOP2NOP2JMP READY_2_NEXT_COLUMNCOL_WITH_KEY: ;;KEY NUMBER PROCESSrlA a_SCAN_STEP ;;\rl M_ACC ;; > a_SCAN_STEP * 8 --> ACCrl M_ACC ;;/add A,a_SR11 ;;mov a_KEY_NUM,A ;;SZ fg_PressRec ;;Check Column Multi-Keyset fg_Multi_Key ;;set fg_PressRec ;;READY_2_NEXT_COLUMN:inc a_SCAN_STEPmov A,a_SCAN_STEPxor A,008dSNZ fg_ZFJMP NEXT_COLUMNnopREAD_KEY_COMPLETE:;@************* SUBROUTINE[xx]: Check Key Active ************;@--- Scan Key Complete, Check key valid ? ---CHECK_KEY_ACTIVE:clr wdtSZ a_KEY_NUM ;;If a_KEY_NUM = ffh, invalid key JMP VALID_KEY_CHKJMP INVALID_KEY_CHK;@--------------------------VALID_KEY_CHK:SZ a_PREV_KEY ;;Check New KeyJMP VALID_KEYC_PROJMP KEY_DEBVALID_KEYC_PRO:mov A,a_KEY_NUMxor A,a_PREV_KEY ;; Check Repeat keySNZ fg_ZFJMP VALID_SEND_KEY;;----------------------------VALID_RPSEND_KEY:snz fg_Multi_key ;Check Multi-Key Clear a_KEY_NUM JMP REPEAT_KEYclr a_KEY_NUMretREPEAT_KEY:SET fg_REPEAT ;;SET Repeat FlagNOP2JMP SET_VALIDFGVALID_SEND_KEY:mov a,a_PREV_KEY ;;Check Change KeyXOR A,0FFH ;;Check Debounce ENDSNZ fg_ZFJMP CHANG_KEY;;--- NEW KEY InitiateCLR fg_REPEATmov a,a_KEY_NUMmov a_PREV_KEY,a;;--- SET VALIDITY KEYSET_VALIDFG:SET fg_SendActiveretCHANG_KEY:CLR KD_TEMPJMP RKEY_PRO;@----------------------------INVALID_KEY_CHK:CLR KD_TEMPRKEY_PRO: ;Release Key ConfirmINC NKD_TEMPMOV A,NKD_TEMPXOR A,5SNZ fg_ZFJMP SCAN_KEY_MATRIXDEC NKD_TEMP ;NO_KEY_PROC:clr fg_SendActiveNOP2NOP2NOPEXIT_INVALID_KEY:mov a,a_KEY_NUM ;Clear a_PREV_KEYmov a_PREV_KEY,aNOP2retKEY_DEB: ;T1=455KHz/4=116480Hz = 8.79us ;Check Key DebounceINC KD_TEMPMOV A,KD_TEMPXOR A,6SNZ fg_ZFJMP SCAN_KEY_MATRIXMOV A,0FFH ;SAVE KEY Debounce Check ENDMOV a_PREV_KEY,A ;0FFH to a_PREV_KEYJMP SCAN_KEY_MATRIX;@********** SubRoutine[xx]: Delay 10*ACC+5 Instruction Cycle ********** ;;--- TIME DELAY PROCEDURE ---F_DELAY:SZ KD_TEMPJMP NEWK_DMOV A,NKD_TEMP ;Release Confirm time offset delaymov a_SR13,ABLANK_DELAY_00:INC a_SR13MOV A,a_SR13XOR A,5SZ fg_ZFJMP BLANK_DELAY_010mov A,155dBLANK_DELAY_01:SDZ M_ACCJMP BLANK_DELAY_01clr wdtJMP BLANK_DELAY_00BLANK_DELAY_010:CLR NKD_TEMPMOV a,1 ;OFFSET TIME DELAYmov a_SR13,ABLANK_DELAY_02:mov A,37dBLANK_DELAY_03:clr wdtSDZ M_ACCJMP BLANK_DELAY_03SDZ a_SR13JMP BLANK_DELAY_02RETNEWK_D: ;;New Key No Time Offset DelayCLR KD_TEMPRET;;---------------------------------------;@************* SUBROUTINE[xx]: Send Remote Code ************SEND_REMOTE_CODE:clr WDTSZ fg_SendActiveJMP READY_SENDretREADY_SEND:; REMOTE CODE SEND & DATA FRAME DELAY TIME OFFSET;ret;;************************** End of program ********************************* ENDSEND CODE PROCEDURE FLOWCHARTA. HT6221 ( NEC FORMAT );;***************************************************** ;@***** Filename : NEC.FORMAT (Remote 64KEY) ****** ;@************** OSC:455KHz CARRY:38KHz *********** ;@****************** HT48CA0 ****************** ;;*****************************************************NEC .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_CUSTOMER_1 DB ? ;CUSTOMER CODE LOW BYTE a_CUSTOMER_2 DB ? ;CUSTOMER CODE HIGH BYTE#define CUS_6221_1 00110100b ;1234H #define CUS_6221_2 00010010b;@------------------------------------------------ NEC_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************ SEND_REMOTE_CODE:clr WDT ;CHECK VALIDITY KEY SZ fg_SendActive JMP READY_SEND retREADY_SEND:NEC_CODE:mov A,a_KEY_NUM ;READ KEY DATANEC Format CodeEX.PS. Custom Code = 0808H Data Code =mov M_TBLP,ATABRDL a_REM_CODEMOV A,CUS_6221_1 ;READ CUSTOMER CODEMOV a_CUSTOMER_1,AMOV A,CUS_6221_2MOV a_CUSTOMER_2,A;;--- Starting send NEC Remote code ---SEND_NEC: ;Check No Key Code ffHSIZA a_REM_CODEJMP LEADNEC_CODEretLEADNEC_CODE: ; 1 Instruction Cycle = 8.79usclr pn_IR ;High Level 9 ms (455KHz:1023 Cycle) mov A,002d ; [(3*168)+5]*2 = 1018mov a_SR13,ALEADIND_CODE_00:mov A,168dmov M_ACC,ALEADIND_CODE_01:SDZ M_ACCJMP LEADIND_CODE_01SDZ a_SR13JMP LEADIND_CODE_00NOP2NOP2NOPset pn_IRclr wdt;---mov A,001d ;LOW Level 2.5ms (284Cycle)mov a_SR13,A ; [(4*69)+5]*1 = 281LEAD_CODE_04:mov A,70dmov M_ACC,ALEAD_CODE_05:NOPSDZ M_ACCJMP LEAD_CODE_05SDZ a_SR13JMP LEAD_CODE_04clr wdtSZ fg_REPEAT ;CHECK REPEAT KEYJMP REPEAT_CODE;---mov A,001d ;LOW Level 2.0ms (227Cycle)mov a_SR13,A ; [(4*55)+5]*1 = 225LEAD_CODE_06:mov A,53dmov M_ACC,ALEAD_CODE_07:NOPSDZ M_ACCJMP LEAD_CODE_07SDZ a_SR13JMP LEAD_CODE_06clr wdtnop2;------------------------CUSNEC_CODE:mov A,002dmov a_SR13,AMOV A,OFFSET a_CUSTOMER_1MOV M_MP0,ACUSTOM_PRO:mov A,008dmov a_SR11,A ; 8 data bitnopCUSTOM_BIT_BL ;0.56ms->63 Cycleclr pn_IR ;[(3*20)+2]=62mov A,20dCUSTOM_BIT_BL_1:SDZ M_ACCJMP CUSTOM_BIT_BL_1clr wdtnopCUSTOM_BIT_BH: ;'0' 0.56ms->63 Cycle set pn_IR ;'1' 1.68ms->191 Cycle noprr M_INDIRECT1 ;mov A,18dSZ M_INDIRECT1.7 ;mov A,61dCUSTOM_BIT_BH_0:SDZ M_ACCJMP CUSTOM_BIT_BH_0clr wdtSDZ a_SR11JMP CUSTOM_BIT_BLINC M_MP0SDZ a_SR13JMP CUSTOM_PRO;;---------------------------------------DATA6NEC_BIT:mov A,002dmov a_SR13,ADATA_PRO:mov A,008dmov a_SR11,A ;; 8 data bitnopDATA_BIT_BL: ;0.53ms->60 Cycleclr pn_IR ;[(3*19)+2]=59mov A,20dDATA_BIT_BL_1:SDZ M_ACCJMP DATA_BIT_BL_1clr wdtnopDATA_BIT_BH: ;'0' 0.53ms->60 Cycleset pn_IR ;'1' 1.58ms->179 Cyclenoprr a_REM_CODE ;mov A,18dSZ a_REM_CODE.7mov A,61dDATA_BIT_BH_0:SDZ M_ACCJMP DATA_BIT_BH_0clr wdtSDZ a_SR11JMP DATA_BIT_BLCPL A_REM_CODESDZ a_SR13JMP DATA_PRO;0.53ms->60 Cycleclr pn_IR ;[(3*19)+2]=59mov A,20dDATA_BIT_BL_2:SDZ M_ACCJMP DATA_BIT_BL_2clr wdtset pn_IR;--- Frame Delay Time Process ---;mov A,004d ;Repetition time=108ms (12286 Cycle) mov a_SR13,A ;Scan Key = 2471 Cycle;Send Code = 7349 CycleFDTP_LOOP_01: ;12286-2471-7349=2466mov A,152d ;[(4*152)+5]*4=2452mov M_ACC,AFDTP_LOOP_02:nopSDZ M_ACCJMP FDTP_LOOP_02clr wdtSDZ a_SR13JMP FDTP_LOOP_01mov A,3dmov M_ACC,AFDTP_LOOP_03:SDZ M_ACCJMP FDTP_LOOP_03NOP2ret;--------------------------------REPEAT_CODE:;0.56ms->63 Cycleclr pn_IR ;[(3*20)+2]=62mov A,19dREP_BIT_BL_3:SDZ M_ACCJMP REP_BIT_BL_3clr wdtset pn_IR;--- Repeat Frame Delay Time Process ---;mov A,016d ;Repetition time=108ms (12286 Cycle) mov a_SR13,A ;Scan Key = 2471 Cycle;Send Repeat Code = 1390 CycleREP_DELAY_02: ;12286-2471-1390=8425mov A,130d ;[(4*130)+5]*16=8400mov M_ACC,A ;REP_DELAY_03: ;nopSDZ M_ACCJMP REP_DELAY_03clr wdtSDZ a_SR13JMP REP_DELAY_02mov A,07dmov M_ACC,AREP_DELAY_04:SDZ M_ACCJMP REP_DELAY_04NOP2ret%%%%%%%%%%%%%%%%%%%% Remote Table Array %%%%%%%%%%%%%%%%%%%%%%%%%org 300h;@ --000000 00000000;; ||||||||;; ++++++++-- 8 bit Data code;; NEC KeyDW 00ffh ;; Key 00 : --- :00DW 0000h ;; Key 1 : --- :01DW 0001h ;; Key 2 : :02DW 0002h ;; Key 3 : :03DW 0003h ;; Key 4 : :04DW 0004h ;; Key 5 : :05DW 0005h ;; Key 6 : :06DW 0006h ;; Key 7 : :07DW 0007h ;; Key 8 : :08DW 0008h ;; Key 9 : :09DW 0009h ;; Key 10 : :10DW 000ah ;; Key 11 : :11DW 000bh ;; Key 12 : :12DW 000ch ;; Key 13 : :13DW 000dh ;; Key 14 : :14DW 000eh ;; Key 15 : :15DW 000fh ;; Key 16 : :16DW 0010h ;; Key 17 : :17DW 0011h ;; Key 18 : :18 DW 0012h ;; Key 19 : :19 DW 0013h ;; Key 20 : :20 DW 0014h ;; Key 21 : :21 DW 0015h ;; Key 22 : :22 DW 0016h ;; Key 23 : :23 DW 0017h ;; Key 24 : :24 DW 0018h ;; Key 25 : :25 DW 0019h ;; Key 26 : :26 DW 001ah ;; Key 27 : :27 DW 001bh ;; Key 28 : :28 DW 001ch ;; Key 29 : :29 DW 001dh ;; Key 30 : :30 DW 001eh ;; Key 31 : :31 DW 001fh ;; Key 32 : :32 DW 0020h ;; Key 33 : :33 DW 0021h ;; Key 34 : :34 DW 0022h ;; Key 35 : :35 DW 0023h ;; Key 36 : :36 DW 0024h ;; Key 37 : :37 DW 0025h ;; Key 38 : :38 DW 0026h ;; Key 39 : :39 DW 0027h ;; Key 40 : :40 DW 0028h ;; Key 41 : :41 DW 0029h ;; Key 42 : :42 DW 002ah ;; Key 43 : :43 DW 002bh ;; Key 44 : :44 DW 002ch ;; Key 45 : :45 DW 002dh ;; Key 46 : :46 DW 002eh ;; Key 47 : :47 DW 002fh ;; Key 48 : :48 DW 0030h ;; Key 49 : :49 DW 0031h ;; Key 50 : :50 DW 0032h ;; Key 51 : :51 DW 0033h ;; Key 52 : :52 DW 0034h ;; Key 53 : :53 DW 0035h ;; Key 54 : :54 DW 0036h ;; Key 55 : :55 DW 0037h ;; Key 56 : :56 DW 0038h ;; Key 57 : :57 DW 0039h ;; Key 58 : :58 DW 003ah ;; Key 59 : :59 DW 003bh ;; Key 60 : :60 DW 003ch ;; Key 61 : :61 DW 003dh ;; Key 62 : :62 DW 003eh ;; Key 63 : :63 DW 003fh ;; Key 64 : :64 END;;***************************************************** ;@** Filename : MITSUBISH.FORMAT (Remote 64KEY) **** ;@************** OSC:455KHz CARRY:38KHz *********** ;@****************** HT48CA0 ****************** ;;*****************************************************MITSUBISH .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_FACTOR DB ? ;KEY DATA DELAY TIME FACTOR a_CUSTOMER_1 DB ? ;CUSTOMER CODE#define CUS_50560 11101110b ;0EEH;@------------------------------------------------ MITSUBISH_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************ SEND_REMOTE_CODE:clr WDT ;CHECK VALIDITY KEY SZ fg_SendActive JMP READY_SEND retREADY_SEND:M5056_ACODE:mov A,a_KEY_NUM ;READ KEY DATA mov M_TBLP,A ; TABRDL a_REM_CODE ;B. M50560 (MITSUBISH Format)(HT6240)4ms4ms EX.PS. 500us => 56 cycle (530us => 60 cycl 2ms-500us=1.5ms => 170 cycle(2.11ms-530us=1.58ms => 179 cycl 80ms => 9101 cycle(67.5ms =>7678ms => 910 cycle (8.44ms => 960 4ms => 455 cycle (4.22ms => 480mov A,M_TBLH ;READ Data Delay Time Factor and A,00001111b ;mov a_FACTOR,A ;MOV A,CUS_50560 ;READ CUSTOM CodeMOV a_CUSTOMER_1,A ;;--------------------------;;--- Starting send 5056 Remote code ---SEND_5056:SIZA a_REM_CODE ;CHECK NO KEY CODE ffHJMP LEAD50_CODEretLEAD50_CODE:clr pn_IR ;;---mov A,001d ;High Level 8.ms (910Cycle) mov a_SR13,A ; [(4*226)+5]*1 = 909LEAD50_CODE_00:mov A,225dmov M_ACC,ALEAD50_CODE_01:NOPSDZ M_ACCJMP LEAD50_CODE_01SDZ a_SR13JMP LEAD50_CODE_00clr wdtnopNOP2set pn_IR;---mov A,001d ;Low Level 4ms (455Cycle)mov a_SR13,A ; [(4*112)+5]*1 = 453LEAD50_CODE_02:mov A,111dmov M_ACC,ALEAD50_CODE_03:NOPSDZ M_ACCJMP LEAD50_CODE_03SDZ a_SR13JMP LEAD50_CODE_02clr wdtNOP2;-----------------------------CUS50_CODE:mov A,008dmov a_SR11,A ; 8 data bitCUS50_BIT_BL: ;0.5ms->57 Cycleclr pn_IR ;[(3*18)+2]=56mov A,18dCUS50_BIT_BL_1:SDZ M_ACCJMP CUS50_BIT_BL_1clr wdtnopCUS50_BIT_BH: ;'0' 0.5ms->57 Cycleset pn_IR ;'1' 1.5ms->170 Cyclerr a_CUSTOMER_1 ;mov A,16dnopSZ a_CUSTOMER_1.7 ;mov A,54dCUS50_BIT_BH_0:SDZ M_ACCJMP CUS50_BIT_BH_0clr wdtSDZ a_SR11JMP CUS50_BIT_BL;0.5ms->57 Cycleclr pn_IR ;[(3*18)+2]=56mov A,18dCUS50_BIT_BL_2:SDZ M_ACCJMP CUS50_BIT_BL_2clr wdtnopset pn_IR;--- ;Low Level 4ms (455Cycle) ; [(4*112)+5]*1 = 453mov A,001dmov a_SR13,ALEAD50_CODE_04:mov A,111dmov M_ACC,ALEAD50_CODE_05:NOPSDZ M_ACCJMP LEAD50_CODE_05SDZ a_SR13JMP LEAD50_CODE_04clr wdtNOP2;;---------------------------------------DATA50_BIT:mov A,008dmov a_SR11,A ;; 8 data bitDAT50_BIT_BL: ;0.5ms->57 Cycleclr pn_IR ;[(3*18)+2]=56mov A,18dDAT50_BIT_BL_1:SDZ M_ACCJMP DAT50_BIT_BL_1clr wdtnopDAT50_BIT_BH: ;'0' 0.5ms->57 Cycleset pn_IR ;'1' 1.5ms->170 Cyclerr a_REM_CODE ;mov A,16dnopSZ a_REM_CODE.7mov A,54dDAT50_BIT_BH_0:SDZ M_ACCJMP DAT50_BIT_BH_0clr wdtSDZ a_SR11JMP DAT50_BIT_BL;0.5ms->57 Cycleclr pn_IR ;[(3*18)+2]=57mov A,18dDAT50_BIT_BL_2:SDZ M_ACCJMP DAT50_BIT_BL_2clr wdtnopset pn_IR;--- delay factor ;Low Level 1.ms (114Cycle); [(4*27)+5]*1 = 113mov A,a_FACTORmov a_SR13,ADELAY50_CODE_01:mov A,27dnop2mov M_ACC,ADELAY50_CODE_02:NOPSDZ M_ACCJMP DELAY50_CODE_02clr wdtSDZ a_SR13JMP DELAY50_CODE_01;--- FRAME DELAY TIME PROCESS ---mov A,002d ;Repetition time=80ms (9101 Cycle) mov a_SR13,A ;Scan Key = 2471 Cycle;Send Code = 7349 CycleDELAY_LOOP_01: ;9101-2471-5376=1254mov A,155d ;[(4*155)+5]*2=1250mov M_ACC,ADELAY_LOOP_02:nopSDZ M_ACCJMP DELAY_LOOP_02clr wdtSDZ a_SR13JMP DELAY_LOOP_01NOP2CODE50_END:ret;@************* SUBROUTINE[xx]: Scan Key Matrix ************ ;;%%%%%%%%%%%%%%%%%%%%%%%%% Remote Table Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% org 300h;@ --000000 00000000;; |||| ||||||||;; |||| ++++++++-- 8 bit Data code;; ++++-- Delay Factor (Data '0' bit Num);; M50560KeyDW 00FFh ;; Key XX : :00DW 0800h ;; Key 1 : --- :01DW 0701h ;; Key 2 : --- :02DW 0702h ;; Key 3 : :03DW 0603h ;; Key 4 : :04DW 0704h ;; Key 5 : :05DW 0605h ;; Key 6 : :06DW 0606h ;; Key 7 : :07DW 0507h ;; Key 8 : :08DW 0708h ;; Key 9 : :09DW 0609h ;; Key 10 : :10DW 060ah ;; Key 11 : :11DW 050bh ;; Key 12 : :12DW 060ch ;; Key 13 : :13DW 050dh ;; Key 14 : :14DW 050eh ;; Key 15 : :15DW 040fh ;; Key 16 : :16DW 0710h ;; Key 17 : :17DW 0611h ;; Key 18 : :18DW 0612h ;; Key 19 : :19DW 0513h ;; Key 20 : :20DW 0614h ;; Key 21 : :21DW 0515h ;; Key 22 : :22DW 0516h ;; Key 23 : :23DW 0417h ;; Key 24 : :24DW 0618h ;; Key 25 : :25DW 0519h ;; Key 26 : :26DW 051ah ;; Key 27 : :27DW 041bh ;; Key 28 : :28DW 051ch ;; Key 29 : :29DW 041dh ;; Key 30 : :30DW 041eh ;; Key 31 : :31DW 031fh ;; Key 32 : :32DW 0720h ;; Key 33 : :33DW 0621h ;; Key 34 : :34DW 0622h ;; Key 35 : :35DW 0523h ;; Key 36 : :36DW 0624h ;; Key 37 : :37DW 0525h ;; Key 38 : :38DW 0226h ;; Key 39 : :39DW 0427h ;; Key 40 : :40DW 0628h ;; Key 41 : :41DW 0529h ;; Key 42 : :42DW 052ah ;; Key 43 : :43DW 042bh ;; Key 44 : :44DW 052ch ;; Key 45 : :45DW 042dh ;; Key 46 : :46 DW 042eh ;; Key 47 : :47 DW 032fh ;; Key 48 : :48 DW 0630h ;; Key 49 : :49 DW 0531h ;; Key 50 : :50 DW 0532h ;; Key 51 : :51 DW 0433h ;; Key 52 : :52 DW 0534h ;; Key 53 : :53 DW 0435h ;; Key 54 : :54 DW 0436h ;; Key 55 : :55 DW 0337h ;; Key 56 : :56 DW 0538h ;; Key 57 : :57 DW 0439h ;; Key 58 : :58 DW 043ah ;; Key 59 : :59 DW 033bh ;; Key 60 : :60 DW 043ch ;; Key 61 : :61 DW 033dh ;; Key 62 : :62 DW 033eh ;; Key 63 : :63 DW 023fh ;; Key 64 : :64 END;;*****************************************************;@***** Filename : SONY.FORMAT (Remote 64KEY) ******;@************** OSC:455KHz CARRY:38KHz ***********;@****************** HT48CA0 ******************;;*****************************************************SONY .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_KEY_TEMP DB ? ;KEY DELAY TIME OFFSET COUNT a_Category DB ? ;SAVE Category Code#define CATEGORY 00000100b ;04H;@------------------------------------------------SONY_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************SEND_REMOTE_CODE:clr WDT ;CHECK VALIDITY KEYSZ fg_SendActiveJMP READY_SENDretREADY_SEND:SONY_CODE:mov A,a_KEY_NUM ;READ KEY DATAmov M_TBLP,AC. SONY Format(68cycle)(136cycle)(11H)(44H)EX.TABRDL a_REM_CODEMOV A,CATEGORY ;READ CATEGORY CODEMOV a_Category,A;;--- Starting send SONY Remote code ---SEND_SONY:SIZA a_REM_CODE ;Check No Key Code ffHJMP LEADSY_CODEretLEADSY_CODE:clr pn_IR ;High Level 2.4ms (455KHz:273 Cycle) mov A,89d ; [(3*91)= 273mov M_ACC,ALEADIND_CODE_00:SDZ M_ACCJMP LEADIND_CODE_00clr wdtCLR a_KEY_TEMP;;---------------------------------------DATASY_BIT: ;SEND KEY DATA CODEmov A,007dmov a_SR11,A ; 7 data bitDATSY_BIT_BL: ;0.6ms->68 CycleSET pn_IR ;[(3*22)+2]=59mov A,22dDATSY_BIT_BL_1:SDZ M_ACCJMP DATSY_BIT_BL_1clr wdtDATSY_BIT_BH: ;'0' 0.6ms->68 CycleCLR pn_IR ;'1' 1.2ms->136 Cyclerr a_REM_CODE ;mov A,19dSZ a_REM_CODE.7mov A,42dDATSY_BIT_BH_0:SDZ M_ACCJMP DATSY_BIT_BH_0clr wdtSNZ a_REM_CODE.7INC a_KEY_TEMP ;COUNT DELAY TIME OFFSETNOPSDZ a_SR11JMP DATSY_BIT_BL;--------------------------------CATESY_BIT: ;SEND Category Codemov A,005dmov a_SR11,A ; 5 Category BitCATSY_BIT_BL: ;0.6ms->68 CycleSET pn_IR ;[(3*22)+2]=59mov A,22dCATSY_BIT_BL_1:SDZ M_ACCJMP CATSY_BIT_BL_1clr wdtCATSY_BIT_BH: ;'0' 0.6ms->68 CycleCLR pn_IR ;'1' 1.2ms->136 Cyclerr a_Category ;mov A,20dSZ a_Category.7mov A,43dCATSY_BIT_BH_0:SDZ M_ACCJMP CATSY_BIT_BH_0clr wdtSDZ a_SR11JMP CATSY_BIT_BLSET pn_IR;------------------------;--- delay factor ;;DELSY_CODE_00:SZ a_KEY_TEMP ;CHECK DELAY TIME OFFSET COUNTJMP DELSY_PROJMP SEND_ENDDELSY_PRO:MOV A,a_KEY_TEMPMOV a_SR11,ADELSY_LP:mov A,21d ;0.6ms ->68CycleDELSY_BIT_BL_1:SDZ M_ACCJMP DELSY_BIT_BL_1clr wdtNOPSDZ a_SR11JMP DELSY_LP;--- Frame Delay Time Process ---;mov A,001d ;Repetition time=45ms (5119 Cycle) mov a_SR13,A ;Scan Key = 2471 Cycle;Send Code = 2473 CycleFDTP_LOOP_01: ;5119-2471-2473=175mov A,42d ;[(4*42)+5]*1=173mov M_ACC,AFDTP_LOOP_02:nopSDZ M_ACCJMP FDTP_LOOP_02clr wdtSDZ a_SR13JMP FDTP_LOOP_01SEND_END:ret;;%%%%%%%%%%%%%%%%%%%%%%%%% Remote Table Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% org 300h;@ --000000 00000000;; |||||||;; +++++++-- 7 bit Data code;; SONY KeyDW 00ffh ;; Key 00 : --- :00DW 0000h ;; Key 1 : --- :03DW 0001h ;; Key 2 : :04DW 0002h ;; Key 3 : :05DW 0003h ;; Key 4 : :06DW 0004h ;; Key 5 : :07DW 0005h ;; Key 6 : :08DW 0006h ;; Key 7 : :09DW 0007h ;; Key 8 : :10DW 0008h ;; Key 9 : :09DW 0009h ;; Key 10 : :10DW 000ah ;; Key 11 : :11DW 000bh ;; Key 12 : :12DW 000ch ;; Key 13 : :13DW 000dh ;; Key 14 : :14DW 000eh ;; Key 15 : :15DW 000fh ;; Key 16 : :16DW 0010h ;; Key 17 : :17DW 0011h ;; Key 18 : :18DW 0012h ;; Key 19 : :19DW 0013h ;; Key 20 : :20DW 0014h ;; Key 21 : :21DW 0015h ;; Key 22 : :22DW 0016h ;; Key 23 : :23DW 0017h ;; Key 24 : :24DW 0018h ;; Key 25 : :25DW 0019h ;; Key 26 : :26DW 001ah ;; Key 27 : :27DW 001bh ;; Key 28 : :28DW 001ch ;; Key 29 : :29DW 001dh ;; Key 30 : :30DW 001eh ;; Key 31 : :31DW 001fh ;; Key 32 : :32DW 0020h ;; Key 33 : :33DW 0021h ;; Key 34 : :34DW 0022h ;; Key 35 : :35DW 0023h ;; Key 36 : :36DW 0024h ;; Key 37 : :37DW 0025h ;; Key 38 : :38DW 0026h ;; Key 39 : :39DW 0027h ;; Key 40 : :40DW 0028h ;; Key 41 : :41DW 0029h ;; Key 42 : :42 DW 002ah ;; Key 43 : :43 DW 002bh ;; Key 44 : :44 DW 002ch ;; Key 45 : :45 DW 002dh ;; Key 46 : :46 DW 002eh ;; Key 47 : :47 DW 002fh ;; Key 48 : :48 DW 0030h ;; Key 49 : :49 DW 0031h ;; Key 50 : :50 DW 0032h ;; Key 51 : :51 DW 0033h ;; Key 52 : :52 DW 0034h ;; Key 53 : :53 DW 0035h ;; Key 54 : :54 DW 0036h ;; Key 55 : :55 DW 0037h ;; Key 56 : :56 DW 0038h ;; Key 57 : :57 DW 0039h ;; Key 58 : :58 DW 003ah ;; Key 59 : :59 DW 003bh ;; Key 60 : :60 DW 003ch ;; Key 61 : :61 DW 003dh ;; Key 62 : :62 DW 003eh ;; Key 63 : :63 DW 003fh ;; Key 64 : :64 END;;***************************************************** ;@** Filename : PHILIPS.FORMAT (Remote 64KEY) **** ;@************** OSC:429KHz CARRY:36KHz *********** ;@****************** HT48CA0 ****************** ;;***************************************************** PHILIPS .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_FACTOR DB ? ;KEY DATA DELAY TIME FACTOR a_CUSTOMER_1 DB ? ;CUSTOMER CODEa_CONTROL_BIT DB ? ;SAVE CONTROL BIT FLAG ;@------------------------------------------------ PHILIPS_CODE .SECTION 'CODE';;========================================================================== ;@************* SUBROUTINE[xx]: Send Remote Code ************ SEND_REMOTE_CODE:clr WDT ;CHECK VALIDITY KEY SZ fg_SendActive JMP READY_SEND retREADY_SEND:M3010_CODE:mov A,a_KEY_NUM ;READ KEY DATA mov M_TBLP,A ; TABRDL a_REM_CODE ; RL a_REM_CODE ; RL a_REM_CODE ;MOV A,M_TBLH ;READ SYSTEM CODED. M3010(PHILIPS FORMAT)(SAA3010)(HT6230)bit(New key1,0 Repeat)114.573ms => 12288 cyclePS. system code => 00H ~ 1FH command code => 00H ~ 3FH(Carry 36KHz)EX.( OSC : 429KHz Carry : 36KHz )RL M_ACCRL M_ACCMOV a_CUSTOMER_1,ASNZ fg_REPEAT ;INC a_CONTROL_BIT ;NEW KEY 1&0 REPEAT;;--- Starting send 6121 Remote code ---SEND_M3010:SIZA a_REM_CODE ;CHECK NO KEY CODE ffH JMP START_BITretSTART_BIT: ;START BITE 11BSAT_BIT1:SET pn_IRSAT_BIT1_PRO: ;895uS->102 cycle "LOW" MOV A,33d ;[(3*33)+2]=101SAT_BIT1P1:SDZ M_ACCJMP SAT_BIT1P1clr wdtNOPCLR pn_IR ;895uS->102 cycle "HIGH" MOV A,32d ;[(3*33)+2]=101SAT_BIT1P2:SDZ M_ACCJMP SAT_BIT1P2clr wdtSZ a_REM_CODE.0JMP SAT_BIT3SAT_BIT2:NOP2SET pn_IRSAT_BIT2_PRO: ;895uS->102 cycle "LOW" MOV A,33d ;[(3*33)+2]=101SAT_BIT1P3:SDZ M_ACCJMP SAT_BIT1P3clr wdtNOPCLR pn_IR ;895uS->102 cycle "HIGH" MOV A,32d ;[(3*33)+2]=101SAT_BIT1P4:SDZ M_ACCJMP SAT_BIT1P4clr wdtJMP SEND_CRT;--------SAT_BIT3:NOP。
NEC和RC5码
1、编码格式现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。
两种形式编码的代表分别为NEC 和PHILIPS 的RC-5、RC-6 以及将来的RC-7。
PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。
为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。
例如常用的电视遥控器,使用NEC upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121 的引导码为载波发射9ms,不发射4.5ms。
upd6121 总共的编码长度为108ms。
但并不是所有的编码器都是如此,比如TOSHIBA 的TC9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms,不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。
PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。
从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。
其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。
通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。
即市面上所宣传的可以学习64 位、128 位必然是不可靠的。
另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。
比如:美的的遥控器采用PWM 编码,码长120ms 左右;新科的遥控器也采用PWM 编码,码长500ms 左右。
如此大的差异,如果按“位”的概念来讲,应该是多少位呢?64?128?显然都不可能包含如此长短不一的编码。
2、学习模式现在用来学习红外的CPU,无外乎以下几种:MCS-51系列、microchip pic16 系列、winbond w741 系列、holtek ht48 系列,以上的CPU 由于价格便宜、使用量大,被广泛使用在遥控器上。
NEC编程代码
NEC编程代码NEC常用编程代码1.进编程:SPK#*#*12345678 HOLD2.快速进编程:OPAC ,HOLD #0*3.电脑话务员25-02-01 所有外线MODE1 MODE2 都改成122-02-01 所有外线MODE1 MODE2 都改成14.改查号拨0的总机号码25-06-02 Recv改成0 DestNO填写总机的分机号码5.改分机字头号长11-01-01 找到你要改分机号码的第一个字头改你需要的号长6.无人接听时间短分机振铃时间短24-02-03 改成25到60之间25-07-02 改成25到60之间7.外线来电显示14-02-10 所有外线都改成18.分机来电显示15-03-09所有分机都改成19.专用话机响一声自动接听20-02-12改成110.分机回铃15-03-15每个分机都改成111.关外线14-01-07选择要关的外线改成012.发号时间长20-03-043改成1 必改82-04-04改成1382-04-07改成1782-04-08改成16013.分机听筒有“嘟嘟”提示音20-13-01改成014.改分机号码11-02-01把原有分机号码删除,再输入你需要的分机号码15.(Tapaz)改分机名称15-01-01把原有的名称直接删除就可以、16.人工值班改响铃分机22-02-01 改成422-04-01填写你要响铃的分机号码SL1000遇忙转移8441+要转的分机号码取消*917.定义直选键SPK+852+按一下直选键+000。
删除原有的代码SPK+851+按一下直选键+01(显示DSS)+输入对应分机号码,按HOLD保存18.录音716700119. 指定代接码*#20 分机遇忙转移:844+1+被转的分机号码IP:192.168.0.10用户名:Tech 密码:12345678改交换机IP地址:10-12-01改中文:40-07-01 改成1520外线转外线14-01-13 所有外线都改成114-02-09 所有外线都改成120-02-09 所有外线都改成120-11-12 改成 121-03-01 都改成 125-07-07 改成0无条件,忙转移844+1+9+手机号开通外线功能21-02 改为115-06改为1Web 地址192.168.0.10 账号tech密码12345678。
NEC协议的遥控器参考代码
NEC协议的遥控器参考代码下面是一个简单的NEC协议遥控器的参考代码。
```c#include <IRremote.h>//定义红外发射器的引脚#define IR_LED_PIN 3//定义红外接收器的引脚#define IR_RECEIVE_PIN 2IRsend irsend(IR_LED_PIN);IRrecv irrecv(IR_RECEIVE_PIN);decode_results results;void setu//初始化串口Serial.begin(9600);//初始化红外接收器irrecv.enableIRIn(;void loo//检查是否有红外信号收到if (irrecv.decode(&results))//打印红外编码Serial.print("Received NEC code: 0x"); Serial.println(results.value, HEX);//根据红外编码执行对应的操作switch (results.value)case 0xFFA25D: // 遥控器上的按键1//执行按键1的操作Serial.println("Button 1 pressed"); break;case 0xFF629D: // 遥控器上的按键2//执行按键2的操作Serial.println("Button 2 pressed"); break;case 0xFFE21D: // 遥控器上的按键3//执行按键3的操作Serial.println("Button 3 pressed"); break;//添加其他按键的处理逻辑default://未识别的红外编码Serial.println("Unknown button");break;}//继续等待下一个红外信号irrecv.resume(;}```这段代码使用了IRremote库来进行红外通信。
NEC协议
一、NEC协议说明NEC协议特点:8位地址和8位命令为提高可靠性,地址和命令都传输2次,脉冲间隔调制38kHz载波频率(1)NEC的0和1的脉冲定义在发送端:①每一位时间为1.12mS(560us+560个低电平)或2.25ms(560us+16 80us),调制采用脉冲间隔时间长短调制每一位。
②每一个脉冲都是由560uS长度的38kHz载波脉冲构成的,占空比为1 /4或1/3(约21个周期)。
逻辑1:2.25mS逻辑0:1.12mS而在接收端:没有脉冲的时候为高电平,接收到脉冲的时候为低电平,故逻辑1为560us低+1680us高,逻辑0变为560us低+560us高。
(因为560us是载波脉冲,故为低了,剩余的没有脉冲,故为高了,从而根据接收到的高电平的脉宽可以区分0与1);由这里我们可以得出在0与1之间,1高电平持续时间为1.68ms,0吃血的时间为0.56ms.(2)NEC协议图片在附件中上图是NEC协议的一个典型脉冲发送图。
此协议LSB最低位先传送,所以接收的时候最先接收的是低位。
此图传送的地址是$59、命令是$16.协议说明:①一个信息发送是由9mS的AGC自动增益控制脉冲开头,在早期的IR红外接收器中用来设置增益。
接着是4.5mS空闲,然后是地址、命令。
②地址和命令都传送2次,第二次的地址和命令是反码,可以用来校验接收到的信息。
总的传输时间是固定的,因为每一位都有反码传送。
③一个命令只发送一次,即使遥控器上的按键一直按着。
但是会每1 10mS发送一次代码,此代码是重复码(在④中解释),直到遥控器按键释放。
④重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS 脉冲。
由以上可知:在接收端高电平持续最长的时间为4.5ms,表示为引导码。
高电平时间持续为2.25ms为重复码。
由此我们在一个5ms的时间内的脉冲的高电平持续时间,从而判断是引导码、重复码、还是1和0。
高/低电平时间4.5/9ms 2.25/9ms 1.68/0.56ms0.56/0.56ms码类型引导码重复码10在5ms只要是上面的任意码,都会出现高低电平的变化的,如果超过5ms都没有出现变化,则这个码就是无效码。
NEC协议的遥控器参考代码
NEC协议的遥控器参考代码NEC协议的遥控器参考代码/************************************************************** **************NEC_INF_S.h用于NEC协议的遥控器与51单片机结合的驱动程序,可用任意IO口,不占用中断资源。
用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码,并且接收数据时低位在前,高位在后。
主控器为51单片机,晶振频率为11.0592MHz。
注意:由于未用中断,所以信号的接收是靠查询方式的,可能会漏掉若干次红外信号。
*************************************************************** **************/#include#define uchar unsigned char#define uint unsigned int#define N 5000//用于在while()中循环时超时跳出的数的上限,可小刀sbit nec_dat=P3^3;//任意IO口,用到哪个自己改哪个uchar nec_id[2]={0};//遥控器的编码号,第一个为原码,第二个为反码uchar nec_data[2]={0};//遥控器的命令号,第一个为原码,第二个为反码uchar nec_status=0;//遥控器的按键状态信息。
0:无按键;1:一次按键;2:连续按键uchar nec_actflag=0;//用于带到主函数里的按键响应标志。
0:不动作;1:动作#ifndef NEC_INF_S_h#define NEC_INF_S_hvoid nec_init();//初始化函数,注意一定要拉高,拉低就错误了void nec_delay();//延时0.8ms左右,要求要非常精确,这是正确读数的关键void nec_pulsedat();//读第2到第32个脉冲,第一个脉冲已判定void nec_getdat();//扫描式读遥控器的数据,可能有时会扫描不到#endifvoid nec_init()//初始化函数,注意一定要拉高,拉低就错误了{nec_dat=1;}void nec_delay()//延时0.8ms左右,要求要非常精确,这是正确读数的关键{uchar i;for(i=0;i<245;i++);}/*void nec_act()//按键响应程序,根据自己需要写{nec_getdat();//先扫描一遍红外信号if(nec_actflag==1)//如果是正确的红外信号才处理,否则跳过{if(nec_data[0]==~nec_data[1])//验证所接收数据是否正确{switch(nec_data[0])//自己写所需要的程序段{case 69:/*点亮二极管,让蜂鸣器发声,什么都行,写在这里*/ break;case 70: /*以下都一样,对应的遥控器按键见图1-1*/ break;case 71: break;case 68:break;case 64:break;case 67:break;case 7:break;case 21:break;case 9:break;case 22:break;case 25:break;case 13:break;case 12:break;case 24:break;case 94:break;case 8:break;case 28:break;case 90:break;case 66:break;case 82:break;case 74:break;}}nec_actflag=0;}}*/void nec_pulsedat()//读第2到第32个脉冲,第一个脉冲已判定{uchar i=0;uint num=0;for(i=1;i<32;i++){num=0;while((nec_dat==0)&&(num<n))num++;<bdsfid="124" p=""></n))num++;<>nec_delay();if(nec_dat==1){if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]|(0x01<<i);<bdsfid="129" p=""></i);<>if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]|(0x01<<(i-8));if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]|(0x01<<(i-16));if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]|(0x01<<(i-24));num=0;while((nec_dat==1)&&(num<n))num++;<bdsfid="134" p=""></n))num++;<>}else{if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]&(~(0x01<<i));< bdsfid="139" p=""></i));<>if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]&(~(0x01<<i-8));< bdsfid="141" p=""></i-8));<>if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]&(~(0x01<<i-16));< bdsfid="143" p=""></i-16));<>if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]&(~(0x01<<i-24));< bdsfid="145" p=""></i-24));<>}}}void nec_getdat()//扫描式读遥控器的数据,可能有时会扫描不到{uint num=0;if(nec_dat==1){num=0;while((nec_dat==1)&&(num<="" p="">if(nec_dat==0){nec_delay();if(nec_dat==0){nec_delay();if(nec_dat==0){nec_delay();if(nec_dat==0){nec_status=1;num=0;while((nec_dat==0)&&(num<n))num++;< bdsfid="167" p=""></n))num++;<>num=0;while((nec_dat==1)&&(num<n))num++;< bdsfid="169" p=""></n))num++;<>}}}}if(nec_status==1){num=0;while((nec_dat==0)&&(num<n))num++;< bdsfid="177" p=""></n))num++;<>nec_delay();if(nec_dat==1){nec_delay();nec_delay();nec_delay();if(nec_dat==1)nec_status=2;else{nec_id[0]=0x01;nec_pulsedat();}}else{nec_id[0]=0x00;nec_pulsedat();}nec_actflag=1;//一次按键的响应程序}if(nec_status==2){//持续按键的响应程序}nec_status=0;//必须归零,非常重要}。
NEC红外编码
HT49CVX 遥控接收软件模块设计指南文件编码:HA0077s概述本软件模块用于接收译码编码格式为NEC格式(见图1) 的红外遥控器信号,由于使用了RMT TIMER,所以适用于带有RMT TIMER功能的HT49CVX系列。
功能及原理本软件模块适用译码NEC格式的红外编码,NEC格式如下图所示:图1 NEC编码格式使用时请将红外信号接到PC.7/RMT引脚,由波形的上升和下降缘触发RMTTIMER来记录高、低准位的宽度,每记录一对高低准位后,再采用相对宽度的方法,即判断高准位与低准位的宽度的相对大小,来判定接收到该bit的信号是bit ″0″或bit ″1″。
在接收Lead Code和Repeat Code的时候,则是采用判断相对宽度和判断高低准位的宽度是否在给定的范围里面相结合的方法,例如,在系统频率为4MHz时,如果lo_count>hi_count 并且 lo_l<lo_count<lo_h并且hi_l<hi_count<hi_h,则认为接收到的该bit为Lead Code或者为RepeatCode。
(注:实际应用时,一般情况下,实际接收到的波形与图1所示的波形,高低准位正好相反。
lo_count为实际低准位宽度,hi_count为实际高准位宽度,如图2;lo_l,lo_h,hi_l,hi_h分别是低准位和高准位的宽度范围)。
使用者应注意的是,在自己的系统频率不是4MHz时,应相应地修改在receiver_define.asm文件里的lo_l,lo_h,hi_l,hi_h四个常数,否则程序不能正常运行!图2在接收到第一对高低准位后,随即判断该bit是否为Lead Code,如果不是,则软件模块将自行初始化;如果是,则继续接收以后的讯号,在接收完全部的Custom Code和Data Code后,将判断接收到的Custom Code是否与预置的一致并且Data Code的高低字节是否互反,如果不是,则软件模块将自行初始化;如果接收有效,则设立旗标为有效值,并继续判断是否有Repeat Code进入,若有,则设立对应旗标为有效值。
遥控器编码
红外遥控编码格式红外遥控器的编码格式通常有两种格式:NEC和RC5 NEC格式的特征:1:使用38 kHz载波频率2:引导码间隔是9 ms + 4.5 ms3:使用16位客户代码4:使用8位数据代码和8位取反的数据代码不过需要将波形反转一下才方便分析:NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PPM)。
逻辑“0”是由0.56ms的38KHZ载波和0.560ms的无载波间隔组成;逻辑“1”是由0.56ms的38KHZ载波和1.68ms的无载波间隔组成;结束位是0.56ms的38K载波。
下面实例是已知NEC类型遥控器所截获的波形:遥控器的识别码是Address=0xDD20;其中一个键值是Command=0x0E;注意波形先是发低位地址再发高位地址。
所以0000,0100,1011,1011反转过来就是1101,1101,0010,000十六进制的DD20;键值波形如下:也是要将0111,0000反转成0000,1110得到十六进制的0E;另外注意8位的键值代码是取反后再发一次的,如图0111,0000 取反后为1000,1111。
最后一位是一个逻辑“1”。
RC5编码相对简单一些:同样由于取自红外接收头的波形需要反相一下波形以便于分析:反相后的波形:根据编码规则:得到一组数字:110,11010,001101根据编码定义:第一位是起始位S 通常是逻辑1第二位是场位F通常为逻辑1,在RC5扩展模式下它将最后6位命令代码扩充到7位代码(高位MSB),这样可以从64个键值扩充到128个键值。
第三位是控制位C 它在每按下了一个键后翻转,这样就可以区分一个键到底是一直按着没松手还是松手后重复按。
如图所示是同一按键重复按两次所得波形,只有第三位是相反的逻辑,其它的位逻辑都一样。
其后是五个系统地址位:11010=1A 最后是六个命令位:001101=0D。
红外线遥控器NEC编码
FAE Service Department designed
紅外遙控器的常見協議分析
常用的红外线信号传输协议有 ITT 协议、 NEC 协议、 Nokia NRC 协议、 Sharp 协议、 Philips RC-5 协议、Philips RC-6协议, Philips RECS-80协议,以及 Sony SIRC 协议等。 協議組成 :一般由引導碼 ,用戶碼,資料碼,重複碼或資料碼的反碼和 結束碼構成。 載波:常用的有33K,36K,36.6K,38K,40K,56K,無載波 占空比:常用的有1/3,1/2,不常用1/4 調製方式:脈寬調製,相位調製,脈衝位置調製
紅外線的基本特性
1. 紅外光按波長範圍分為近 紅外、中紅外、遠紅外、 極紅外4類。 紅外線遙控是利用近紅外 光傳送遙控指令的,波長 為0.76um~1.5um。 用近紅外作為遙控光源, 是因為目前紅外發射器件 與紅外接收器件的發光與 受光峰值波長一般為 0.8um~0.94um,這樣可以 獲得較高的傳輸效率及較 高的可靠性。
HT48R09E4學習型遙控器軟件流程
開始
1. 2. 3.
RAM初始化:將RAM的内部清空。 睡眠程序:IC進入HALT模式。 鍵盤掃描程序:用於取鍵值。有鍵按 下,進入鍵盤掃描,沒有鍵按下,進 入省電模式。 其他程序:定時重發,保留給用戶, 用戶根據自己的需要加入程序,配合 鍵盤掃描程序使用。 延時程序:客戶自己加入的延時程 序Part numbers including "C" are mask version devices while "R" are OTP devices.
Part No.
Encoder/Decoder
VDD
遥控格式
遥控格式注:各遥控格式的描述都以从遥控sensor 接收到的波形为准:1. NEC 遥控数据格式Logic 0Logic 1图NEC-11.1 NEC 数据格式定义每一个遥控按键按下从遥控sensor 接收到的数据格式如上图所示,如果按键一直被按下,会发送后面的重复码,各按键数据发送的间隔时间是108ms 。
按键数据由“引导码+16位地址码+8位键值码+8位键值数据的反码”组成。
16位地址码A0~A15的值由发送芯片(HT6221/6222)外连电路中的开关S0~S15的连接方法以及芯片中掩膜ROM 中的值共同确定。
其中A0~A7的值就等于S0~S7的值与ROM1中的值相或。
S8~S15中的值与ROM2中的值相或后再与A0~A7的值同或后就可以得到A8~A15的值。
键值由按键在键盘矩阵的排列位置决定。
以下图为例说明地址数据A0~A15的值的确定方法:(开关断开:0,开关闭合:1)外部开关 S0~S15:片内 ROM1, ROM2:A0~A7:A8`~A15`:A8~A15:A0A1A2A5A3A4A6A71:不发生翻转,0:发生翻转)注意:假如对于PT2221/2222发送芯片,地址码A[8:15]一般都是A[0:7]的反码1.2 NEC 数据逻辑定义 如图NEC-1 所示2. MITSUBISHI遥控数据格式本处采用的遥控发送芯片为M34280M1-108FP 。
Head codeCustom codeC0C1C2C3C4C5C6C7Separator codeD0D1D2D3D4D5D6D7Data code~MITSUBISHI-1Logic 0Logic 1MITSUBISHI-22.1 MITSUBISHI 数据格式定义按键数据由“引导码+8位客户码+间隔码+8位键值码”组成(如图MITSUBISHI-1所示)。
按键数据发送的最短间隔时间是60ms ,其中8位键值码由按键矩阵的排列方式及按键在矩阵中的位置决定,而8位客户码C0~C4的值由芯片外连的电路决定,C5、C6及C7的值分别固定为0、1、1,以下图为例说明C0~C4的值的确定方法:Custom codeC0C1C2C3C4C5C6C710101112.2 MITSUBISHI 数据逻辑定义如图MITSUBISHI-2所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NEC协议的遥控器参考代码
/****************************************************************************
NEC_INF_S.h
用于NEC协议的遥控器与51单片机结合的驱动程序,可用任意IO口,不占用中断资源。
用户码8位,分布于2-17个脉冲;按键码8位,分布于18-33个脉冲。
皆为前8原码,后8反码,并且接收数据时低位在前,高位在后。
主控器为51单片机,晶振频率为11.0592MHz。
注意:由于未用中断,所以信号的接收是靠查询方式的,可能会漏掉若干次红外信号。
*****************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define N 5000//用于在while()中循环时超时跳出的数的上限,可小刀
sbit nec_dat=P3^3;//任意IO口,用到哪个自己改哪个
uchar nec_id[2]={0};//遥控器的编码号,第一个为原码,第二个为反码
uchar nec_data[2]={0};//遥控器的命令号,第一个为原码,第二个为反码
uchar nec_status=0;//遥控器的按键状态信息。
0:无按键;1:一次按键;2:连续按键uchar nec_actflag=0;//用于带到主函数里的按键响应标志。
0:不动作;1:动作
#ifndef NEC_INF_S_h
#define NEC_INF_S_h
void nec_init();//初始化函数,注意一定要拉高,拉低就错误了
void nec_delay();//延时0.8ms左右,要求要非常精确,这是正确读数的关键void nec_pulsedat();//读第2到第32个脉冲,第一个脉冲已判定
void nec_getdat();//扫描式读遥控器的数据,可能有时会扫描不到
#endif
void nec_init()//初始化函数,注意一定要拉高,拉低就错误了
{
nec_dat=1;
}
void nec_delay()//延时0.8ms左右,要求要非常精确,这是正确读数的关键{
uchar i;
for(i=0;i<245;i++);
}
/*void nec_act()//按键响应程序,根据自己需要写
{
nec_getdat();//先扫描一遍红外信号
if(nec_actflag==1)//如果是正确的红外信号才处理,否则跳过
{
if(nec_data[0]==~nec_data[1])//验证所接收数据是否正确
{
switch(nec_data[0])//自己写所需要的程序段
{
case 69:/*点亮二极管,让蜂鸣器发声,什么都行,写在这里*/ break;
case 70: /*以下都一样,对应的遥控器按键见图1-1*/ break;
case 71: break;
case 68:break;
case 64:break;
case 67:break;
case 7:break;
case 21:break;
case 9:break;
case 22:break;
case 25:break;
case 13:break;
case 12:break;
case 24:break;
case 94:break;
case 8:break;
case 28:break;
case 90:break;
case 66:break;
case 82:break;
case 74:break;
}
}
nec_actflag=0;
}
}*/
void nec_pulsedat()//读第2到第32个脉冲,第一个脉冲已判定{
uchar i=0;
uint num=0;
for(i=1;i<32;i++)
{
num=0;while((nec_dat==0)&&(num<N))num++;
nec_delay();
if(nec_dat==1)
{
if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]|(0x01<<i);
if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]|(0x01<<(i-8));
if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]|(0x01<<(i-16));
if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]|(0x01<<(i-24));
num=0;while((nec_dat==1)&&(num<N))num++;
}
else
{
if((i>=1)&&(i<=7))nec_id[0]=nec_id[0]&(~(0x01<<i));
if((i>=8)&&(i<=15))nec_id[1]=nec_id[1]&(~(0x01<<i-8));
if((i>=16)&&(i<=23))nec_data[0]=nec_data[0]&(~(0x01<<i-16));
if((i>=24)&&(i<=31))nec_data[1]=nec_data[1]&(~(0x01<<i-24));
}
}
}
void nec_getdat()//扫描式读遥控器的数据,可能有时会扫描不到
{
uint num=0;
if(nec_dat==1){num=0;while((nec_dat==1)&&(num<N))num++;} nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_delay();
if(nec_dat==0)
{
nec_status=1;
num=0;while((nec_dat==0)&&(num<N))num++;
num=0;while((nec_dat==1)&&(num<N))num++;
}
}
}
}
if(nec_status==1)
{
num=0;while((nec_dat==0)&&(num<N))num++;
nec_delay();
if(nec_dat==1)
{
nec_delay();nec_delay();nec_delay();
if(nec_dat==1)nec_status=2;
else
{
nec_id[0]=0x01;
nec_pulsedat();
}
}
else
{
nec_id[0]=0x00;
nec_pulsedat();
}
nec_actflag=1;//一次按键的响应程序
}
if(nec_status==2)
{
//持续按键的响应程序
}
nec_status=0;//必须归零,非常重要}。