📄 数字频率计.asm
字号:
ORG 0000H
AJMP BEGIN
ORG 0003H
AJMP START
ORG 0030H
BEGIN: MOV 10H,#0
MOV 11H,#0
MOV 12H,#0
MOV 13H,#0
MOV 14H,#0
MOV 20H,#02H ;位控清零
MOV DPTR,#8003H
MOV A,#80H
MOVX @DPTR,A
MOV R1,#30H
MOV SP,#50H ;堆栈初试化
MOV TMOD,#01H ;计数器定时方式1
MOV TH0,#0
MOV TL0,#0
MOV TCON,#01H ;外中断int0,负边沿出触发
SETB EA ;开所有中断
RETURN: ACALL SCAN ;键盘扫描
CJNE A,#0FFH,NEXT ;如果有键按下则转移
JNB 00H,RETURN ;当00H中为0时动态显示响应!
MOV @R1,#0E0H ;动态显示数据显示输入时由右向左显示频率
MOV A,10H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,#0D0H
MOV A,11H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1, #0B0H
MOV A,12H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV @R1,#70H
MOV A,13H
XCHD A,@R1
MOV DPTR,#6000H
MOV A,@R1
MOVX @DPTR,A
MOV A,#0F0H
MOV DPTR,#6000H
MOVX @DPTR,A
MOV A,14H
ACALL TEXT
MOV A,R0
MOV DPTR,#8000H
MOVX @DPTR,A
SJMP RETURN
NEXT: CJNE A,#00H,NEXT1 ;判断键型
LCALL DELAY200MS ;延时以待键盘反应
JB 00H,TT1 ;开动态显示
SETB 00H
SETB EX0
NEXT1: AJMP RETURN ;继续扫描
TT1: CLR 00H
CLR EX0
AJMP RETURN ;继续扫描
START: SETB TR0
JB 01H,START1
CLR TR0
PUSH A
PUSH 01H
MOV A,TL0
MOV 08H,A ;数据底8位放在 08h 中
MOV A,TH0
MOV 09H,A ;数据高8位放在 09h 中
MOV A,08H ;数据底8位放在 08h 中
JNZ CONTIN
MOV A,09H
JZ LAST
CONTIN: MOV R6,#0 ;计算结果
MOV R5,#0FH
MOV R4,#42H ;用此数除所测量的数据就是频率值
MOV R3,#40H
MOV R1,08H
MOV R2,09H
MOV R7,#16
START1: JB 01H,START2 ;无实际意义,用来连接下面的START2
SETB 01H
ACALL LOOP0
MOV 0DH,R3 ;保护数据
MOV 0EH,R4 ;保护数据
MOV A,R5 ;余数乘10后再被除便得第一位小数
MOV B,#10
MUL AB
MOV R3,A
MOV R4,B
MOV A,R6
MOV B,#10
MUL AB
ADD A,R4
MOV R4,A
MOV R5,B
MOV R6,#0
MOV R7,#16
MOV R1,08H
MOV R2,09H
MOV R7,#16
ACALL LOOP0 ;利用除法将小数第一位求出
MOV 10H,R3 ;小数放到动态显示小数位显示
MOV R4,0EH ;取千位的数值
MOV R3,0DH
MOV R6,#0
MOV R5,#0
MOV R1,#0E8H ;1000为除数
MOV R2,#03H
MOV R7,#16
ACALL LOOP0
MOV 14H,R3 ;千位数字放到14H中保存先
MOV A,R6 ;接下来求百位数字
MOV R4,A
MOV A,R5
MOV R3,A
MOV R6,#0
MOV R5,#0
MOV R1,#64H
MOV R2,#0
MOV R7,#16
ACALL LOOP0
MOV 13H,R3 ;百位数字进13H中,动态显示第4位
MOV A,R5 ;接下来求个位和十位数字
MOV B,#10
DIV AB
MOV 12H,A
MOV 11H,B
MOV TH0,#0
MOV TL0,#0
SJMP LAST
START2: CLR 01H
LAST1: SJMP LAST2
LAST: SETB 01H
POP 01H
POP A
CLR IE0
LAST2: RETI
DISPLAY: MOV DPTR,#8000H
MOVX @DPTR,A
RET
TEXT: CJNE A,#00H,KK1 ; 查字型码子程序入口为A
MOV R0,#3FH ; 出口为R0
RET
KK1:CJNE A,#01H,KK2
MOV R0,#06H
RET
KK2:CJNE A,#02H,KK3
MOV R0,#5BH
RET
KK3:CJNE A,#03H,KK4
MOV R0,#4FH
RET
KK4:CJNE A,#04H,KK5
MOV R0,#66H
RET
KK5:CJNE A,#05H,KK6
MOV R0,#6DH
RET
KK6:CJNE A,#06H,KK7
MOV R0,#7DH
RET
KK7:CJNE A,#07H,KK8
MOV R0,#07H
RET
KK8:CJNE A,#08H,KK9
MOV R0,#7FH
RET
KK9:CJNE A,#09H,JJ
MOV R0,#6FH
JJ:RET
SCAN: CLR P1.0 ;键盘扫描子程序**********************************************
CLR P1.1 ; 占用资源RO,A,字型码出口为
CLR P1.2 ; 数字出口为A. 堆栈2字节
CLR P1.3 ; **********************************************
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEYSCAN ;如有键按下则转移
SJMP EXIT
KEYSCAN:ACALL DLY20MS ;延时
MOV R0,#00H ;列数用R0来记录
CLR P1.0
SETB P1.1
SETB P1.2
SETB P1.3
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,TTTT1 ;若在本行则转移
EXIT: MOV A,#0FFH ;如无键按下则推退出
SJMP DONE
TTTT1: JB P1.4,TTTT2 ;如按键不在本行则转移
MOV A,#00H ;在则将0放热A 中
AJMP TTTT5
TTTT2: JB P1.5,TTTT3 ;如按键不在本行则转移
MOV A,#01H ;在则将1放热A 中
AJMP TTTT5
TTTT3: JB P1.6,TTTT4 ;如按键不在本行则转移
MOV A,#02H ;在则将2放热A 中
AJMP TTTT5
TTTT4: JB P1.7,TTTT5 ;如按键不在本行则转移
MOV A,#03H ;在则将3放热A 中
AJMP TTTT5
TTTT5: ADD A,R0
DONE: RET
DLY20MS: MOV 22H,#70H ; 延时20毫秒子程序 *******占用资源22h,23h****************
DY1: MOV 23H,#69H
DY2: DJNZ 23H,DY2
DJNZ 22H,DY1
RET
DELAY200MS: MOV 22H,#25 ;延时0.5秒子程序 *****占用资源22h,23h,24h************
DL333: MOV 23H,#100
DL222: MOV 24H,#49
DL111: DJNZ 24H,DL111
DJNZ 23H,DL222
DJNZ 22H,DL333
RET
LOOP0: CLR C ;以下为将测量数据转换成数码管可显示的形式
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
MOV PSW.5,C
CLR C
SUBB A,R1
MOV 0FH,A ;余数送0Fh单元保护
MOV A,R6
SUBB A,R2
JB PSW.5,LOOP2
JC LOOP1
LOOP2: MOV R6,A ;余数高字节进r6
MOV R5,0FH ;低字节进r5
INC R3 ;结果进r3
LOOP1: DJNZ R7,LOOP0 ;若没完成数据处理则继续
CLR PSW.5
RET
DELAY600MS:MOV 22H,#50 ;延时0.6秒子程序 *****占用资源22h,23h,24h************
DL33: MOV 23H,#100
DL22: MOV 24H,#49
DL11: DJNZ 24H,DL11
DJNZ 23H,DL22
DJNZ 22H,DL33
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -