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

📄 signal.asm

📁 通信基带信号发生器的设计
💻 ASM
字号:
       ;-----------键盘扫描相关-----------
        KEYH  EQU 30H          ;待扫描行线
        KEYL  EQU 31H          ;待扫描列线
        KEYZ  EQU 32H          ;按键值
        KEYN  EQU 33H          ;指示待扫描行
       ;---------LCD显示地址相关----------
        COUNT EQU 34H          ;存字符显示个数
       COUNT1 EQU 35H          ;存输入数据位数
       COUNT2 EQU 36H          ;存送给LCD显示数字位数,等于COUNT1

        AD2   EQU 37H          ;据状态在串口通信中取数地址
        AD4   EQU 38H          ;据状态对应相应存按键值地址(对其进行16进制转换)
       ;------------16to10转换用到----------------
        M3    EQU 3AH          ;存积的四个字节空间
        M2    EQU 3BH
        M1    EQU 3CH
        M0    EQU 3DH
        Z1    EQU 4EH          ;存每次乘积的进位
        Z2    EQU 3FH
        Z3    EQU 40H
       ;--------10to16转化暂存区2f-28-------------
        FIRADD    EQU    2FH
       ;-----------除法用到的单元-----------------
        DIVDLL    EQU    41H        ;定义被除数单元
        DIVDLH    EQU    42H
        DIVDHL    EQU    43H
        DIVDHH    EQU    44H
        DIVDL     EQU    45H        ;定义除数单元
        DIVDH     EQU    46H
        TEMPL     EQU    47H        ;定义余数单元
        TEMPH     EQU    48H
       ;-----------存按键值----------------
        FRE   EQU 48H          ;频率48H-4FH      8位
        FREZ  EQU 50H          ;调制频率50H-54H  5位
       ;--------------位选-----------------
        EN    EQU P3.6         ;并行送数据用到
        TXD   EQU P3.7
        RS    EQU P3.0         ;LCD控制位
        RW    EQU P3.1
        E     EQU P3.2
;==================================================================
;**************************主函数开始******************************
        ORG 0000H
        SJMP START
        ORG 0040H
START:  MOV SP,#60H           ;主程序入口
        LCALL INIT            ;调用LCM初始化
        LCALL WEL_XS          ;显示欢迎界面

        MOV COUNT1,#0CH
NEXT1:  MOV R0,#80H
        MOV @R0,#0
        INC R0
        DJNZ COUNT1,NEXT1
        MOV R0,#80H           ;给发送空间赋标志值(每次发4个字节)
        MOV @R0,#0E7H
        MOV R0,#85H
        MOV @R0,#0E6H
        MOV R0,#8AH
        MOV @R0,#0E4H
;*******************以下输入频率\幅度\相位\模式******************
NEXT2:  MOV P1,#0F0H          ;有键按下清出欢迎界面
        MOV A,P1
        ORL A,#0FH
        CPL A
        JNZ NEXT3
        SJMP NEXT2        
NEXT3:  LCALL CLEAR_P
MAIN:   LCALL KEY
        MOV A,KEYZ
        CLR C
        SUBB A,#0BH
        JC MAIN
        MOV B,#2
        MUL AB
        MOV DPTR,#TAB1
        JMP @A+DPTR
;----------------------------------------------------------------
MS_IN:  ACALL MS_1
        AJMP MAIN

MS_1:   MOV A,#80H             ;在该行从新显示'MOD?'
        LCALL SEND_I
        MOV DPTR,#TAB_MS
        MOV COUNT,#6
        LCALL QUWRD
        MOV  A,#0EH            ;开光标
        LCALL SEND_I
MS2:    LCALL KEY
        MOV A,KEYZ
        CLR C
        SUBB A,#5              ;是否为有效模式键(0-5)
        JNC MS2
MS3:    MOV A,#0CH             ;关光标
        LCALL SEND_I
        MOV R0,#81H            ;将模式值存入发送空间
        MOV @R0,KEYZ
        MOV COUNT,#10H

        CJNE @R0,#00H,MS4
        MOV DPTR,#TAB_SIN
        SJMP MS9
MS4:    CJNE @R0,#01H,MS5
        MOV DPTR,#TAB_AM       ;在AM、FM下只占6位显示
        MOV COUNT,#6H
        SJMP MS9
MS5:    CJNE @R0,#02H,MS6
        MOV DPTR,#TAB_FM
        MOV COUNT,#6H
        SJMP MS9
MS6:    CJNE @R0,#03H,MS7
        MOV DPTR,#TAB_ASK
        SJMP MS9
MS7:    CJNE @R0,#04H,MS8
        MOV DPTR,#TAB_FSK
        SJMP MS9
MS8:    MOV DPTR,#TAB_PSK

MS9:    MOV A,#80H
        ACALL SEND_I
        ACALL QUWRD
        MOV AD2,#80H
        LCALL TRAN
        RET
;----------------------------------------------------------------
FRE_IN: ACALL FRE_1
        AJMP MAIN

FRE_1:  MOV AD4,#48H
        MOV COUNT1,#0

        MOV A,#0C0H            ;在该行从新显示'FRE:'
        LCALL SEND_I
        MOV COUNT,#10H
        MOV DPTR,#TAB_FRE
        LCALL QUWRD
        MOV A,#0C4H
        LCALL SEND_I
        LCALL DATAIN

FRE_2:  MOV AD4,#48H
        MOV COUNT2,COUNT1
        LCALL ZHUANHUAN
        MOV AD2,#86H
        LCALL CHUNSHU
        MOV AD2,#85H
        LCALL TRAN
        RET
;----------------------------------------------------------------
FREZ_IN:ACALL FREZ_1
        AJMP MAIN

FREZ_1: MOV AD4,#50H
        MOV COUNT1,#0

        MOV A,#85H             ;在该行从新显示'FRE:'
        LCALL SEND_I
        MOV COUNT,#0AH
        MOV DPTR,#TAB_FREZ
        LCALL QUWRD
        MOV A,#8AH
        LCALL SEND_I
        LCALL DATAIN

FREZ_2: MOV AD4,#50H
        MOV COUNT2,COUNT1
        LCALL ZHUANHUAN
        MOV AD2,#86H
        LCALL CHUNSHU
        MOV AD2,#85H
        LCALL TRAN
        RET
;----------------------------------------------------------------
JIA_IN: AJMP MAIN

;----------------------------------------------------------------
JIAN_IN:AJMP MAIN

;========================================================================
;***************************数据输入程序*********************************
DATAIN:MOV A,#0EH           ;开光标
       LCALL SEND_I
DATA3: LCALL KEY
       MOV A,KEYZ
       CJNE A,#0AH,DATA1    ;是否为确认键
       MOV A,COUNT1
       CJNE A,#0,DATA2      ;按下的为确认键,且已经输入数字则退出
       SJMP DATA3
DATA1: CLR C
       SUBB A,#0AH
       JNC DATA3
       MOV R1,AD4
       MOV @R1,KEYZ
       MOV A,KEYZ
       ADD A,#30H
       LCALL SEND_D
       INC COUNT1
       INC AD4
       SJMP DATA3
DATA2: MOV A,#0CH           ;关光标
       LCALL SEND_I
       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,#4              ;发送6个字节的数据
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
      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:  MOV R0,AD4
        MOV A,@R0
        ADD A,#30H
        LCALL SEND_D
        INC AD4
        DJNZ COUNT1,QUSHU
        RET
;*************************LCM初始化*******************************************
INIT:
        MOV A,#38H       ;设置8 位格式,2行,5*7*
        LCALL SEND_I
        MOV A,#0CH       ;开显示,关光标,不闪烁
        LCALL SEND_I
        MOV A,#06H       ;设定输入方式,增量不移位
        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 'PSK             '
TAB_FSK: DB 'FSK             '
TAB_PSK: DB 'ASK             '

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

TAB:     DB '                '

TAB1: JMP MS_IN
      JMP FRE_IN
      JMP FREZ_IN
      JMP JIA_IN
      JMP JIAN_IN
END

⌨️ 快捷键说明

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