📄 数控信号发生器.asm
字号:
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 + -