📄 walkie_talkie.asm
字号:
.include "m64def.inc"
;公共定义
.def A=R16
.def B=R17
.EQU RXD0_POINT =$203
.EQU RXD1_OVR =$204
.EQU TXD0_TRANS_BUFFER_len = $FD
.EQU TXD0_TRANS_BUFFER = $206
.CSEG
.ORG 0000
jmp main
.org $0024
jmp RXD0_INTERRUPT;串行口0接收中断服务程序
.org $0026
reti
.org $0028
jmp RS232C_TXD0;串行口0发送中断服务程序
.org $003A
jmp TIMER3_OVF ;中断定时程序,在50ms内读通道2的最大值
.org $003C
jmp RXD1_INTERRUPT;串行口1接收中断服务程序
.org $0040
jmp RS232C_TXD1;串行口1发送中断服务程序
main:
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16
CALL u1_init0
call u1_init1
ldi a,0
sts RXD0_POINT,a
LDI A,1
STS RXD1_OVR,A
LDI R16,$f7;初始化c口;pc0为0时M7512的XD可发;pc1为0时M7512的XD可发;pc1为1时且pc0M7512的RD可收;
out DDRc,R16
LDI R16,$03
out PORTc,R16
ldi R16,$0;初始化TIMER3
STS TCCR3A,R16
ldi R16,$2;0
STS TCCR3B,R16;设置为8分频 (1/8,000,000)*8*50000=50ms 65535-50000=3CAF
ldi R16,$0
STS TCCR3C,R16
SEI
LOOP:
LDS A,RXD1_OVR
CPI A,0
BREQ CHENG_SET
JMP LOOP
CHENG_SET:
LDI R16,$f7
out DDRc,R16
LDI R16,$03
out PORTc,R16
JMP LOOP
DELAY_10mS:PUSH A
PUSH B
LDI B,100
DLY1021:LDI A,100
DLY1011:NOP
NOP
NOP
NOP
DEC A
CPI A,0
BRNE DLY1011
DEC B
CPI B,0
BRNE DLY1021
POP B
POP A
RET
RXD0_INTERRUPT:PUSH A;串行口1接收中断服务程序
IN A,SREG
PUSH A
PUSH B
PUSH R18
PUSH R19
PUSH R21
PUSH XL
PUSH XH
LDI R16,$ff;只要有从上位机收到的信号就设置mod1为0m7512处于发信号状态;同时需要将ptt拉底;
out DDRc,R16
LDI R16,$00
out PORTc,R16
LDI B,$0
LDI R18,$0
CPI R20,$FF
BREQ RXD1_INTERRUPT_OUT
CPI R20,$0
BREQ RXD1_SET
MOV R21,R20
RXD1_STATE: LDI XL,LOW(TXD0_TRANS_BUFFER)
LDI XH,HIGH(TXD0_TRANS_BUFFER)
MOV R19,R21
DEC R19
CLC
ADD XL,R19
ADC XH,R18
LD B,X+
ST X,B
DEC R21
CPI R19,$0
BRNE RXD1_STATE
RXD1_SET: LDI XL,LOW(TXD0_TRANS_BUFFER)
LDI XH,HIGH(TXD0_TRANS_BUFFER)
lds a,udr1
ST X,A
INC R20
LDS A,RATE_FLAG
INC A
STS RATE_FLAG,A
TIME_INI:LDI R16,$F8;FC
STS TCNT3H,R16
LDI R16,$17
STS TCNT3L,R16 ;TCNT3H and TCNT3L
ldi R16,$04;00000100 允许定时器3溢出中断
STS ETIMSK,R16
LDI A,1
STS RXD1_OVR,A
JMP RXD1_INTERRUPT_OUT
CHENGE_SPEED:
LDI A,0
STS RATE_FLAG,A
CPI R22,0
BREQ TIME_INI
ldi A,$68
sts ubrr1l,A
out ubrr0l,A
LDI R22,0
JMP TIME_INI
RXD1_INTERRUPT_OUT: POP XH
POP XL
POP R21
POP R19
POP R18
POP B
POP A
OUT SREG,A
POP A
RETI
RS232C_TXD1:reti
RXD1_INTERRUPT:;串行口0接收中断服务程序
PUSH A
IN A,SREG
PUSH A
PUSH B
lds a,udr1
out UDR0,A
RXD1_INTERRUPT_OUT:POP B
POP A
OUT SREG,A
POP A
RETI
RS232C_TXD0:reti
TIMER3_OVF:PUSH A
LDI A,0
STS RXD1_OVR,A
POP A
RETI
u1_init0: ;初始化串口0
push A
ldi A,$22
out ucsr0a,A;out ucsr1a,A
ldi A,$D8;(D8允许接收中断和发送中断;98是允许接收中断,禁止发送中断,接收、发送为8位数据位;)18;(18是禁止收发中断,接收、发送为8位数据位;)(d8是允许中断,接收、发送为8位数据位;)
out ucsr0b,A;out ucsr1b,A
ldi A,$03;$0;01
sts ubrr0h,A;out ubrr1h,A
ldi A,$40;34;67;$1A=38400;$67=9600;$34;$d0;$0d0;a0; (1a0= 416 600bps crystal:4MHz)($340=832 600bps 8MHz crystal)
out ubrr0l,A;out ubrr1l,A 波特率9600bps
ldi A,$06;$8e 奇偶、8位数据、1位停止
sts ucsr0c,A;out ucsr1c,A
in A,ucsr0b
ori A,$18
out UCSR0B,A ;发送允许标志
; OUT UDR0,A;
POP A
ret
u1_init1: ;初始化串口1
push A
ldi A,$22;原来是02
sts ucsr1a,A;out ucsr1a,A
ldi A,$D8;(D8允许接收中断和发送中断;98是允许接收中断,禁止发送中断,接收、发送为8位数据位;)18;(18是禁止收发中断,接收、发送为8位数据位;)(d8是允许中断,接收、发送为8位数据位;)
sts ucsr1b,A;out ucsr1b,A
ldi A,$03;$0;01
sts ubrr1h,A;out ubrr1h,A
ldi A,$40;26=38400;$68=9600;$34;$d0;$0d0;a0; (1a0= 416 600bps crystal:4MHz)($340=832 600bps 8MHz crystal)
sts ubrr1l,A;out ubrr1l,A 波特率9600bps
ldi A,$06;$8e 无奇偶、8位数据、1位停止
sts ucsr1c,A;out ucsr1c,A
LDS A,ucsr1b
ori A,$18
STS UCSR1B,A ;发送允许标志
; STS UDR1,A;
POP A
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -