📄 main.asm
字号:
/*------------------------------------------------------------------------------
Copyright 2006 Dragonchip Ltd.
Version: 1.00
Writer: Danny Ho
------------------------------------------------------------------------------*/
#include <\Register\6688.inc>
#include <\RAM\RAM.asm>
ORG 0000H ; code segment start at 0000H
JMP RESET
ORG 0030H
RESET:
MOV R0,#PBCONH ;PB7-4 open drain out
MOV A,#01010101B
MOVX @R0,A
MOV R0,#PBCONL ;PB3-0 open drain out
MOV A,#01010101B
MOVX @R0,A
MOV R0,#PACONH ;PA7-4 IN int falling edge
MOV A,#00000000B
MOVX @R0,A
;
MOV R0,#PACONL ;PA3-0 IN int falling edge
MOV A,#00000000B
MOVX @R0,A
;
MOV R0,#PAPUR ;PULL-UP ENABLE
MOV A,#11111111B
MOVX @R0,A
MOV R0,#PCCON ;PC1 = push pull outpot
MOV A,#10101011B ;REM Port Normal I/O Carrier on
MOVX @R0,A
MOV R0,#PC ; init PC0 to low
MOVX A,@R0
ANL A,#11111110B
MOVX @R0,A
MOV A,#0 ;
MOV R0,#3FH
INIT_SRAM64BYTE_LOOP: ;
MOV @R0,A ;
DJNZ R0,INIT_SRAM64BYTE_LOOP
MAIN1:
MOV R0,#PA
MOVX A,@R0
MOV PATEMP,A
CALL IR_IN ;等待红外有效信号
JNB RUNOK,MAIN1
clr RUNOK
CJNE A,#06H,RUN1
ACALL LOOP1
AJMP MAIN1
RUN1:
CJNE A,#0DH,RUN2
ACALL LOOP2
AJMP MAIN1
RUN2:
CJNE A,#0EH,RUN3
ACALL LOOP3
AJMP MAIN1
RUN3:
CJNE A,#0FH,RUN4
ACALL LOOP4
AJMP MAIN1
RUN4:
CJNE A,#01DH,RUN5
ACALL LOOP5
AJMP MAIN1
RUN5:
CJNE A,#1EH,RUN6
ACALL LOOP6
AJMP MAIN1
RUN6:
CJNE A,#1FH,RUN7
ACALL LOOP7
AJMP MAIN1
RUN7:
CJNE A,#04H,RUN8
ACALL LOOP8
AJMP MAIN1
RUN8:
CJNE A,#05H,RUN9
ACALL LOOP9
AJMP MAIN1
RUN9:
CJNE A,#16H,RUN10
ACALL LOOP10
AJMP MAIN1
RUN10:
CJNE A,#1AH,RUN11
ACALL LOOP11
AJMP MAIN1
RUN11:
CJNE A,#00H,RUNOVER
ACALL LOOP12
AJMP MAIN1
RUNOVER:
AJMP MAIN1
;**********************************************************
; 0.14MS延时子程序
; IR解码使用
;**********************************************************
DEL:
MOV R6,#140
DLA:
DJNZ R6,DLA ; T3=3
RET
IR_IN:
MOV R0,#CODE0
MOV R4,#28
IR_IN1:
CALL DEL ;延时4ms,去干扰再确认IR信号是否出现
DJNZ R4,IR_IN1
MOV R1,#PA
MOVX A,@R1
MOV PATEMP,A
JB IRIN,IR_END ;如果IRIN=1没有IR信号出现,则退出
WAIT_H:
MOV R1,#PA
MOVX A,@R1
MOV PATEMP,A
JB IRIN,WAIT_H1 ;等IR变为高电平避开9ms低电平引导脉冲
CALL DEL
JMP WAIT_H
WAIT_H1:
MOV R3,#0 ;8位数清为0
WAIT_L:
MOV R1,#PA
MOVX A,@R1
MOV PATEMP,A
JNB IRIN,WAIT_H2 ;等 IR 变为低电平
CALL DEL
JMP WAIT_L
WAIT_H2:
MOV R1,#PA
MOVX A,@R1
MOV PATEMP,A
JB IRIN,IR_COUN ;等 IR 变为高电平
CALL DEL
JMP WAIT_H2
IR_COUN:
MOV R2,#0 ;对高电平进行0.14ms计数
IR_COUN1:
CALL DEL
MOV R1,#PA
MOVX A,@R1
MOV PATEMP,A
JB IRIN, IR_COUN2 ;等 IR 变为高电平
;IR=0,检查R2中的计数值
MOV A,#8
CLR C ;清借位标志
SUBB A,R2 ;判断高低位
;若C=0,则解码为“0"
;若C=1,则解码为“1"
MOV A,@R0 ;取出原先的数据
RRC A ;将借位标志C移入A
MOV @R0,A ;处理完一位,将数据写入
INC R3 ;接收字节计数加1
CJNE R3,#8,WAIT_L ;需处理完8位
MOV R3,#0
INC R0 ;存放IR数据值加1
CJNE R0,#CODE0+4,WAIT_L ;收集到4字节了
JMP IR_NUM
IR_COUN2:
INC R2
CJNE R2,#20,IR_COUN1 ;0.14ms计数过长,则自动离开
IR_END:
RET
;**********************************************************
IR_NUM:
MOV A,DATA1
CPL A ;将(25H)取反后和24H比较
CJNE A,DATA0,IR_NUM1 ;如果不等表示接收数据错误,放弃。
MOV A,CODE0
CPL A
CJNE A,CODE1,IR_NUM1
MOV A,CODE0 ;效验用户码是否为 "00"
CJNE A,#53H,IR_NUM1
;dec a
;JNZ IR_NUM1
ACALL BEEP_BL
SETB RUNOK ;解码成功20H.0置1。
mov a,DATA0
IR_NUM1:
RET
LASE:
LOOP1:
MOV R0,#PB
MOV A,#0
MOVX @R0,A
ACALL DELAY
RET
LOOP2:
MOV R0,#PB
MOV A,#3
MOVX @R0,A
ACALL DELAY
RET
LOOP3:
MOV R0,#PB
MOV A,#7
MOVX @R0,A
ACALL DELAY
RET
LOOP4:
MOV R0,#PB
MOV A,#0FH
MOVX @R0,A
ACALL DELAY
RET
LOOP5:
MOV R0,#PB
MOV A,#1FH
MOVX @R0,A
ACALL DELAY
RET
LOOP6:
MOV R0,#PB
MOV A,#3FH
MOVX @R0,A
ACALL DELAY
RET
LOOP7:
MOV R0,#PB
MOV A,#7FH
MOVX @R0,A
ACALL DELAY
RET
LOOP8:
MOV R0,#PB
MOV A,#0FFH
MOVX @R0,A
ACALL DELAY
RET
LOOP9:
MOV R0,#PB
MOV A,#1
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#3
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#7
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#0FH
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#1FH
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#3FH
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#7FH
MOVX @R0,A
ACALL DELAY
MOV R0,#PB
MOV A,#0FFH
MOVX @R0,A
ACALL DELAY
RET
LOOP10:
MOV DPTR,#ONLY1
MOV A,#0
MOV TEMP,#0
LOOP101:
; MOV A,TEMP
MOVC A,@A+DPTR
MOV R0,#PB
MOVX @R0,A
ACALL DELAY
INC TEMP
MOV A,TEMP
CJNE A,#9,LOOP101
RET
LOOP11:
MOV DPTR,#ADDLED
MOV A,#0
MOV TEMP,#0
LOOP111:
MOVC A,@A+DPTR
MOV R0,#PB
MOVX @R0,A
ACALL DELAY
INC TEMP
MOV A,TEMP
CJNE A,#9,LOOP111
RET
LOOP12:
MOV DPTR,#ROUND
MOV A,#0
MOV TEMP,#0
LOOP121:
MOVC A,@A+DPTR
MOV R0,#PB
MOVX @R0,A
ACALL DELAY
INC TEMP
MOV A,TEMP
CJNE A,#9,LOOP121
RET
BEEP_BL:
MOV R6,#100
BL1:
CALL DEX1
MOV R0,#PC ; init PC0 to low
MOVX A,@R0
ORL A,#00000001B
MOVX @R0,A
DJNZ R6,BL1
MOV R0,#PC ; init PC0 to low
MOVX A,@R0
ANL A,#11111110B
MOVX @R0,A
RET
DEX1:
MOV R7,#180
DEX2:
NOP
DJNZ R7,DEX2
RET
DELAY:
MOV R6,#055H
D1:
MOV R7,#0FFH
D2:
MOV R5,#10
D3: DJNZ R5,D3
DJNZ R7,D2
DJNZ R6,D1
RET
FLASHDATA:
ONLY1:
DB 0FFH,0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
ADDLED:
DB 0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H
ROUND:
DB 0FFH,0E7H,0C3H,081H,000H,081H,0C3H,0E7H,0FFH
SHUZHI:
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -