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

📄 数控信号发生器.asm

📁 能产生正弦波、三角波、锯齿波和方波
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        AJMP    SCANKEY    ;每扫描一遍显示器就扫描一次键盘
TM1:    ADD     A,#DBUF
        MOV     R0,A
        MOV     A,@R0
        ADD     A,#2
        MOVC    A,@A+PC
        SJMP    TM2
DB      01H,4FH,12H,06H,4CH,24H,20H,0FH,00H,04H,0FFH      ;0-9 ,"灭"
TM2:    MOV     DPTR,#PRA
        MOVX    @DPTR,A        ;输出段码
        MOV     A,DSP
        ADD     A,#2
        MOVC    A,@A+PC
        SJMP    TM3
DB      01H,02H,04H,08H,10H,20H
TM3:    MOV     DPTR,#PRC
        MOVX    @DPTR,A        ;输出位码
        AJMP    TM1EXIT
;----------------扫描键盘---------------
SCANKEY:MOV     P1,#0FH
        MOV     A,P1
        CPL     A
        ANL     A,#0FH
        JZ      NOKEY         ;无按键,转
        JNB     KEYOK,SKE     ;已响应,转
        JBC     KEYX,SKE      ;未消抖,转,并标志已消抖
        MOV     R6,#0FFH      ;求行码
        INC     R6
        RRC     A
        JNC     $-2
        MOV     P1,#0F0H
        MOV     A,P1
        CPL     A
        ANL     A,#0F0H
        JZ      NOKEY
        MOV     R7,#0FFH        ;求列码
        INC     R7
        RRC     A
        JNB     ACC.3,$-2
        MOV     A,R6            ;求按键编号
        MOV     B,#4
        MUL     AB
        ADD     A,R7
        ADD     A,#2
        MOVC    A,@A+PC          ;查键码
        SJMP    SK1
DB      07H,08H,09H,0CH         ;7, 8, 9, 波形
DB      04H,05H,06H,0DH         ;4, 5, 6, 电压
DB      01H,02H,03H,0EH         ;1, 2, 3, 频率
DB      00H,0AH,0BH,0FH         ;0,清0, EN,撤消
SK1:    MOV     KEYC,A
        ACALL   JIESHI           ;解释按键
        CLR     KEYOK            ;标志按键已响应
        MOV     DPTR,#PRB        ;状态指示
        MOV     A,STATE
        CLR     ACC.7
        ADD     A,#2
        MOVC    A,@A+PC
        SJMP    SK2
DB      4,1,2,8
SK2:    MOVX    @DPTR,A

SKE:    SJMP    TM1EXIT
NOKEY:  SETB    KEYOK
        SETB    KEYX
        MOV     KEYC,#0FFH
TM1EXIT:POP     DPH
        POP     DPL
        POP     PSW
        POP     ACC
        RETI

;***************************解释按键************************
JIESHI:
        MOV     A,KEYC
        CLR     C
        SUBB    A,#0AH
        JNC     JSF               ;功能键
;-----------数字键处理------------
        MOV     DPTR,#JSN
        MOV     A,STATE
        CLR     ACC.7
        RL      A
        JMP     @A+DPTR
JSN:    AJMP    JSN0
        AJMP    JSN1
        AJMP    JSN2
        AJMP    JSN3
;输出状态
JSN0:   RET
;设置波形状态
JSN1:   MOV     A,KEYC        ; KEYC>=4,无效
        CLR     C
        SUBB    A,#4
        JNC     JSN1E
        MOV     R0,#DBUF
        MOV     @R0,KEYC
JSN1E:  RET
;设置电压状态
JSN2:   MOV     A,KEYC       ;
        CLR     C
        SUBB    A,#6
        JNC     JSN2E         ;KEYC>=6,无效
        MOV     R0,#DBUF+1
        MOV     @R0,KEYC
JSN2E:  RET
;设置频率状态
JSN3: 	MOV	A,KEYC
	ACALL	RINA            ;从右边插入
	PUSH	ACC             ;暂存移出值
	ACALL	RDF             ;读频率
	ACALL	HEFA            ;检测是否合法
	JC	JSN31
	POP	ACC             ;不合法,恢复
	ACALL	LINA
	RET
JSN31:  ACALL   MIELING         ;灭0处理
	POP	ACC
  	RET
;-----------功能键处理--------------
JSF:    MOV      DPTR,#WK
        RL       A
        JMP      @A+DPTR
WK:     AJMP     WKA
        AJMP     WKB
        AJMP     WKC
        AJMP     WKD
        AJMP     WKE
        AJMP     WKF
;-----------清0键(全部清0)----------
WKA:    CLR       OUT
        MOV       R0,#DBUF
        MOV       R2,#6
WKA1:   MOV       @R0,#0
        INC       R0
        DJNZ      R2,WKA1
        ACALL     MIELING
        RET
;-----------ENTER键----------
WKB:    MOV       STATE,#0
        SETB      OUT
WKBE:   CLR       TR1
        SETB      EX1
        MOV       P1,#0F0H
        RET
;-----------设置波形键---------
WKC:    MOV       STATE,#1     ;进入设置波形状态
        RET
;----------设置电压最大值键--------
WKD:    MOV       STATE,#2     ;进入设置最大值状态
        RET
;----------设置频率键----------
WKE:    MOV       R0,#DBUF+2
        MOV       @R0,#0
        INC       R0
        CJNE      R0,#DBUF+6,$-3
        ACALL     MIELING
        MOV       STATE,#3     ;进入设置频率状态
        RET
;----------撤消键(删除最后一位)------------
WKF:    MOV       A,STATE
        CLR       ACC.7
        JNZ       WKF1
        RET
WKF1:   CJNE      A,#1,WKF2
        MOV       R0,#DBUF
        MOV       @R0,#0
        RET
WKF2:   CJNE      A,#2,WKF3
        MOV       R0,#DBUF+1
        MOV       @R0,#0
        RET
WKF3:   MOV       A,#0AH
        ACALL     LINA
        ACALL     MIELING
        RET
;__________________按键解释完毕________________
;******************灭0处理*******************
MIELING:MOV     R2,#3
        MOV     R0,#DBUF+2
ML1:    MOV     A,@R0
        JZ      ML2
        CJNE    @R0,#0AH,ML3
ML2:    MOV     @R0,#0AH
        INC     R0
        DJNZ    R2,ML1
ML3:    MOV     R0,#DBUF+5
        CJNE    @R0,#0AH,MLE
        MOV     @R0,#0
MLE:    RET
;*****************读显存低4位(即频率)***************
;以双字节十六进制格式返回,高字节在R6中,低字节在R7中.
RDF:    MOV       R0,#DBUF+5
        MOV       A,@R0
        CJNE      A,#0AH,$+4
        CLR       A
        MOV       R7,A
        DEC       R0
        MOV       A,@R0
        CJNE      A,#0AH,$+4
        CLR       A
        MOV       B,#10
        MUL       AB
        ADD       A,R7
        MOV       R7,A
        DEC       R0
        MOV       A,@R0
        CJNE      A,#0AH,$+4
        CLR       A
        MOV       R6,A
        DEC       R0
        MOV       A,@R0
        CJNE      A,#0AH,$+4
        CLR       A
        MOV       B,#10
        MUL       AB
        ADD       A,R6
        MOV       B,#100
        MUL       AB
        ADD       A,R7
        MOV       R7,A
        CLR       A
        ADDC      A,B
        MOV       R6,A
	RET
;**************右插入**************
RINA:   MOV     R0,#DBUF+5
        MOV     R2,#4
RINA1:  XCH     A,@R0
        DEC     R0
        DJNZ    R2,RINA1
	RET
;**************左插入**************
LINA:   MOV	R0,#DBUF+2
	MOV	R2,#4
LINA1:	XCH	A,@R0
	INC	R0
	DJNZ	R2,LINA1
	RET
;******判断输入的频率是否合法*****
;C=1时合法
HEFA:
        SETB    C             ;R6R7-1000-1
	MOV	A,R7
	SUBB	A,#LOW(1000)
	MOV	A,R6
	SUBB	A,#HIGH(1000)
	RET
;---------------双字节减法------------------
;R4R5=R4R5-R2R3
DSUB:   CLR    C
        MOV    A,R5
        SUBB   A,R3
        MOV    R5,A
        MOV    A,R4
        SUBB   A,R2
        MOV    R4,A
        RET
; (7)  标号:  DIVD    功能:双字节二进制无符号数除法

;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7    堆栈需求:  2字节

DIVD:	CLR	C	;比较被除数和除数
	MOV	A,R3
	SUBB	A,R7
	MOV	A,R2
	SUBB	A,R6
	JC	DVD1
	SETB	OV	;溢出
	RET
DVD1:	MOV	B,#10H	;计算双字节商
DVD2:	CLR	C	;部分商和余数同时左移一位
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	XCH	A,R2
	RLC	A
	XCH	A,R2
	MOV	F0,C	;保存溢出位
	CLR	C
	SUBB	A,R7	;计算(R2R3-R6R7)
	MOV	R1,A
	MOV	A,R2
	SUBB	A,R6
	ANL	C,/F0	;结果判断
	JC	DVD3
	MOV	R2,A	;够减,存放新的余数
	MOV	A,R1
	MOV	R3,A
	INC	R5	;商的低位置一
DVD3:	DJNZ	B,DVD2	;计算完十六位商(R4R5)
	MOV	A,R4	;将商移到R2R3中
	MOV	R2,A
	MOV	A,R5
	MOV	R3,A
	CLR	OV	;设立成功标志
	RET
;*****************************************************
        END

⌨️ 快捷键说明

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