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

📄 signal_final.asm

📁 通信基带信号发生器的设计
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       MOV A,COUNT1
       CJNE A,COUNT3,DATA3
DATA2: MOV A,#0CH           ;关光标
       LCALL SEND_I
       RET
;*********************16进制 to 10进制***************************
TO16_10:
        MOV DIVDL,#10
        MOV DIVDH,#0
        MOV R4,#8
        MOV R0,#FIRADD
NEXT:   CALL DIVD
        MOV @R0,TEMPL
        DEC R0
        DJNZ R4,NEXT
        RET

DIVD:   PUSH        ACC
        PUSH        B
        MOV    A,DIVDH    ;判除数是否为零
        ORL    A,DIVDL
        JNZ    DIVD0
        SETB    OV        ;除数为零,置溢出标志
        POP    B
        POP    ACC
        RET
DIVD0:  MOV    TEMPL,#00H    ;除数不为零,进行运算
        MOV    TEMPH,#00H
        MOV    B,#20H        ;置循环次数
DIVD1:  CLR    C            ;进位位、余数单元和
        MOV    A,DIVDLL        ;被除数单元全体逐个
        RLC    A            ;向左循环移位
        MOV    DIVDLL,A
        MOV    A,DIVDLH
        RLC    A
        MOV    DIVDLH,A
        MOV    A,DIVDHL
        RLC    A
        MOV    DIVDHL,A
        MOV    A,DIVDHH
        RLC    A
        MOV    DIVDHH,A
        MOV    A,TEMPL
        RLC    A
        MOV    TEMPL,A
        xCH    A,TEMPH
        RLC    A
        xCH    A,TEMPH
        MOV    F0,C            ;保存进位位
        CLR    C
        SUBB    A,DIVDL        ;用余数减去除数
        MOV    R7,A
        MOV    A,TEMPH
        SUBB    A,DIVDH
        ANL    C,/F0            ;判断是否够减
        JC    DIVD2        ;不够减,移下一位
        MOV    TEMPL,R7        ;够减,刷新余数单元
        MOV    TEMPH,A
        INC    DIVDLL        ;商上1
DIVD2:  DJNZ    B,DIVD1
        CLR    OV
        POP    B
        POP    ACC
        RET
;************************10进制到16进制转换程序****************************
ZHUANHUAN:
        MOV R0,AD4
        MOV M0,#0
        MOV M1,#0
        MOV M2,#0
        MOV M3,#0
        DEC COUNT2
LOOP:   ACALL XJ
        ACALL MUL_41
        INC R0
        DJNZ COUNT2,LOOP
        ACALL XJ
        RET

XJ:     MOV A,M0
        ADD A,@R0
        MOV M0,A
        MOV A,M1
        ADDC A,#0
        MOV M1,A
        MOV A,M2
        ADDC A,#0
        MOV M2,A
        MOV A,M3
        ADDC A,#0
        MOV M3,A
        RET

MUL_41: CLR C
        MOV A,M0
        MOV B,#10
        MUL AB
        MOV M0,A
        MOV Z1,B
        MOV A,M1
        MOV B,#10
        MUL AB
        ADDC A,Z1
        MOV M1,A
        MOV Z2,B
        MOV A,M2
        MOV B,#10
        MUL AB
        ADDC A,Z2
        MOV M2,A
        MOV Z3,B
        MOV A,M3
        MOV B,#10
        MUL AB
        ADDC A,Z3
        MOV M3,A
        RET
;***************************数据存储程序********************************
CHUNSHU:MOV R0,AD2            ;将转换后的16进制数字放到并口发送缓冲区
        MOV @R0,M0            ;注意缓冲区在80H后的要间接寻址
        INC R0
        MOV @R0,M1
        INC R0
        MOV @R0,M2
        INC R0
        MOV @R0,M3
        RET
;*************************并行数据传输程序******************************
TRAN: PUSH ACC
      PUSH PSW
      SETB RS0
      SETB RS1               ;用寄存器组3
      SETB EN
      MOV  R0,AD2
      MOV  R7,#5              ;发送4个字节的数据
TRAN1:CLR  TXD
      SETB TXD
      MOV  P2,@R0
      INC  R0
      DJNZ R7,TRAN1
      CLR  EN              ;6个字节发送完毕,发一个高电平脉冲
      POP ACC
      POP PSW
      RET
;============================================================================
;**************************键盘扫描子程序************************************
KEY:  PUSH ACC
      PUSH PSW
KEY1: MOV P1,#0F0H          ;行线为P0-P3,列线为P4-P7
      MOV A,P1
      ORL A,#0FH
      CPL A
      JNZ IN
      SJMP KEY1

IN:   ACALL DELAY
      ACALL DELAY
      ACALL DELAY
      ACALL DELAY
      MOV KEYH,#04H
      MOV KEYN,#07FH    ;做指针,指示待扫描行
      MOV KEYZ,#0
SCAN: MOV A,KEYN
      RL A
      MOV KEYN,A
      MOV P1,A          ;逐行扫描,被扫描行送低
      MOV A,P1          ;读列线电平值
      SWAP A
      MOV KEYL,#04H
KEY2: RRC  A
      JNC FIND          ;C位不为1转
      INC KEYZ
      DJNZ KEYL,KEY2
      DJNZ KEYH,SCAN
      SJMP KEY3

FIND:  MOV P1,#0F0H
LOOSEN:MOV A,P1
       ORL A,#0FH
       CPL A
       JNZ LOOSEN

KEY3: POP PSW
      POP ACC
      RET
;**************************键盘20MS延时**************************************
DELAY:MOV R6,#15H
DL2:  MOV R7,#18H
DL1:  NOP
      NOP
      DJNZ R7,DL1
      DJNZ R6,DL2
      RET
;============================================================================
;************************显示欢迎界面****************************************
WEL_XS:
        MOV DPTR,#WEL_A
        MOV COUNT,#10H   ;地址计数器设为16。
        MOV A,#80H       ;第一行起始地址
        LCALL SEND_I
        LCALL QUWRD
        MOV DPTR,#WEL_B
        MOV COUNT,#10H   ;地址计数器设为16。
        MOV A,#0C0H       ;第二行起始地址
        LCALL SEND_I
        LCALL QUWRD
        RET
;****************************取字符显示**************************************
QUWRD:  CLR A
        MOVC A,@A+DPTR ;查表取数据
        LCALL SEND_D   ;送显示
        INC DPTR
        DJNZ COUNT,QUWRD
        RET
;****************************取数字显示**************************************
QUSHU:  DEC COUNT1               ;带消除高位为0的显示
QU1:    MOV R0,AD4
        MOV A,@R0
        JNZ QU2
        INC AD4
        DJNZ COUNT1,QU1
QU2:    INC COUNT1
QU3:    MOV R0,AD4
        MOV A,@R0
        ADD A,#30H
        LCALL SEND_D
        INC AD4
        DJNZ COUNT1,QU3
        RET
;*************************LCM初始化*******************************************
INIT:
        MOV A,#38H       ;设置8 位格式,2行,5*7*
        LCALL SEND_I
        MOV A,#06H       ;设定输入方式,增量不移位
        LCALL SEND_I
        MOV A,#0CH       ;开显示,关光标,不闪烁
        LCALL SEND_I
        MOV A,#01H       ;清除显示
        LCALL SEND_I
        RET
;*************************清屏***********************************************
CLEAR_P:
        MOV A,#01H       ;清屏
        LCALL SEND_I
        RET
;**********************写数据子程序*******************************************
SEND_D:
        LCALL CHK_BUSY   ;查是否忙
        SETB RS          ;LCM有效
        CLR RW           ;写模式
        MOV P0,A
        SETB E
        NOP
        NOP
        CLR E
        RET
;**************************向LCM送指令****************************************
SEND_I:
        LCALL CHK_BUSY
        CLR RS
        CLR RW
        MOV P0,A
        SETB E
        NOP
        NOP
        CLR E
        RET
;*********************检查数据线是否繁忙****************************************
CHK_BUSY:
        MOV P0,#0FFH ;测忙碌子程序
        CLR RS
        SETB RW
        SETB E
        JB P0.7,$
        CLR E
        RET
;================================================================================
;**********************************查表区域**************************************
WEL_A:   DB ' * WELCOME TO * '
WEL_B:   DB ' * OUR SYSTEM * '

TAB_SIN: DB ' SIN            '
TAB_AM:  DB '  AM            '
TAB_FM:  DB '  FM            '
TAB_ASK: DB ' ASK            '
TAB_PSK: DB ' PSK            '
TAB_FSK: DB ' FSK            '
TAB_FB:  DB '  FB            '
TAB_SJB: DB ' SJB            '


TAB_MS:  DB 'MOD?            '
TAB_FRE: DB 'FRE :           '
TAB_FREZ:DB 'FREZ:           '

TAB:     DB '                '

END

⌨️ 快捷键说明

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