📄 pcall2.asm
字号:
SWAP A
MOV R4,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ORL A,R4
INC R1
MOV @R1,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
SWAP A
INC R1
MOV @R1,A
INC R1
INC R1
INC R0
NOP
NOP
DJNZ R3,TELDATA_5
MOV A,POC_NUM ; INFORMATION POCSAG DATA
SWAP A
ANL A,#0FH
DEC A
MOV R3,A ; POCSAG INFORMATION DATA NUMBER
MOV A,R7
MOV R0,A
MOV R3,#02H ;限制转换2个信息位
TELDATA_6: MOV ACC,R3
PUSH ACC
MOV A,R0
ADD A,#04H
PUSH ACC
SETB C
NOP
NOP
LCALL POCSAG_BUILD
NOP
NOP
POP ACC
MOV R0,A
POP ACC
MOV R3,ACC
NOP
NOP
DJNZ R3,TELDATA_6
;========================== TEMP SEND ====================================
MOV A,POC_NUM
ANL A,#0F0H
SWAP A
RL A
RL A
ANL A,#03CH
MOV R5,A
MOV ACC,POC_NUM
NOP
NOP
JB ACC.3,SEND_99XX
WAIT_10XXXX:
NOP
NOP
JB SYS_STATUS.0,WAIT_10XXXX
SETB SYS_STATUS.0
CLR SYS_STATUS.1
NOP
NOP
LCALL INIT_POCSAG
NOP
MOV A,POC_NUM
RL A
RL A
RL A
ANL A,#038H
ADD A,#POCSAG_BUFFER
MOV R0,A
MOV A,R5
MOV R2,A
MOV A,R7
MOV R1,A
MOVE_10XXXX: MOV A,@R1
MOV @R0,A
INC R0
INC R1
NOP
NOP
DJNZ R2,MOVE_10XXXX
MOV POC_NUM,#00H
SETB C
NOP
NOP
RET
NOP
SEND_99XX:
NOP
NOP
JB SYS_STATUS.0,SEND_99XX
SETB SYS_STATUS.0
SETB SYS_STATUS.1
NOP
NOP
LCALL INIT_POCSAG
NOP
MOV R3,#05H
MOV R4,#08H ; ZHENG_HAO
MOVE_99XX_1: MOV A,R4
ADD A,#POCSAG_BUFFER
MOV R0,A
MOV A,R5
MOV R2,A
MOV A,R7
MOV R1,A
MOVE_99XX_11: MOV A,@R1
MOV @R0,A
INC R0
INC R1
NOP
NOP
DJNZ R2,MOVE_99XX_11
MOV A,R4
ADD A,#018H
MOV R4,A
NOP
NOP
DJNZ R3,MOVE_99XX_1
NOP
WAIT_99XX_2:
NOP
NOP
JB SYS_STATUS.0,WAIT_99XX_2
SETB SYS_STATUS.0
CLR SYS_STATUS.1
NOP
NOP
LCALL INIT_POCSAG
NOP
MOV R3,#03H
MOV R4,#00H ; ZHENG_HAO
MOVE_99XX_2: MOV A,R4
ADD A,#POCSAG_BUFFER
MOV R0,A
MOV A,R5
MOV R2,A
MOV A,R7
MOV R1,A
MOVE_99XX_21: MOV A,@R1
MOV @R0,A
INC R0
INC R1
NOP
NOP
DJNZ R2,MOVE_99XX_21
MOV A,R4
ADD A,#018H
MOV R4,A
NOP
NOP
DJNZ R3,MOVE_99XX_2
MOV POC_NUM,#00H
SETB C
NOP
NOP
RET
NOP
INFOR_BCD: DB 000H,008H,004H,00CH,002H,00AH,006H,00EH,001H,009H,005H,00DH,003H,00BH,007H,00FH
;****************** TEL LINE DATA PROGRAM PROGRAM END ***********************
;*********************************************************************
; Build Pocsag coding programe
;
; Input : ACC Start POC_POINTER 3 BYTE 20 BIT
; C C=0 Address
; C=1 Information
;
; Output : Start POC_POINTER 4 BYTE 32 BIT
;
; MACHINE CYCPENS ( LCALL ): MAX = 554 , MIN = 382
; AFFECTED : R0 - R6 , PSW , ACC
;*********************************************************************
POCSAG_BUILD: MOV R1,A ; SAVE ACC
MOV R2,#15H ; TOTAL NEED MOVE 21 BIT
MOV R0,A
MOV A,@R0
RRC A
MOV R3,A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV R4,A
MOV @R0,A
INC R0
MOV A,@R0
ANL A,#0F0H
RRC A
MOV R5,A
MOV @R0,A
MOVE_CONT: MOV ACC,R3
JNB ACC.7,MOVE_CONT1
MOV A,R3
XRL A,#0EDH
MOV R3,A
MOV A,R4
XRL A,#020H
MOV R4,A
MOVE_CONT1: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DJNZ R2,MOVE_CONT
MOVE_END: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RRC A
SWAP A
ANL A,#0EH
MOV R6,A
MOV A,R3
SWAP A
ANL A,#0F0H
ORL A,R6
MOV R6,A
MOV A,R3
SWAP A
ANL A,#07H
MOV R5,A
CLR F0
MOV A,R1 ; POCSAG START POINTER
MOV R0,A
MOV A,@R0
JNB P,POCSAG_1
CPL F0
POCSAG_1:
INC R0
MOV A,@R0
JNB P,POCSAG_2
CPL F0
POCSAG_2:
INC R0
MOV A,@R0
ANL A,#0F8H
ORL A,R5
MOV @R0,A
JNB P,POCSAG_3
CPL F0
POCSAG_3:
MOV A,R6
CLR C
RR A
JNB P,POCSAG_4
CPL F0
POCSAG_4:
MOV C,F0
RLC A
INC R0
MOV @R0,A
NOP
NOP
POC_BUL_END: RET
;*****************POCSAG BUILD PRORAM END*********************
;****************************************************************************
;
; POCSAG SEND START
;
;****************************************************************************
POC_START:
CLR SYS_STATUS.7 ; COMMAND CLOSE
SETB SYS_STATUS.1
JB SYS_STATUS.0,POC_START_1
NOP
NOP
NOP
SETB SEND_PTT ; SEND ENABPEN
CLR LED2
NOP
NOP
LCALL DELAY_10MS
NOP
SETB SEND_PTT ; SEND ENABPEN
CLR LED2
NOP
NOP
LCALL XREDI ;控制PLL
NOP
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
NOP
LCALL DELAY_10MS
SETB SEND_PTT ; SEND ENABPEN
CLR LED2
NOP
CLR SYS_STATUS.1
MOV SEND_BYTE,#00H
MOV SEND_BIT_NUM,#00H
MOV SEND_BYTE_NUM,#80H ;此处设定的是前置码的个数
MOV SEND_STRU,#00H
;SETB ET0 ;此处开0中断,使开始发送!
NOP
NOP
POC_START_1: RET
;***********************************************************************
;********************************************************
; 串行中断
;要接收/发送都不误
;********************************************************
S_INT:
PUSH A
PUSH PSW
CLR RS1 ;使用第1组工作寄存器
SETB RS0
NOP
NOP
JB RI,RECEIVE ;首先判断是出还是入
CLR TI
NOP
NOP
LJMP INTS_RETI
;*****************接收部分*****************
RECEIVE:
CLR RI
JB F_FIRST_DATA,LOOP1
MOV A,SBUF
CJNE A,#07EH,INTS_RETI
SETB F_FIRST_DATA
NOP
NOP
AJMP INTS_RETI
LOOP1:
JB F_SECOND_DATA,LOOP2
SETB F_SECOND_DATA
MOV A,SBUF
MOV R1,A
CLR C
CJNE A,#0FH,LOOP0 ;第2个数据是数据串的长度
LOOP0: JNC IN_ERROR ;如果接收到的长度大于16,说明数据错误
INC R1 ;R1里存放的是接收的数据的个数
MOV R0,#S_IN_DATA
LOOP2: ;正式接收数据
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R1,INTS_RETI
CLR F_FIRST_DATA ;接收完成,清标志
CLR F_SECOND_DATA
SETB F_RECE_END
NOP
NOP
AJMP INTS_RETI
IN_ERROR:
CLR F_FIRST_DATA
CLR F_SECOND_DATA
CLR F_RECE_END
INTS_RETI: NOP
POP PSW
POP A
NOP
RETI
;******************************************
;输入:CRC_COUNT(要校验的数据的个数),
; CRC_DATA(要校验的CRC数据区域的起始地址)
;USE : CRC_LOOP, A, R1
;输出: CRC_DATA(放在CRC数据区域的第一个位置)
;CRC多项式:35H
;********************************************
CRC_CAL:CLR EA
CRCZ: MOV R1,#CRC_DATA ;数据区开始的起始地址位,结果计算出来,也放在第一个数里.
CRC0:
INC R1
MOV CRC_LOOP,#08H
CRC1: MOV A,@R1
CLR C
RLC A
MOV @R1,A
MOV A,CRC_DATA
RLC A
MOV CRC_DATA,A
JNC CRC2
XRL CRC_DATA,#035H
CRC2: NOP
NOP
DJNZ CRC_LOOP,CRC1
NOP
NOP
DJNZ CRC_COUNT,CRC0
SETB EA
RET
;*******************************************
MOV_TO_CRC:
MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,MOV_TO_CRC
MOV @R0,#00H ;CRC数据区为0
RET
MOV_TO:
MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R3,MOV_TO
RET
;******************************************************************
DELAY_10MS:
MOV DELAY_TIME0,#0FFH
MOV DELAY_TIME1,#012H
DELAY_10MS_1:
NOP
NOP
DJNZ DELAY_TIME0,DELAY_10MS_1
NOP
NOP
DJNZ DELAY_TIME1,DELAY_10MS_1
NOP
NOP
RET
;********************************************
DELAY_XUS:
NOP
NOP
DJNZ DELAY_TIME0,DELAY_XUS
NOP
NOP
RET
;*************************************************************
;;***********NAME XUANG F=327.400MHz f=12.8MHz********
XREDI: MOV R4,#0FFH ;延时
MOV R6,#0FFH
NOP
NOP
DJNZ R4,$
NOP
NOP
DJNZ R6,$
CLR PDAT
CLR PCLK
CLR PEN
MOV R3,#8 ;写参数分频值,8401H(512,25K)
MOV A,#84H
LP10: RLC A
MOV PDAT,C
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
DJNZ R3,LP10
MOV R3,#8;
MOV A,#1H
LP12: RLC A
MOV PDAT,C
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
DJNZ R3,LP12
SETB PEN
NOP
NOP
NOP
CLR PEN
NOP
NOP
NOP
XVCODI: CLR PDAT ;写VCO分频值 323.050MHz
NOP
NOP
NOP
NOP
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
NOP
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
NOP
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
MOV R3,#8
MOV A,#0CCH ;写N参数 (数字机CB)
LP20: RLC A
MOV PDAT,C
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
DJNZ R3,LP20
MOV R3,#8
MOV A,#28H ;写A参数 (数字机用7)
RL A
LP22: RLC A
MOV PDAT,C
SETB PCLK
NOP
NOP
NOP
CLR PCLK
NOP
NOP
DJNZ R3,LP22
SETB PEN
NOP
NOP
NOP
CLR PEN
NOP
NOP
RET
NOP
NOP
;********************************************************
TEST:
PUSH A
PUSH PSW
SETB SEND_PTT
CLR LED2
NOP
NOP
NOP
NOP
LCALL XREDI
CLR LED2
CALL DELAY_10MS
CALL DELAY_10MS
SETB LED2
TEST_LOOP:
MOV WDRST,#01EH ;WDT
MOV WDRST,#0E1H
JNB P1.4,TEST_LOOP ;P1.4为1的时候退出
CLR SEND_PTT
SETB LED2
POP PSW
POP A
RETI
;*********************************************************
ORG 0F80H
ERROR_P:
NOP
NOP
LJMP SYS_START
;*********************************************************
ORG 0FB0H
DB 00H
DB 00
DB 00
DB 00 ;前4个是群呼地址的低4位
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -