⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 morse.asm

📁 8051彻底研究源程序大全,一些算法,实例,进制转换等子程序,更多详情请查阅这一本书!
💻 ASM
字号:
;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
        SETB    P3.2
        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
;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -