📄 test2.a51
字号:
INPUT EQU P3.2 ; Port3,Bit2 is used as input. The demodulated signal
; with active low level is connected to this pin
LF EQU 0AH ; Linefeed
CR EQU 0DH ; Carriage return
SPC EQU 20H ; Space
RB0 EQU 000H ; Select Register Bank 0
RB1 EQU 008H ; Select Register Bank 1 ...poke to PSW to use
SW1 equ P0.0 ;Switch 1 connected here
SW2 equ P0.1 ;Switch 2 connected here
SW3 equ P0.2 ;Switch 3 connected here
SW4 equ P0.3 ;Switch 4 connected here
SW5 equ P0.4 ;Switch 5 connected here
SW6 equ P0.5 ;Switch 6 connected here
SW7 equ P0.6 ;Switch 7 connected here
SW8 equ P0.7 ;Switch 8 connected here
SWA equ P0 ;Port at which switches are connected
SWB EQU P1
SWC EQU P2
SWD EQU P3
LAT1 EQU 01H
LAT2 EQU 02H
LAT3 EQU 04H
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
PWR BIT FLAGS.2
TMP BIT FLAGS.3
TMP1 BIT FLAGS.4
COMMAND: DS 1 ; Received command byte
SUBAD: DS 1 ; Device subaddress
TEMP: DS 1
TEMP1: DS 1
TEMP2: DS 1
TEMP3: DS 1
BUFFER: DS 30 ; Buffer to store length of transmitted pulses
STACK: DS 1 ; Stack begins here
CSEG ; Code begins here
ORG 00H ; Reset
JMP MAIN
ORG 0003H ; External Interrupt0
JMP RECEIVE
ORG 000BH
JMP TMR_1
BIN2BCD: ;Convert 8 bit value in Acc to 3 digit BCD
MOV B,#100
DIV AB
ADD A,#30H
ACALL DATAWRT
;CALL N_OUT
XCH A,B
MOV B,#10
DIV AB
ADD A,#30H
ACALL DATAWRT
;CALL N_OUT
XCH A,B
ADD A,#30H
ACALL DATAWRT
;CALL N_OUT
RET
RECEIVE: CLR TR0
PUSH PSW ; save current registerset
MOV PSW,#RB1
PUSH ACC
MOV R0,#BUFFER
REC: MOV A,#0
REC0: INC A ; Measure duration of low-level
NOP
NOP ; Delay
NOP
NOP
JZ TIMEOUT ; End of transmission if duration exeeds 256 counts
JNB INPUT,REC0
MOV @R0,A
INC R0
MOV A,#0
REC1: INC A ; Measure duration of high-level
NOP
NOP ; Delay
NOP
NOP
JZ TIMEOUT ; End of transmission
JB INPUT,REC1
MOV @R0,A
INC R0
JMP REC
TIMEOUT:
MOV A,BUFFER ; calculate threshold between short and long pulses
INC R0 ; length of first low-pulse
ADD A,BUFFER+1 ; plus length of first high-pulse
CLR C
RRC A ; divided by two
MOV R1,A
CLR C
RRC A ; plus half of the time
ADD A,R1
MOV R5,A ; yields threshold
MOV R0,#BUFFER
MOV R1,#1 ; initial value
MOV R2,#13 ; Number of bits to decode
DECODE: MOV A,@R0
INC R0
CLR C
SUBB A,R5 ; compare length with threshold
MOV A,#0
CPL C ; short=1
RLC A
JNZ NOSKIP
INC R0 ; if short skip over next pulse
NOSKIP: XRL A,R1 ; new bit is calculated by XOR with previous bit
MOV R1,A ; Store new bit
RRC A
MOV A,R3 ; Store new Bit in R3/R4 by rotating
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
DJNZ R2,DECODE
MOV A,R3
ANL A,#00111111B ; extract command from R3
MOV COMMAND,A
MOV A,R3
RLC A ; do some rotating to extract
XCH A,R4
RLC A ;device address
XCH A,R4
RLC A
XCH A,R4
RLC A
CLR CONTROL
CLR P2.1
JNB ACC.5,TZ ; Check control bit
SETB CONTROL
SETB P2.1
TZ: ANL A,#00011111B ; mask device address
MOV SUBAD,A
POP ACC ; Restore old registerset
POP PSW
SETB NEW ; Set flag to indicate the new command
JNB TMP,CLRT
SETB TR0
RETI
CLRT: CLR TR0
RETI
;--------------------------------------------------------------------
TMR_1: PUSH PSW
MOV PSW,#RB0
PUSH ACC
DJNZ R7,RETT
CLR EX0
CLR TR0
MOV R7,#20H
MOV TH0,#00H
MOV TL0,#00H
ACALL LED_DISP1
ACALL CHK1
CLR TMP
RETT: POP ACC
POP PSW
SETB EX0
RETI
; ---------==========----------==========---------=========---------
MAIN: MOV SWA,#00H
MOV SWB,#00H
MOV SWC,#00H
MOV DPTR,#LINE1
ACALL COMM
MOV DPTR,#STAN
ACALL DATA1
CLR CONTROL
CLR PWR
CLR TMP
MOV TEMP,#00H
MOV SWA,#00H
MOV IE,#10000011
MOV TCON,#00H
MOV TMOD,#01H
MOV TH0,#00H
MOV TL0,#00H
;MOV TCON,#00H ; MAKE SURE TIMERS ARE SHUT DOWN.
MOV PSW,#RB0 ; Select register bank 0
MOV R7,#20H
MOV SP,STACK
SETB EX0 ; Enable external Interrupt0
CLR IT0 ; triggered by a high to low transition
SETB EA
CLR NEW
LOOP1: SETB P3.6
SETB P3.7
LOOP: JNB NEW,LOOP ; Wait until a command has been received
JNB PWR,CHK_PWR
;MOV A,#CR
;CALL C_OUT ; Ouput carriage return and linefeed
;MOV A,#LF
;CALL C_OUT
;MOV A,FLAGS
;ANL A,#00000001B
;CALL BIN2BCD ; Output control Bit
; MOV A,#SPC
; CALL C_OUT
;**MOV DPTR,#LINE2
;**ACALL COMM
;MOV DPTR,#ADDR
;ACALL DATA1
;MOV A,SUBAD
;ACALL BIN2BCD
;CALL BIN2BCD ; Output subaddress
;MOV A,#SPC
;CALL C_OUT
;**MOV DPTR,#COMM1
;**ACALL DATA1
;**MOV A,COMMAND
;**ACALL BIN2BCD ; Output command
CLR A
;CLR C
;MOV C,CONTROL
; RLC A
;ADD A,#30H
;ACALL DATAWRT
;CLR A
;CLR C
;MOV A,TEMP
;ADD A,#30H
;ACALL DATAWRT
MOV A,COMMAND
CJNE A,#0CH,CONT
CLR EX0 ; stop receiving
CLR EA ; and
;JB P2.0,$
SJMP MAIN ; return to monitor which has its entry
; point at 8000H
CHK_PWR: MOV A,COMMAND
CJNE A,#0CH,LOOP
SETB PWR
MOV DPTR,#LINE1
ACALL COMM
MOV DPTR,#POW
ACALL DATA1
MOV DPTR,#LINE2
ACALL COMM
MOV DPTR,#STR1
ACALL DATA1
CLR NEW
SJMP LOOP
CONT: CLR A
MOV C,CONTROL
RLC A
CJNE A,TEMP,VALID
CLR NEW
SJMP LOOP
;MOV A,COMMAND
;CLR C
;SUBB A,#0CH ; compare for standby command
;JNZ LOOP ; go on receiving
VALID: CLR NEW
CLR A
MOV C,CONTROL
RLC A
MOV TEMP,A
MOV A,COMMAND
;-------------------------------------------------------------------
; JB TMP,STR_VAL
; CJNE A,#VAL,CHK1
; SETB TMP
; SJMP LOOP
;STR_VAL: CJNE A,#VAL,NXT1
; CLR TMP
; SJMP LOOP
;NXT1:
JB TMP,SCND_VAL
SETB TMP
SETB TR0
SWAP A
MOV TEMP1,A
ACALL LED_DISP
SJMP LOOP
SCND_VAL:CLR TMP
;MOV TEMP2,A
;MOV A,TEMP1
CLR TR0
MOV R7,#20H
MOV TH0,#00H
MOV TL0,#00H
ORL A,TEMP1
MOV TEMP1,A
ACALL LED_DISP
SJMP CHK11
;SJMP LOOP
;----------------------------------------------------------
CHK1: MOV A,TEMP1
SWAP A
CJNE A,#01H,SKIP1
JB SW1,ISSET1
SETB SW1
RET
ISSET1: CLR SW1
RET
SKIP1: CJNE A,#02H,SKIP2 ;CHECK FOR SW2
JB SW2,ISSET2
SETB SW2
RET
ISSET2: CLR SW2
RET
SKIP2: CJNE A,#03H,SKIP3 ;CHECK FOR SW3
JB SW3,ISSET3
SETB SW3
RET
ISSET3: CLR SW3
RET
SKIP3: CJNE A,#04H,SKIP4 ;CHECK FOR SW4
JB SW4,ISSET4
SETB SW4
RET
ISSET4: CLR SW4
RET
SKIP4: CJNE A,#05H,SKIP5 ;CHECK FOR SW5
JB SW5,ISSET5
SETB SW5
RET
ISSET5: CLR SW5
RET
SKIP5: CJNE A,#06H,SKIP6 ;CHECK FOR SW6
JB SW6,ISSET6
SETB SW6
RET
ISSET6: CLR SW6
RET
SKIP6: CJNE A,#07H,SKIP7 ;CHECK FOR SW7
JB SW7,ISSET7
SETB SW7
RET
ISSET7: CLR SW7
RET
SKIP7: CJNE A,#08H,SKIP8 ;CHECK FOR SW8
JB SW8,ISSET8
SETB SW8
RET
ISSET8: CLR SW8
RET
SKIP8: CJNE A,#09H,SKIPA9
MOV A,R5
CLR P3.7
ACALL DELAY1
JB ACC.0,ISSET9
SETB SWB.0
MOV R5,P1
RET
ISSET9: CLR SWB.0
MOV R5,P1
RET
SKIPA9: RET
;======================------------------=============
CHK11: MOV A,TEMP1
CJNE A,#1,SKIPA1
JB SW1,ISSETA1
SETB SW1
LJMP LOOP
ISSETA1: CLR SW1
LJMP LOOP
SKIPA1: CJNE A,#2,SKIPA2 ;CHECK FOR SW2
JB SW2,ISSETA2
SETB SW2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -