📄 signal.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 + -