📄 发射.asm
字号:
;SCA发射程序,11.0592MHZ
; 当收到"AT&T01+地址"时准备发数据 发双音*0#+3位地址 000-888 接收机关声音输出,开MODEM
; 当收到"AT&T02+地址"时数据发完 发双音*2#+3位地址 000-888 关声音输出,关MODEM
; 当收到"AT&T03+地址"时准备发语音 发双音*1#+3位地址 000-888 接收机打开声音输出,关MODEM
; 当收到"AT&T04+地址"时语音发完 发双音*3#+3位地址 000-888 关声音输出,关MODEM
; 发双音*1#+3位地址 000-888 接收机打开声音输出,关MODEM
CZRDATA EQU 30H ; 数据缓冲区首址
CZRCOUNT EQU 2FH ; 数据缓冲区长度
KEYTMP EQU 2EH ; 键值缓存
KEYTMP1 EQU 2DH ; 键值缓存
KEYDATA EQU 2CH ; 键值
DISPCOUNT EQU 2BH ;光标位置
DISPBEG EQU 2AH ;显示数据的起始地址
TIMER1 EQU 29H
TIMER2 EQU 28H
TIMER3 EQU 27H
KEYMARK BIT 20H.0 ;按键判别=0,有键
FUNCMARK BIT 20H.1 ;数据,语音判别位
GNBZ BIT 20H.2 ;按功能键未发双音前=1 ;发完后=0
ADDR EQU 26H ;分机号码
SOUND BIT P2.6 ;声音开关=1,开
MODEM BIT P2.7 ;MODEN开关
KEY1 BIT P2.0
KEY2 BIT P2.1
RS BIT P2.4 ;LCD
RW BIT P2.3 ;LCD
E BIT P2.2 ;LCD
ORG 0000H
AJMP START
ORG 000BH
LJMP READKEY
ORG 0023H
AJMP CKS
ORG 60H
START:
MOV SP,#60H
MOV TMOD,#21H ;设置T1为模式2,T0为模式1
MOV KEYTMP,#99H
MOV KEYTMP1,#99H
MOV KEYDATA,#99H
MOV CZRCOUNT,#CZRDATA
MOV DISPBEG,#CZRDATA
MOV DISPCOUNT,#0
MOV 20H,#0
MOV ADDR,#3
LCALL CLEARBUFF ;清空数据区内容
LCALL D100MS
LCALL LCDREST ;LCD初始化
MOV 20H,#0
MOV P0,#01111111B ;MT8880初始化
SETB P0.7
CLR P0.7
MOV P0,#01010000B
SETB P0.7
CLR P0.7
MOV P0,#01010000B
SETB P0.7
CLR P0.7
MOV P0,#01011000B
SETB P0.7
CLR P0.7
MOV P0,#01010000B
SETB P0.7
CLR P0.7
MOV P0,#01111111B
SETB P0.7
CLR P0.7 ;MT8880初始化完成
LCALL CRAB
MOV TH1,#0FDH
MOV TL1,#0FDH ;9600BPS
MOV TL0,#0
MOV TH0,#184 ;20MS定时
SETB EA
SETB ES ;开串口中断
SETB PS ;串口为高优先级
SETB ET0
MOV SCON,#50H ;串口1 、允许接收
SETB TR1 ;启动串口发送、 接收
SETB TR0
SETB SOUND
CLR MODEM
MOV 50H,#20H
MOV 51H,#" "
MOV 52H,#"W"
MOV 53H,#"e"
MOV 54H,#"l"
MOV 55H,#"l"
MOV 56H,#"c"
MOV 57H,#"o"
MOV 58H,#"m"
MOV 59H,#"e"
MOV 5AH,#" "
MOV 5BH,#" "
MOV 5CH,#" "
MOV 5DH,#" "
MOV 5EH,#" "
MOV 5FH,#" "
LCALL LCDXSL
LCALL LCDXSH
MOV A,#0CH ;显示方式:关光标,开显示,不闪烁
ACALL WAIT
AJMP $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 键盘处理
READKEY:
PUSH ACC
PUSH 00H
PUSH 07H
MOV TL0,#0
MOV TH0,#184 ;20MS定时
SETB KEY1
SETB KEY2
ORL P1,#0FFH
CLR KEY2
MOV A,P1
MOV R0,A
SETB KEY2
CLR KEY1
MOV A,P1
SETB KEY1
MOV R1,#0
MOV R2,#0
CJNE A,#0FFH,READKEY2
CJNE R0,#0FFH,READKEY1
LJMP READKEY5 ;说明键已抬起
READKEY1: MOV R2,#8
MOV A,R0
READKEY2: RRC A
INC R1
JC READKEY2
MOV A,R1
ADD A,R2
MOV KEYTMP,A
READKEY3: CJNE A,KEYTMP1,READKEY4 ;检测两次按键是否相同
MOV KEYDATA,A ;两次按键相同
LJMP READKEY20
READKEY4: MOV KEYTMP1,A ;两次按键不同
LJMP READKEY20
READKEY5: MOV A,KEYDATA
CJNE A,#99H,READKEY6
MOV KEYTMP1,#99H
LJMP READKEY20
READKEY6: LCALL KEYPROCE
MOV KEYDATA,#99H
MOV KEYTMP1,#99H
READKEY20: POP 07H
POP 00H
POP ACC
RETI
;***********************************************
;键盘处理程序
KEYPROCE:
PUSH ACC
PUSH 00H
PUSH 07H
MOV A,KEYDATA
DEC A
CLR C
RLC A ;A*2
MOV DPTR,#PROCEMAIN
JMP @A+DPTR
PROCEMAIN: AJMP PROCE01
AJMP PROCE02
AJMP PROCE03
AJMP PROCE04
AJMP PROCE05
AJMP PROCE06
AJMP PROCE07
AJMP PROCE08
AJMP PROCE09
AJMP PROCE10
AJMP PROCE11
AJMP PROCE12
AJMP PROCE13
AJMP PROCE14
AJMP PROCE15
PROCE01: jb GNBZ,PROCE012
JB KEYMARK,PROCE011
SETB KEYMARK
MOV 5FH,#";"
MOV 5EH,#":"
MOV 5DH,#"."
MOV 5CH,#","
MOV 5BH,#"1"
LCALL LCDXSH
LJMP PROCE_END
PROCE011: CLR KEYMARK
MOV A,5BH
MOV R0,CZRCOUNT
MOV @R0,A
LCALL TO_BUFF1 ;计算新页首地址,并更新显示区内容
LCALL CLEARH
LCALL LCDXSL
MOV A,#0EH ;显示方式:开光标,开显示,不闪烁
ACALL WAIT
INC CZRCOUNT
LJMP PROCE_END
PROCE012: mov addr,#1
MOV 5BH,#"1"
PROCE012a: MOV 5FH,#" "
MOV 5EH,#" "
MOV 5DH,#" "
MOV 5CH,#" "
LCALL LCDXSH
JB FUNCMARK,PROCE013
LCALL SENDSJ
clr gnbz
LJMP PROCE_END
PROCE013: LCALL SENDYY
clr gnbz
LJMP PROCE_END
PROCE022: mov addr,#2
MOV 5BH,#"2"
ljmp PROCE012a
PROCE02: jb GNBZ,PROCE022
JB KEYMARK,PROCE021
SETB KEYMARK
MOV 5FH,#20H
MOV 5EH,#"C"
MOV 5DH,#"B"
MOV 5CH,#"A"
MOV 5BH,#"2"
LCALL LCDXSH
LJMP PROCE_END
PROCE021: CLR KEYMARK
MOV A,5CH
MOV R0,CZRCOUNT
MOV @R0,A
LCALL TO_BUFF1 ;计算新页首地址,并更新显示区内容
LCALL CLEARH
LCALL LCDXSL
MOV A,#0EH ;显示方式:开光标,开显示,不闪烁
ACALL WAIT
INC CZRCOUNT
LJMP PROCE_END
PROCE032: mov addr,#3
MOV 5BH,#"3"
ljmp PROCE012a
PROCE03: jb GNBZ,PROCE032
JB KEYMARK,PROCE031
SETB KEYMARK
MOV 5FH,#20H
MOV 5EH,#"F"
MOV 5DH,#"E"
MOV 5CH,#"D"
MOV 5BH,#"3"
LCALL LCDXSH
LJMP PROCE_END
PROCE031: CLR KEYMARK
MOV A,5DH
MOV R0,CZRCOUNT
MOV @R0,A
LCALL TO_BUFF1 ;计算新页首地址,并更新显示区内容
LCALL CLEARH
LCALL LCDXSL
MOV A,#0EH ;显示方式:开光标,开显示,不闪烁
ACALL WAIT
INC CZRCOUNT
LJMP PROCE_END
PROCE042: mov addr,#4
MOV 5BH,#"4"
ljmp PROCE012a
PROCE04: jb GNBZ,PROCE042
JB KEYMARK,PROCE041
SETB KEYMARK
MOV 5FH,#20H
MOV 5EH,#"I"
MOV 5DH,#"H"
MOV 5CH,#"G"
MOV 5BH,#"4"
LCALL LCDXSH
LJMP PROCE_END
PROCE041: CLR KEYMARK
MOV A,5EH
MOV R0,CZRCOUNT
MOV @R0,A
LCALL TO_BUFF1 ;计算新页首地址,并更新显示区内容
LCALL CLEARH
LCALL LCDXSL
MOV A,#0EH ;显示方式:开光标,开显示,不闪烁
ACALL WAIT
INC CZRCOUNT
LJMP PROCE_END
PROCE052: mov addr,#5
MOV 5BH,#"5"
ljmp PROCE012a
PROCE05: jb GNBZ,PROCE052
JB KEYMARK,PROCE051
SETB KEYMARK
MOV 5FH,#20H
MOV 5EH,#"L"
MOV 5DH,#"K"
MOV 5CH,#"J"
MOV 5BH,#"5"
LCALL LCDXSH
LJMP PROCE_END
PROCE051: CLR KEYMARK
MOV A,5FH
MOV R0,CZRCOUNT
MOV @R0,A
LCALL TO_BUFF1 ;计算新页首地址,并更新显示区内容
LCALL CLEARH
LCALL LCDXSL
MOV A,#0EH ;显示方式:开光标,开显示,不闪烁
ACALL WAIT
INC CZRCOUNT
LJMP PROCE_END
PROCE062: mov addr,#6
MOV 5BH,#"6"
ljmp PROCE012a
PROCE06: jb GNBZ,PROCE062
JB KEYMARK,PROCE061
SETB KEYMARK
MOV 5FH,#20H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -