📄 po.asm
字号:
; ---------==========----------==========---------=========---------
; PROGRAM FOR REMOTE CONTROL FOR 8+2
; ---------==========----------==========---------=========---------
$MOD51
INPUT EQU P3.2 ; Port3,Bit2 is used as input. The demodulated signal
; with active low level is connected to this pin
ZERO EQU P3.3 ; Zero Crossing Input
OUTPUT EQU P2
OP1 EQU P2.2
OP2 EQU P2.3
OP3 EQU P2.4
OP4 EQU P2.7
OP5 EQU P2.6
OP6 EQU P2.5
FAN EQU P0.7
FANL EQU P3.6
SWITCH EQU P3.7
OP7 EQU P0.0 ;A,7
OP8 EQU P0.1 ;B,6
OP9 EQU P0.2 ;C,4
OP10 EQU P0.3 ;D,2
OP11 EQU P0.4 ;E,1
OP12 EQU P0.5 ;F,9
OP13 EQU P0.6 ;G,10
SDA EQU P2.1 ;SDA=PIN5
SCL EQU P2.0 ;SCL=PIN6
WTCMD EQU 10100000B ;WRITE DATA COMMAND Note 3
RDCMD EQU 10100001B ;READ DATA COMMAND Note 3
DSEG ; This is internal data memory
ORG 20H ; Bit adressable memory
FLAGS: DS 1
CONTROL BIT FLAGS.0 ; toggles with every new keystroke
NEW BIT FLAGS.1 ; Bit set when a new command has been received
STATUS: DS 1 ;Lights Status Bits
LIG1 BIT STATUS.0
LIG2 BIT STATUS.1
LIG3 BIT STATUS.2
LIG4 BIT STATUS.3
LIG5 BIT STATUS.4
LIG6 BIT STATUS.5
LIG7 BIT STATUS.6 ;FAN
COMMAND: DS 1 ; Received command byte
SUBAD: DS 1 ; Device subaddress
BUFFER: DS 30 ; Buffer to store length of transmitted pulses
TOGGLE: DS 1 ;Toggle every bit
ANS: DS 1 ;
SPEED: DS 1 ; Speed control Register
SPEED1: DS 1
ADDR: DS 1
STACK: DS 1 ; Stack begins here
CSEG ; Code begins here
;---------==========----------==========---------=========---------
; PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------
ORG 00H ; Reset
JMP MAIN
ORG 0003H ; External Interrupt0
JMP RECEIVE
ORG 000BH ;Timer Interrupt 0
JMP TRIGGER
ORG 0013H ; External Interrupt 1
JMP SPED
; ---------==========----------==========---------=========---------
; Interrupt 0 routine
; ---------==========----------==========---------=========---------
RECEIVE:
MOV 2,#255 ; Time Loop (3/4 bit time)
DJNZ 2,$ ; Waste Time to sync second bit
MOV 2,#255 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
Mov 2,#145 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
clr a
mov r6,#07h
pol1: mov c,Input
rlc a
Mov 2,#255 ; Waste time for next BIT
Djnz 2,$
Mov 2,#255 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
Mov 2,#255 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
Mov 2,#114 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
djnz r6,pol1
MOV SUBAD,A
mov r6,#06h
pol2:
mov c,Input
rlc a
Mov 2,#255 ; Waste time for next BIT
Djnz 2,$
Mov 2,#255 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
Mov 2,#255 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
Mov 2,#114 ; Time Loop (3/4 bit time)
Djnz 2,$ ; Waste Time to sync second bit
djnz r6,pol2
Mov COMMAND,A ; Save Command at IRData memory
MOV A,SUBAD
MOV ADDR,A
ANL A,#0FH
MOV SUBAD,A
CJNE A,#03H,ZXC1
MOV A,COMMAND
CPL A
MOV COMMAND,A
AJMP ASZ
ZXC1: MOV A,SUBAD
CJNE A,#00H,ANSS
AJMP ASZ
ASZ: MOV A,ADDR
ANL A,#20H
MOV TOGGLE,A
CJNE A,ANS,ANSS
AJMP WAR
ANSS: JMP ANS1
WAR:
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MOV A,COMMAND
;-------------------------------------------
MOV R0,A
XRL A,#01H ; device 1
JNZ CH1
CALL DEV1
AJMP GO
CH1: MOV A,R0
XRL A,#02H ; device 2
JNZ CH2
CALL DEV2
AJMP GO
CH2: MOV A,R0
XRL A,#03H ; device 3
JNZ CH3
CALL DEV3
AJMP GO
CH3: MOV A,R0
XRL A,#04H ; device 4
JNZ CH4
CALL DEV4
AJMP GO
CH4: MOV A,R0
XRL A,#05H ; device 5
JNZ CH5
CALL DEV5
AJMP GO
CH5: MOV A,R0
XRL A,#06H ; device 6
JNZ CH6
CALL DEV6
AJMP GO
CH6: MOV A,R0
XRL A,#0DH ; Fan1 on/off
JNZ CH7
CALL DEV7
AJMP GO
CH7: MOV A,R0
XRL A,#0CH ; all devices off
JNZ CH8
CALL DEV8
AJMP GO
CH8: MOV A,R0
XRL A,#10H ; Fan1 speed +
JNZ CH9
CALL DEV9
AJMP GO
CH9: MOV A,R0
XRL A,#11H ; Fan1 speed -
JNZ GO
CALL DEV10
AJMP GO
GO:
;***********************************************************
; This routine writes a byte of data to EEPROM
; The EEPROM address is assumed to be in R4. See NOTE 3
; The DATA to be written is asumed to be in R1
;***********************************************************
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#05H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,STATUS ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
;***********************************************************
MOV ANS,TOGGLE
MOV A,ANS
CPL ACC.5
MOV ANS,A
SETB NEW ; Set flag to indicate the new command
;################################################################
ANS1:
RETI
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; DEVICE DECODING
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DEV1: CPL OP1 ;Light 1
JB OP1,DE1
SETB LIG1
RET
DE1: CLR LIG1
RET
;-------------------------------------------
DEV2: CPL OP2 ;Light 2
JB OP2,DE2
SETB LIG2
RET
DE2: CLR LIG2
RET
;-------------------------------------------
DEV3: CPL OP3 ;Light 3
JB OP3,DE3
SETB LIG3
RET
DE3: CLR LIG3
RET
;-------------------------------------------
DEV4: CPL OP4 ;Light 4
JB OP4,DE4
SETB LIG4
RET
DE4: CLR LIG4
RET
;-------------------------------------------
DEV5: CPL OP5 ;Light 5
JB OP5,DE5
SETB LIG5
RET
DE5: CLR LIG5
RET
;-------------------------------------------
DEV6: CPL OP6 ;Light 6
JB OP6,DE6
SETB LIG6
RET
DE6: CLR LIG6
RET
;-------------------------------------------
DEV7: CPL LIG7 ;Fan
JNB LIG7,KLJ
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; SPEED RESTORATION
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,#06H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
CALL CREAD ;GET DATA BYTE
MOV SPEED,R1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
CLR FANL
RET
KLJ: SETB FANL
RET ; Fan off
;-------------------------------------------
DEV8: ;all off
MOV STATUS,#00H
MOV OUTPUT,#0FFH
CLR TR0
SETB FANL
RET
;-------------------------------------------
DEV9: ; Increase Speed
MOV R2,SPEED
MOV A,#08H ;Chk If > than 08
CLR C
SUBB A,R2
JNC DFDF
MOV SPEED,#00H
DFDF: CJNE R2,#08,DFF
RET
DFF: INC SPEED
;***********************************************************
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#06H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,SPEED ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
;***********************************************************
CALL DISP
RET
;-------------------------------------------
DEV10: ;Decrease Speed
MOV R2,SPEED
MOV A,#08H
CLR C
SUBB A,R2
JNC DYDF
MOV SPEED,#01H
DYDF: CJNE R2,#00,DFG
RET
DFG: DEC SPEED
;***********************************************************
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#06H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,SPEED ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
;***********************************************************
CALL DISP
RET
; ---------==========----------==========---------=========---------
; Interrupt 1 routine
; ---------==========----------==========---------=========---------
SPED:
SETB FAN
JB LIG7,QWZ
CLR TR0
RETI
QWZ: MOV R2,SPEED
CJNE R2,#00H,QW1 ; Fan Off
SETB FAN
CLR TR0
RETI
QW1: CJNE R2,#01H,QW2 ;Fan Speed 1
MOV TL0,#011H
MOV TH0,#0F0H
SETB TR0
RETI
QW2: CJNE R2,#02H,QW3 ;Fan Speed 2
MOV TL0,#0FFH
MOV TH0,#0F0H
SETB TR0
RETI
QW3: CJNE R2,#03H,QW4 ;Fan Speed 3
MOV TL0,#0FFH
MOV TH0,#0F4H
SETB TR0
RETI
QW4: CJNE R2,#04H,QW5 ;Fan Speed 4
MOV TL0,#0FFH
MOV TH0,#0F6H
SETB TR0
RETI
QW5: CJNE R2,#05H,QW6 ;Fan Speed 5
MOV TL0,#0FFH
MOV TH0,#0F7H
SETB TR0
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -