📄 signal_jj_xz.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 ;给发送空间赋标志值以及初值(每次发4个字节)
NEXT1: MOV R0,#80H
MOV @R0,#0
INC R0
DJNZ COUNT1,NEXT1
MOV R0,#80H
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
CJNE A,#0BH,MAIN_1
AJMP MS_IN
MAIN_1: CJNE A,#0CH,MAIN_2
AJMP FRE_IN
MAIN_2: CJNE A,#0DH,MAIN_3
AJMP FREZ_IN
MAIN_3: CJNE A,#0EH,MAIN_4
AJMP JIA_IN
MAIN_4: CJNE A,#0FH,MAIN
AJMP JIAN_IN
;----------------------------------------------------------------
MS_IN: ACALL MS_1
AJMP MAIN
MS_1: MOV A,#80H ;在该行从新显示'MOD?'
LCALL SEND_I
MOV DPTR,#TAB_MS
MOV COUNT,#4
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,#8BH
LCALL CHUNSHU
MOV AD2,#8AH
LCALL TRAN
RET
;----------------------------------------------------------------
JIA_IN: MOV R0,#86H
JIA_1: MOV A,@R0
CLR C
ADD A,#1
MOV @R0,A
JNC JIA_2
INC R0
SJMP JIA_1
JIA_2: MOV R0,#86H ;对加1的数据进行10进制转换
MOV DIVDLL,@R0
INC R0
MOV DIVDLH,@R0
INC R0
MOV DIVDHL,@R0
INC R0
MOV DIVDHH,@R0
CALL TO16_10
MOV R5,#8 ;将转换的数据存入48-4F中
MOV R1,#4FH
MOV R0,#FIRADD
JIALOOP:MOV A,@R0
MOV @R1,A
DEC R1
DEC R0
DJNZ R5,JIALOOP
MOV A,#0C0H
LCALL SEND_I
MOV DPTR,#TAB_FRE
MOV COUNT,#10H
LCALL QUWRD
MOV A,#0C4H
LCALL SEND_I
MOV COUNT1,#8
MOV AD4,#48H ;送10进制数据显示
LCALL QUSHU
MOV AD2,#85H
LCALL TRAN
AJMP MAIN
;----------------------------------------------------------------
JIAN_IN:MOV R0,#86H
JIAN_1: MOV A,@R0
CLR C
SUBB A,#1
MOV @R0,A
JNC JIAN_2
INC R0
SJMP JIAN_1
JIAN_2: MOV R0,#86H ;对加1的数据进行10进制转换
MOV DIVDLL,@R0
INC R0
MOV DIVDLH,@R0
INC R0
MOV DIVDHL,@R0
INC R0
MOV DIVDHH,@R0
CALL TO16_10
MOV R5,#8 ;将转换的数据存入48-4F中
MOV R1,#4FH
MOV R0,#FIRADD
JIANLOOP:MOV A,@R0
MOV @R1,A
DEC R1
DEC R0
DJNZ R5,JIANLOOP
MOV A,#0C0H
LCALL SEND_I
MOV DPTR,#TAB_FRE
MOV COUNT,#10H
LCALL QUWRD
MOV A,#0C4H
LCALL SEND_I
MOV COUNT1,#8
MOV AD4,#48H ;送10进制数据显示
LCALL QUSHU
MOV AD2,#85H
LCALL TRAN
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
;*********************16进制 to 10进制***************************
TO16_10:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -