?? morse.asm
字號(hào):
;ATMEL AT89C2051 MORSE CODE TRAINNING KIT
CR EQU 0DH
LF EQU 0AH
BPS9600 EQU FDH
MS10 EQU 9217 ;APPROXIMATELY 10MS
ADDR EQU 30H
TEST EQU 00H
DI EQU 10
DA EQU 30
SPACE EQU 00
STOP EQU FFH
;
INTR_CNT EQU 20H
BEEP EQU 21H
POINTER_H EQU 22H
POINTER_L EQU 23H
COUNT EQU 24H
M_CODE EQU 25H
ROW EQU 26H
GRADE EQU 27H
SPEED EQU 28H
;
RESULT EQU 21H
R_ADDR EQU 22H
RESULT_OLD EQU 23H
CHR_OUT EQU 24H
;
RAND1 EQU 40H
RAND2 EQU RAND1+1
RAND3 EQU RAND1+2
RAND4 EQU RAND1+3
;
TX_TRUE REG 29H.0
OVERWRITE REG 29H.1
STOP_TRUE REG 29H.2
;
ORG 0000H
JMP START
ORG 0003H ;[DISABLE] EXTERNAL INT0 INTERRUPT
RETI
ORG 000BH ;[ENABLE] TIMER0 OVERFLOW INTERRUPT
JMP T0_ISR
;
ORG 0013H
RETI ;[DISABLE] EXTERNAL INT1 INTERRUPT
ORG 001BH
RETI ;[DISABLE] TIMER1 OVERFLOW INTERRUPT
ORG 0023H
JMP SERIAL ;[ENABLE] SERIAL INTERRUPT
;
ORG 30H
;
START
CLR RI
MOV SP,#60H
MOV P1,#FFH
MOV P3,#FFH
CALL BEEP_ON
CALL LDELAY
CALL BEEP_OFF
CALL DEMO_LED
;
RESET CALL SET_TMR0
CALL ENABLE_TMR
CALL ENABLE_SERIAL
CALL ENABLE_INTR
MOV BEEP,#00H
MOV COUNT,#00H
MOV ROW,#00H
MOV GRADE,#00H
MOV SPEED,#8
SETB STOP_TRUE
;
; SETB ES
;
CALL WELCOME
;MAIN ROUTINE
WAIT
MOV A,RAND1
MOV B,#26
DIV AB ;REMAINDER IN B
MOV A,B
ADD A,#'A' ;A='A' TO 'Z'
CALL MORSE_CODE
$2 JNB STOP_TRUE,$2 ;WAIT UNTIL STOP_BIT=1
INC COUNT
MOV A,COUNT
CJNE A,#5,$3
$3 JC $4 ;COUNT=0...4
MOV COUNT,#00H ;CLEAR COUNT
CALL ASCII_SP ;SPACE
INC ROW
MOV A,ROW
CJNE A,#10,$30
MOV ROW,#00H
CALL ASCII_CRLF ;ADD LINE FEED
INC GRADE
MOV A,GRADE
CJNE A,#20,$CHG_SPEED ;SPEED CHANGE CHECK
$CHG_SPEED
JC $30
;CHECK SPEED
MOV A,SPEED
CJNE A,#04H,$300
$300 DEC SPEED
$30 MOV R0,SPEED
$31 CALL LDELAY
DJNZ R0,$31
;
$4 MOV A,SPEED
RR A
MOV R0,A
MOV P1,#FFH
$5 CALL LDELAY
DJNZ R0,$5
JNB TX_TRUE,WAIT
;
T0_ISR
MOV TH0,# (65536-MS10) / 256 ;RELOAD TH0
MOV TL0,# (65536-MS10) .MOD. 256
PUSH A
PUSH B
PUSH DPH
PUSH DPL
PUSH 02H
PUSH 00H
;
JNB RI,$NEXT
MOV A,SBUF
CLR RI
;
;CHECK COMMAND
$CMD1 CJNE A,#' ',$CMD_END
CALL WELCOME
$CMD_END
;
$NEXT INC INTR_CNT
MOV A,INTR_CNT
CJNE A,#50,$NO
CPL P3.5 ;0.5 SEC FLASH
MOV INTR_CNT,#00H
;
$NO CALL RANDOMIZE
MOV A,BEEP
JZ $KEEP_ON ;IF BEEP=0 SKIP IT
DEC BEEP
MOV A,BEEP
CJNE A,#00H,$KEEP_ON
CALL BEEP_OFF
MOV DPH,POINTER_H
MOV DPL,POINTER_L
INC DPTR
MOV POINTER_H,DPH ;SAVE POINTER
MOV POINTER_L,DPL
CLR A
MOVC A,@A+DPTR
CJNE A,#SPACE,$NEXT1
MOV BEEP,#DI ;SAME LENGTH
CALL BEEP_OFF
JMP $KEEP_ON
$NEXT1 CJNE A,#STOP,$NEXT2
MOV BEEP,#00H
SETB STOP_TRUE
CALL BEEP_OFF
CLR TI
MOV A,M_CODE ;MORSE CODE IN ASCII
CALL ASCII_OUT
JMP $KEEP_ON
$NEXT2 MOV BEEP,A ;DI OR DA
CALL BEEP_ON ;BUZZER ON
;
$KEEP_ON
POP 00H
POP 02H
POP DPL
POP DPH
POP B
POP A
RETI
;
RANDOMIZE
MOV A,RAND1
RRC A
RRC A
RRC A
XRL A,RAND3
RRC A
RRC A
XRL A,RAND2
RRC A
XRL A,RAND4
RRC A
CPL C
MOV R0,#RAND1
MOV R2,#04H
$1 MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R2,$1
MOV A,RAND1
ADD A,INTR_CNT
MOV RAND1,A
RET
;
SEND_OUT
MOV DPH,R7
MOV DPL,R6
CLR A
MOVC A,@A+DPTR
CJNE A,#'$',$OUT
CLR TX_TRUE
RET
;
$OUT CALL ASCII_OUT ;TRANSMIT A BYTE
INC DPTR
MOV R6,DPL
MOV R7,DPH
JMP SEND_OUT
;
WELCOME MOV DPTR,#TBL_WELCOME
JMP TABLE
TABLE SETB TX_TRUE
MOV R6,DPL
MOV R7,DPH
CALL SEND_OUT
RET
;
TBL_WELCOME
DB CR,LF
DB CR,LF,CR,LF
DB 'MORSE CODE TRAINNING KIT',CR,LF
DB 'by Chipware Systems Inc.',CR,LF
DB '1996/04/01 All rights reserved',CR,LF
DB 'TEL:886-7-3955152 FAX:886-7-3955155',CR,LF
DB 'E-mail:chipware@ksts.seed.net.tw',CR,LF
DB CR,LF,7,'$'
;
ASCII_SP
MOV A,#' '
CALL ASCII_OUT
RET
;
ASCII_CRLF
MOV A,#CR
CALL ASCII_OUT
MOV A,#LF
CALL ASCII_OUT
RET
;
ASCII_OUT
MOV SBUF,A
LCALL SDELAY
CLR P3.2
RET
;
SET_TMR0
MOV A,#21H ;TIMER MODE 2
MOV TMOD,A
MOV TH0,# (65536-MS10) / 256 ;RELOAD TH0
MOV TL0,# (65536-MS10) .MOD. 256
MOV TH1,#BPS9600
MOV INTR_CNT,#00H
RET
;
ENABLE_TMR
SETB PT0
CLR IE0
CLR IT0
CLR TF0 ;CLEAR TMR0 OVER FLAG
SETB TR0 ;START COUNT
;
; CLR TF1
SETB TF1
SETB TR1
CLR IE1
CLR IT1
RET
;
ENABLE_SERIAL
MOV SCON,#01011010B
CLR RI
CLR TI
RET
;
;ENABLE INTERRUPT SOURCE
ENABLE_INTR
SETB ET0
; SETB ES
SETB EA ;ENABLE INTERRUPT
RET
;
SERIAL
PUSH PSW
PUSH A
PUSH B
JB RI,$0
CLR TI
JMP SINT_END ;RET FROM SERIAL INTERRUPT
$0 CLR RI ;clear Rx ready flag.
CLR TI
JNB SM2,$1
MOV A,SBUF ;READ ONE BYTE
MOV R_ADDR,A
CJNE A,#ADDR,$WRONG_ADDR
CLR SM2 ;GET DATA NEXT
JMP SINT_END
$1 MOV A,SBUF
MOV RESULT,A ;SAVE RESULT
SETB SM2 ;SM2=1 GET ID NEXT
JMP SINT_END
;SAME DATA
;
;DIFFERENT DATA IN SBUF
$2 SETB OVERWRITE
SETB SM2 ;SM2=1 GET ID ONLY
;
$WRONG_ADDR
SINT_END
POP B
POP A
POP PSW
RETI
;
SDELAY MOV R2,#03H
$1 MOV R3,#00H
$2 DJNZ R3,$2
DJNZ R2,$1
RET
;
DELAY MOV R2,#30H
$1 MOV R3,#00H
$2 DJNZ R3,$2
DJNZ R2,$1
RET
;
LDELAY MOV R2,#00H
$1 MOV R3,#00H
$2 DJNZ R3,$2
DJNZ R2,$1
RET
;
DEMO_LED
CALL LDELAY
MOV P1,#00H ;ALL LEDs ON
CALL LDELAY
MOV B,#08H
MOV A,#FEH
$1 MOV P1,A
CALL LDELAY
RL A
DJNZ B,$1
CALL LDELAY
MOV P1,#FFH ;ALL LEDs OFF
RET
;
BEEP_ON
SETB P3.7
MOV P1,#00H
RET
BEEP_OFF
CLR P3.7
MOV P1,#FFH
RET
;
;CODE IN ACC
MORSE_CODE
CJNE A,#'A',$B
$A MOV DPTR,#CODE_A
JMP $MORSE_OUT
$B CJNE A,#'B',$C
MOV DPTR,#CODE_B
JMP $MORSE_OUT
$C CJNE A,#'C',$D
MOV DPTR,#CODE_C
JMP $MORSE_OUT
$D CJNE A,#'D',$E
MOV DPTR,#CODE_D
JMP $MORSE_OUT
$E CJNE A,#'E',$F
MOV DPTR,#CODE_E
JMP $MORSE_OUT
$F CJNE A,#'F',$G
MOV DPTR,#CODE_F
JMP $MORSE_OUT
$G CJNE A,#'G',$H
MOV DPTR,#CODE_G
JMP $MORSE_OUT
$H CJNE A,#'H',$I
MOV DPTR,#CODE_H
JMP $MORSE_OUT
$I CJNE A,#'I',$J
MOV DPTR,#CODE_I
JMP $MORSE_OUT
$J CJNE A,#'J',$K
MOV DPTR,#CODE_J
JMP $MORSE_OUT
$K CJNE A,#'K',$L
MOV DPTR,#CODE_K
JMP $MORSE_OUT
$L CJNE A,#'L',$M
MOV DPTR,#CODE_L
JMP $MORSE_OUT
$M CJNE A,#'M',$N
MOV DPTR,#CODE_M
JMP $MORSE_OUT
$N CJNE A,#'N',$O
MOV DPTR,#CODE_N
JMP $MORSE_OUT
$O CJNE A,#'O',$P
MOV DPTR,#CODE_O
JMP $MORSE_OUT
$P CJNE A,#'P',$Q
MOV DPTR,#CODE_P
JMP $MORSE_OUT
$Q CJNE A,#'Q',$R
MOV DPTR,#CODE_Q
JMP $MORSE_OUT
$R CJNE A,#'R',$S
MOV DPTR,#CODE_R
JMP $MORSE_OUT
$S CJNE A,#'S',$T
MOV DPTR,#CODE_S
JMP $MORSE_OUT
$T CJNE A,#'T',$U
MOV DPTR,#CODE_T
JMP $MORSE_OUT
$U CJNE A,#'U',$V
MOV DPTR,#CODE_U
JMP $MORSE_OUT
$V CJNE A,#'V',$W
MOV DPTR,#CODE_V
JMP $MORSE_OUT
$W CJNE A,#'W',$X
MOV DPTR,#CODE_W
JMP $MORSE_OUT
$X CJNE A,#'X',$Y
MOV DPTR,#CODE_X
JMP $MORSE_OUT
$Y CJNE A,#'Y',$Z
MOV DPTR,#CODE_Y
JMP $MORSE_OUT
$Z CJNE A,#'Z',$0
MOV DPTR,#CODE_Z
JMP $MORSE_OUT
$0 CJNE A,#'0',$1
MOV DPTR,#CODE_0
JMP $MORSE_OUT
$1 CJNE A,#'1',$2
MOV DPTR,#CODE_1
JMP $MORSE_OUT
$2 CJNE A,#'2',$3
MOV DPTR,#CODE_2
JMP $MORSE_OUT
$3 CJNE A,#'3',$4
MOV DPTR,#CODE_3
JMP $MORSE_OUT
$4 CJNE A,#'4',$5
MOV DPTR,#CODE_4
JMP $MORSE_OUT
$5 CJNE A,#'5',$6
MOV DPTR,#CODE_5
JMP $MORSE_OUT
$6 CJNE A,#'6',$7
MOV DPTR,#CODE_6
JMP $MORSE_OUT
$7 CJNE A,#'7',$8
MOV DPTR,#CODE_7
JMP $MORSE_OUT
$8 CJNE A,#'8',$9
MOV DPTR,#CODE_8
JMP $MORSE_OUT
$9 CJNE A,#'9',$WRONG
MOV DPTR,#CODE_9
JMP $MORSE_OUT
$WRONG JMP $END
;
$MORSE_OUT
;ASCII CODE IN ACC,DIH-DAH DATA IN DPTR
MOV M_CODE,A ;SAVE ASCII CODE
CLR A
MOVC A,@A+DPTR
MOV POINTER_H,DPH ;SAVE POINTER
MOV POINTER_L,DPL
MOV BEEP,A
CALL BEEP_ON
CLR STOP_TRUE
$END RET
;
CODE_A DB DI,SPACE,DA,SPACE ,STOP
CODE_B DB DA,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_C DB DA,SPACE,DI,SPACE,DA,SPACE,DI,SPACE,STOP
CODE_D DB DA,SPACE,DI,SPACE,DI,SPACE ,STOP
CODE_E DB DI,SPACE ,STOP
CODE_F DB DI,SPACE,DI,SPACE,DA,SPACE,DI,SPACE,STOP
CODE_G DB DA,SPACE,DA,SPACE,DI,SPACE ,STOP
CODE_H DB DI,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_I DB DI,SPACE,DI,SPACE,STOP
CODE_J DB DI,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,STOP
CODE_K DB DA,SPACE,DI,SPACE,DA,SPACE ,STOP
CODE_L DB DI,SPACE,DA,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_M DB DA,SPACE,DA,SPACE ,STOP
CODE_N DB DA,SPACE,DI,SPACE ,STOP
CODE_O DB DA,SPACE,DA,SPACE,DA,SPACE ,STOP
CODE_P DB DI,SPACE,DA,SPACE,DA,SPACE,DI,SPACE,STOP
CODE_Q DB DA,SPACE,DA,SPACE,DI,SPACE,DA,SPACE,STOP
CODE_R DB DI,SPACE,DA,SPACE,DI,SPACE ,STOP
CODE_S DB DI,SPACE,DI,SPACE,DI,SPACE ,STOP
CODE_T DB DA,SPACE ,STOP
CODE_U DB DI,SPACE,DI,SPACE,DA,SPACE ,STOP
CODE_V DB DI,SPACE,DI,SPACE,DI,SPACE,DA,SPACE,STOP
CODE_W DB DI,SPACE,DA,SPACE,DA,SPACE ,STOP
CODE_X DB DA,SPACE,DI,SPACE,DI,SPACE,DA,SPACE,STOP
CODE_Y DB DA,SPACE,DI,SPACE,DA,SPACE,DA,SPACE,STOP
CODE_Z DB DA,SPACE,DA,SPACE,DI,SPACE,DI,SPACE,STOP
;
CODE_1 DB DI,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,STOP
CODE_2 DB DI,SPACE,DI,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,STOP
CODE_3 DB DI,SPACE,DI,SPACE,DI,SPACE,DA,SPACE,DA,SPACE,STOP
CODE_4 DB DI,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,DA,SPACE,STOP
CODE_5 DB DI,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_6 DB DA,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_7 DB DA,SPACE,DA,SPACE,DI,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_8 DB DA,SPACE,DA,SPACE,DA,SPACE,DI,SPACE,DI,SPACE,STOP
CODE_9 DB DA,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,DI,SPACE,STOP
CODE_0 DB DA,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,DA,SPACE,STOP
;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -