查看: 1830|回复: 0
打印 上一主题 下一主题

单片机红外线解码程序(日本三菱M50462系列)

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-4 19:50:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;==========================================================================
;====Power Disassembler for MCS-51 and 6502================================
;==========================================================================
;   Writen by: 覃远高
;   Copyright: 覃远高
;    HomePage: http://coolsh.163.net
;      E-mail: qinyg@163.net
;         Tel: 0755-2282553
;      Update: 3.Jul,2000
;==========================================================================
;===========Disassemble information========================================
;==========================================================================
;    File Name: C:\My Documents\Hwx_18A
;      IC Body: MCS-51  
;         Date: 07-11-10
;==========================================================================
;==========================================================================
;标号==============指令================================地址===机器码=======
;==========================================================================

;******************************************************************

;************红外线接收器程序    2007/11/11 修改  2003年5月在合肥市原创*********************

;**************处理16位红外线编码和八位键值P3.7 ,P3.5,P3.3,P3.2*************************

; *********************************八位键值   P1.2 ,P1.3,P1.4,P1.5**********************


Q0000:             NOP                                ;   待CPU复位
  
                   CLR   A                            ;   清零

                   MOV   P1,#00                       ;   外部P1=0

                   MOV   P3,#00                       ;   外部P3=0

                  SETB P3.0                           ;  串行口移位寄存器方式用

                  SETB P3.1                           ;     串行口移位寄存器方式用,应为高电平

Q0006:             LCALL Q003D                        ;   调用89C51内部RAM单元清0子程序

                   LCALL Q006E                        ;   调用初始化和遥控数据读取子程序

                   NOP                                ;  
                   NOP                                ;
                   NOP                                ;

                   LCALL Q0121                        ;   调用键值处理子程序  

                   LCALL WWW                          ;  调用内存单元2FH,2EH 编码显示子程序

                   LCALL Q025C                        ;  调用 延时子程序50ms

                   LCALL Q025C                        ;  调用 延时子程序50ms
            
START:            LJMP  Q0006                        ;   从头开始循环

;==========================================================================
Q001B:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0023:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q002B:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0033:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q003B:                 DB  00H, 00H        ;..

;=============    89C51内部RAM单元清0子程序     =======================================

Q003D:             NOP  

                   CLR A                              ;  A=0
                  
                   SETB  P3.4                         ; 红外线信号输入口置为输入壮态

                   MOV   R0,#08H                      ;从内部RAM 08H单元开始清0

                   MOV   R1,#55H                      ;共计77个单元清0

Q0044:             MOV   @R0,A                        ; 送0至各单元

                   INC   R0                           ; 指向下一个单元

                   DJNZ  R1,Q0044                     ; 循环

                   MOV   SP,#60H                      ; 内部堆栈指针

                   RET                                ;  子程序返回

;==========================================================================
Q004C:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0054:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q005C:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0064:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q006C:                 DB  00H, 00H        ;..

;============================  初始化和遥控数据读取子程序   ===============

Q006E:             CLR   ET1                          ;关T1中断允许

                   CLR   TR1                          ;关定时器T1

                   CLR   EX0                          ;关外部中断0口

               ;    CLR   EA                           ;关总中断

                   MOV   R0,#08H                      ;   高电平计数值存放首地址

                   MOV   R1,#3DH                      ;   低电平计数值存放首地址

                   CLR   A                            ;  A清零

                   MOV   DPH,A                        ;高位计数器清零

                   MOV   DPL,A                        ;低位计数器清零

Q007F:             JNB   P3.4,Q0094                   ;寻找红外线输入起始位,此位为0时转Q0094
                                                      ;判断是否为起始位

                   INC   DPTR                         ;此位为高平时对DPTR 循环计数,每过21us计数一次

                   NOP                                ; 以下为空操作延时

                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;

                   AJMP  Q007F                        ; 转开始检测,等待低电平出现

;***********************  判断是否为起始位 *********************************************

Q0094:             CJNE  A,DPH,Q009D                  ;高八位计数值不为0是起始位(255*21us=5.355ms,大于此值一般为起始位)

                   MOV   DPH,A                        ; 高位计数值为0,不是起始位

                   MOV   DPL,A                        ;清0

                   AJMP  Q007F                        ;重新寻找起始位

Q009D:             CLR   A                            ;  处理起始位开始,A清0

                   MOV   DPH,A                        ; 计数器高位清零

                   MOV   DPL,A                        ; 计数器低位清零

Q00A2:             JB    P3.4,Q00B7                   ;    检测输入端电平,决定程式方向

                   INC   DPTR                         ;    低电平时循环对DPTR计数

                   NOP                                ;   空操作延时

                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;

                   AJMP  Q00A2                        ;   循环周期为21us

Q00B7:             MOV   R4,DPH                       ;   存起始位,高八位送R4中

                   MOV   R5,DPL                       ;   存起始位,低八位送R5中

                   MOV   DPH,#00H                     ;   计数器高位清0

                   MOV   DPL,#00H                     ;    计数器低位清0或放入校正值

                   AJMP  Q00EE                        ;    转处理高平程序

;*******************************低电平处理,并且存高电平时的计数值**********************

Q00C3:             NOP                                ;
                   NOP                                ;

                   MOV   @R0,DPL                      ;  存入高电平时的计数值(在08H--**H单元中)

                   INC   R0                           ; 指向下一个单元
                  
                   MOV   DPL,#00H                     ; 清0,为下一次计数作准备

                   MOV   DPH,#00H                     ;

Q00CE:             JB    P3.4,Q00E3                   ;  读低电平程序,高电平时再转Q00E3

                   INC   DPTR                         ;   低电平时对DPTR计数

                   NOP                                ;   空操作延时

                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;

                   AJMP  Q00CE                        ;    每21us循环计数一次

Q00E3:             NOP                                ;
                   NOP                                ;

                   MOV   @R1,DPL                      ; 存低电平数据(地址从89C2051从3DH开始)

                   INC   R1                           ;   指向下一个单元

                   MOV   DPL,#00H                     ;清零

                   MOV   DPH,#00H                     ;

;***********************  处理高平程序  ***************************************

Q00EE:             JNB   P3.4,Q0103                   ;检测红外线输入端 ,高电平顺序执行,低电平转移至LL9

                   INC   DPTR                         ; 高电平计数  

                   NOP                                ; 空操作延时
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   NOP                                ;
                   AJMP  Q00EE                        ;  循环计数

Q0103:             CLR   A                            ;  低电平时入口,清A

                   CJNE  A,DPH,Q0109                  ; 比较,DPH为0时,顺序执行;不为0时是停止位转Q0109处理   

                   AJMP  Q00C3                        ; 转低电平处理,并且存高电平时的计数值

Q0109:             MOV   @R0,A                        ;

                   MOV   @R1,A                        ;

                   SETB  P3.4                         ;

                   NOP                                ;

                   RET                                ;
;==========================================================================
Q010F:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0117:                 DB  00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q011F:                 DB  00H, 00H        ;..
;==========================================================================

;*******************************   键值处理子程序  ****************************                 

Q0121:             PUSH  00H                          ; 压堆栈保护  R0

                   PUSH  01H                          ; 压堆栈保护  R1

                   PUSH  2EH                          ; 压堆栈保护  2EH

                   PUSH  2FH                          ; 压堆栈保护  2FH

                   MOV   R1,#10H                      ;电平计数值存放首地址(10H、11H、12H、13H、14H、15H、16H、17H)

                   MOV   R0,#08H                      ;电平计数值存放首地址(08H、09H、0AH、0BH、0CH、0DH、0EH、0FH)
;*********************************  处理2F.7位 ************************************************
                   CLR   C                            ; 清进位位

                   MOV   A,@R0                        ; 高位一个计数值送A中

                   SUBB  A,#47H                       ; 和临界值比较

                   JNC   Q017F                        ;小于47转

                   SETB  C                            ;大于47 置进位位

                   MOV   2FH.7,C                      ;这位值送位地址7FH

Q0136:             INC   R0                           ;指向下一个高位计数值
;*********************************  处理2F.6位 ************************************************

                   CLR   C                            ;清进位位

                   MOV   A,@R0                        ;高位一个计数值送A中

                   SUBB  A,#47H                       ;和临界值比较

                   JNC   Q0184                        ;小于47转

                   SETB  C                            ;大于47 置进位位

                   MOV   2FH.6,C                      ;这位值送位地址7FH

Q0140:             INC   R0                           ;
;*********************************  处理2F.5位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0189                        ;
                   SETB  C                            ;
                   MOV   2FH.5,C                      ;
Q014A:             INC   R0                           ;
;*********************************  处理2F.4位 ****************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q018E                        ;
                   SETB  C                            ;
                   MOV   2FH.4,C                      ;
Q0154:             INC   R0                           ;
;*********************************  处理2F.3位 **************************
                  CLR   C                            ;
                   MOV   A,@R0                        ;
                  SUBB  A,#47H                        ;
                   JNC   Q0193                        ;
                   SETB  C                            ;
                   MOV   2FH.3,C                      ;
Q015E:             INC   R0                           ;
;*********************************  处理2F.2位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0198                        ;
                   SETB  C                            ;
                   MOV   2FH.2,C                      ;
Q0168:             INC   R0                           ;
;*********************************  处理2F.1位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q019D                        ;
                   SETB  C                            ;
                   MOV   2FH.1,C                      ;
Q0172:             INC   R0                           ;
;*********************************  处理2F.0位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q01A2                        ;
                   SETB  C                            ;
                   MOV   2FH.0,C                      ;

                   LJMP  Q01A5                        ;
;==========================================================================

;*********************************  处理2F.7_0位 *************************
Q017F:             CLR   C                            ; 清进位位

                   MOV   2FH.7,C                      ;0送位地址

                   AJMP  Q0136                        ;指向下一位

;*********************************  处理2F.6_0位 ****************************

Q0184:             CLR   C                            ;清进位位

                   MOV   2FH.6,C                      ;0送位地址

                   AJMP  Q0140                        ;指向下一位

;*********************************  处理2F.5位_0位 **************************

Q0189:             CLR   C                            ;
                   MOV   2FH.5,C                      ;
                   AJMP  Q014A                        ;
;*********************************  处理2F.4位_0位 **************************

Q018E:             CLR   C                            ;
                   MOV   2FH.4,C                      ;
                   AJMP  Q0154                        ;
;*********************************  处理2F.3位_0位 ***************************

Q0193:             CLR   C                            ;
                   MOV   2FH.3,C                      ;
                   AJMP  Q015E                        ;
;*********************************  处理2F.2位_0位 ****************************

Q0198:             CLR   C                            ;
                   MOV   2FH.2,C                      ;
                   AJMP  Q0168                        ;
;*********************************  处理2F.1位_0位 *****************************

Q019D:             CLR   C                            ;
                   MOV   2FH.1,C                      ;
                   AJMP  Q0172                        ;
;*********************************  处理2F.0位_0位 ******************************

Q01A2:             CLR   C                            ;
                   MOV   2FH.0,C                      ;
;*********************************  处理后八位键值 ******************************


;*********************************  处理2E.7位_1位 ******************************

Q01A5:             CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q01F6                        ;
                   SETB  C                            ;
                   MOV   2EH.7,C                      ;
;*********************************  处理2E.6位_1位 *******************************
Q01AE:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q01FB                        ;
                   SETB  C                            ;
                   MOV   2EH.6,C                      ;
;*********************************  处理2E.5位_1位 *******************************
Q01B8:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0200                        ;
                   SETB  C                            ;
                   MOV   2EH.5,C                      ;
;*********************************  处理2E.4位_1位 *******************************
Q01C2:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0205                        ;
                   SETB  C                            ;
                   MOV   2EH.4,C                      ;
;*********************************  处理2E.3位_1位 *******************************
Q01CC:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q020A                        ;
                   SETB  C                            ;
                   MOV   2EH.3,C                      ;
;*********************************  处理2E.2位_1位 *******************************
Q01D6:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q020F                        ;
                   SETB  C                            ;
                   MOV   2EH.2,C                      ;
;*********************************  处理2E.1位_1位 *******************************
Q01E0:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0214                        ;
                   SETB  C                            ;
                   MOV   2EH.1,C                      ;
;*********************************  处理2E.7位_0位 *******************************
Q01EA:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBB  A,#47H                       ;
                   JNC   Q0219                        ;
                   SETB  C                            ;
                   MOV   2EH.0,C                      ;
;*******************************************************************************************

                   AJMP  Q021A                        ; 转进一步处理,从外部口输出电平

;*******************************************************************************************

;*********************************  处理2E.7_0位 ************************
Q01F6:             CLR   C                            ;
                   MOV   2EH.7,C                      ;
                   AJMP  Q01AE                        ;
;*********************************  处理2E.6_0位 ************************
Q01FB:             CLR   C                            ;
                   MOV   2EH.6,C                      ;
                   AJMP  Q01B8                        ;
;*********************************  处理2E.5_0位 ************************
Q0200:             CLR   C                            ;
                   MOV   2EH.5,C                      ;
                   AJMP  Q01C2                        ;
;*********************************  处理2E.4_0位 ************************
Q0205:             CLR   C                            ;
                   MOV   2EH.4,C                      ;
                   AJMP  Q01CC                        ;
;*********************************  处理2E.3_0位 ************************
Q020A:             CLR   C                            ;
                   MOV   2EH.3,C                      ;
                   AJMP  Q01D6                        ;
;*********************************  处理2E.2_0位 ************************
Q020F:             CLR   C                            ;
                   MOV   2EH.2,C                      ;
                   AJMP  Q01E0                        ;
;*********************************  处理2E.1_0位 ************************
Q0214:             CLR   C                            ;
                   MOV   2EH.1,C                      ;
                   AJMP  Q01EA                        ;
;*********************************  处理2E.0_0位 ************************
Q0219:             CLR   C                            ;
                   MOV   2EH.0,C                      ;

;*******************************  进一步处理,从外部口输出电平  *******************************

Q021A:              CLR A                              ; A清0

                   CJNE A, 2FH,Q0220                  ; 未按键时不存显示数据

                   AJMP   Q021C                       ; 转正常显示                     
               
Q0220:             MOV  A,2EH                         ; 送代码

                   CPL  A                             ;求反

                   MOV  7FH,A                        ;作显示保存用

                   MOV  A,2FH                         ;  送数据

                   CPL   A                            ;  求反

                   MOV  7EH,A                         ;作显示保存用
                              
Q021C:             MOV   A,2FH                        ;  键值单元送A中

                   CPL   A                            ;  取反

                   MOV   B,A                          ;  送B中保存

                   CJNE  A,#0E2H,Q024F                ;  和常数E2H比较,各遥控器值不同

                   MOV   A,2EH                        ;  键值单元送A中

                   CPL   A                            ;  取反

                   CJNE  A,#14H,Q022C                 ;  熊猫YKF-9电视机遥控器1#键

                   CPL   P3.7                         ;  口位值取反

Q022C:             CJNE  A,#04H,Q0231                 ;  熊猫YKF-9电视机遥控器2#键

                   CPL   P3.5                         ;  口位值取反

Q0231:             CJNE  A,#18H,Q0236                 ;   熊猫YKF-9电视机遥控器3#键

                   CPL   P3.3                         ;  口位值取反

Q0236:             CJNE  A,#08H,Q023B                 ;   熊猫YKF-9电视机遥控器4#键

                   CPL   P3.2                         ;   口位值取反

Q023B:             CJNE  A,#0CH,Q0240                 ;   熊猫YKF-9电视机遥控器5#键

                   CPL   P1.5                         ;   口位值取反

Q0240:             CJNE  A,#10H,Q0245                 ;   熊猫YKF-9电视机遥控器6#键

                   CPL   P1.4                         ;   口位值取反

Q0245:             CJNE  A,#00H,Q024A                 ;    熊猫YKF-9电视机遥控器7#键

                   CPL   P1.3                         ;   口位值取反

Q024A:             CJNE  A,#90H,Q024F                 ;    熊猫YKF-9电视机遥控器0#键

                   CPL   P1.2                         ;   口位值取反

Q024F:             POP   2FH                          ;     弹出堆栈
  
                   POP   2EH                          ;    弹出堆栈

                   POP   01H                          ;    弹出堆栈

                   POP   00H                          ;    弹出堆栈

                      RET                             ;   子程序返回

;==========================================================================
Q0258:                 DB  00H, 00H, 00H, 00H        ;....
;==========================================================================

;*****************************   延时子程序50ms   ************************************

Q025C:             PUSH  05H                          ;
                   PUSH  06H                          ;
                   MOV   R5,#0BFH                     ;
Q0262:             MOV   R6,#0FFH                     ;
                   DJNZ  R6,$                         ;
                   DJNZ  R5,Q0262                     ;
                   POP   06H                          ;
                   POP   05H                          ;
                   RET                                ;
;==========================================================================

Q02FD:                 DB  00H, 00H, 00H, 00H        ;....
;==========================================================================

;******************** 内存单元编码显示子程序     **************************************

ORG 0500H

WWW:  SETB  ES      ;串行口中断允许

      SETB  EA      ;   总中断允许

         
      MOV SCON,#00H ;  串行口模式为移位寄存器模式,P3.0 接数据 P3.1接时钟

;**********************     2FH单元数据显示   *******************************************

LOOP: MOV A,7FH       ;送一个数据
      
XXX:        MOV R6,A         ; 数据送R6暂存

        SWAP A           ;半字节交换,处理高四位

        ANL A,#0FH       ;去掉高四位

      MOV DPTR ,#TABLE ; 码表首地址

      MOVC A, @A+DPTR  ; 查表转换

        MOV SBUF,A       ; 送串口发送

        JNB TI,$         ; 等候发完

      CLR TI           ;清标致位
        
        PUSH 06          ;

        MOV A,R6        ;取出存数

        ANL A,#0FH       ;处理低四位

        MOV DPTR ,#TABLE ; 表首地址

        MOVC A, @A+DPTR  ; 查表

        MOV SBUF,A       ;送串行口发送

WAIT: JNB TI,WAIT      ; 等等

        CLR TI           ; 清标致
        

        AJMP PPP         ;  转低电平单元数据显示

;**********************2EH单元数据显示*******************************************

PPP:  MOV A,7EH      ;  送数

        MOV R6,A          ; 不是0送入R6保存

        SWAP A            ;  半字节交换,先处理高四位

        ANL A,#0FH        ; 去掉高四位

      MOV DPTR ,#TABLE  ;码表地址

      MOVC A, @A+DPTR   ; 查表

        MOV SBUF,A        ; 送串行口发送

        JNB TI,$          ; 等候

      CLR TI            ;  清标致

        MOV A,R6          ; 取数

        ANL A,#0FH        ; 处理低四位

        MOV DPTR ,#TABLE  ; 码表

        MOVC A, @A+DPTR   ; 查表

         MOV SBUF,A        ;送串口

WAIT2: JNB TI,WAIT2     ; 等候

         CLR TI            ;  清标致
               
PPP1:    POP 06H         ;  弹出

           RET              ;      

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;码表--0,1,2,3,4,5,6,7,8
       DB 90H,88H,83H,0C6H,0A1H,86H,8EH         ;--9,A,B,C,D,E,F



END
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表