;==========================================================================
;====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 |