📄 signal_final.asm
字号:
MOV A,COUNT1
CJNE A,COUNT3,DATA3
DATA2: MOV A,#0CH ;关光标
LCALL SEND_I
RET
;*********************16进制 to 10进制***************************
TO16_10:
MOV DIVDL,#10
MOV DIVDH,#0
MOV R4,#8
MOV R0,#FIRADD
NEXT: CALL DIVD
MOV @R0,TEMPL
DEC R0
DJNZ R4,NEXT
RET
DIVD: PUSH ACC
PUSH B
MOV A,DIVDH ;判除数是否为零
ORL A,DIVDL
JNZ DIVD0
SETB OV ;除数为零,置溢出标志
POP B
POP ACC
RET
DIVD0: MOV TEMPL,#00H ;除数不为零,进行运算
MOV TEMPH,#00H
MOV B,#20H ;置循环次数
DIVD1: CLR C ;进位位、余数单元和
MOV A,DIVDLL ;被除数单元全体逐个
RLC A ;向左循环移位
MOV DIVDLL,A
MOV A,DIVDLH
RLC A
MOV DIVDLH,A
MOV A,DIVDHL
RLC A
MOV DIVDHL,A
MOV A,DIVDHH
RLC A
MOV DIVDHH,A
MOV A,TEMPL
RLC A
MOV TEMPL,A
xCH A,TEMPH
RLC A
xCH A,TEMPH
MOV F0,C ;保存进位位
CLR C
SUBB A,DIVDL ;用余数减去除数
MOV R7,A
MOV A,TEMPH
SUBB A,DIVDH
ANL C,/F0 ;判断是否够减
JC DIVD2 ;不够减,移下一位
MOV TEMPL,R7 ;够减,刷新余数单元
MOV TEMPH,A
INC DIVDLL ;商上1
DIVD2: DJNZ B,DIVD1
CLR OV
POP B
POP ACC
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,#5 ;发送4个字节的数据
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
ACALL DELAY
ACALL DELAY
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: DEC COUNT1 ;带消除高位为0的显示
QU1: MOV R0,AD4
MOV A,@R0
JNZ QU2
INC AD4
DJNZ COUNT1,QU1
QU2: INC COUNT1
QU3: MOV R0,AD4
MOV A,@R0
ADD A,#30H
LCALL SEND_D
INC AD4
DJNZ COUNT1,QU3
RET
;*************************LCM初始化*******************************************
INIT:
MOV A,#38H ;设置8 位格式,2行,5*7*
LCALL SEND_I
MOV A,#06H ;设定输入方式,增量不移位
LCALL SEND_I
MOV A,#0CH ;开显示,关光标,不闪烁
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 ' ASK '
TAB_PSK: DB ' PSK '
TAB_FSK: DB ' FSK '
TAB_FB: DB ' FB '
TAB_SJB: DB ' SJB '
TAB_MS: DB 'MOD? '
TAB_FRE: DB 'FRE : '
TAB_FREZ:DB 'FREZ: '
TAB: DB ' '
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -