📄 485_a.s43
字号:
;------------------------------------------------------------------------------
;文件名称:
; 485_a.s43
;文件说明:
; 用于两个对等的实验板通过485接口进行通讯,本方发送的
; 数据现在在对方的LED上,实验使用波特率为9600
;------------------------------------------------------------------------------
#include "msp430x44x.h"
;------------------------------------------------------------------------------
; 定义数据
;------------------------------------------------------------------------------
Receive_Buf equ 200H ;485接收缓冲区
Send_Buf equ 201H ;485发送缓冲区
R_Flag equ 202H ;接收到数据标识
LED_Buf equ 203H ;LED显示数据缓存,共六个字节
LED_CTRL equ 209H ;LED显示位控制
KEY_Pressed equ 20AH ;按键是否按下
KEY_Val equ 20BH ;键值
KEY_Flag equ 20CH ;键值是否可以读取
;------------------------------------------------------------------------------
ORG 08000h ; 程序起始位置
;------------------------------------------------------------------------------
RESET mov.w #0600h,SP ; 初始化堆栈
main:
push.w R10
mov.w #0x5A80,&WDTCTL ;关看门狗
call #init_Keyboard ;初始化键盘
call #init_LED ;初始化LED
call #init_BT ;初始化Basic Timer
call #init_485 ;初始化485
eint ;开中断
MainLoop call #key_Event ;检测键盘
cmp.b #0x1,&KEY_Flag ;如果有键值可读取
jne T12
mov.b &KEY_Val,&Send_Buf
call #rs485_SendData ;发送数据
clr.b &KEY_Flag ;清除键值标识
T12 cmp.b #0x1,&R_Flag ;是否收到数据
jnc MainLoop
clr.b R10
T14 cmp.b #0x5,R10 ;LED_Buf的数据移动
jc T13
mov.b R10,R14
and.w #0xFF,R14
mov.w #LED_Buf,R15
mov.b R10,R12
and.w #0xFF,R12
add.w R12,R15
mov.b 0x1(R15),LED_Buf(R14)
inc.b R10
jmp T14
T13 push.b R14
mov.b #0x05,R14
mov.b &Receive_Buf,LED_Buf(R14) ;把收到的数据放到LED_Buf[5]
pop.b R14
clr.b &R_Flag ;清除收到数据标识
jmp T12
;------------------------------------------------------------------------------
; 初始化Basic Timer
;------------------------------------------------------------------------------
init_BT:
mov.b #0x16,&BTCTL
bis.b #0x80,&IE2
ret
;-------------------------------------------------------------------------------
; Basic timer的中断函数
;-------------------------------------------------------------------------------
BT_Interrupt:
push.w R13 ;保存寄存器
push.w R12 ;
push.w R15 ;
push.w R14 ;
call #led_Display ;LED显示
pop.w R14 ;
pop.w R15 ;寄存器值出栈
pop.w R12
pop.w R13
reti
;------------------------------------------------------------------------------
; 移位操作
;------------------------------------------------------------------------------
Shift_L:
tst.b R14
jeq EXIT_S
SHIFT rla.w R12
dec.b R14
jne SHIFT
EXIT_S ret
;------------------------------------------------------------------------------
; 硬件乘法器操作
;------------------------------------------------------------------------------
H_Mul:
push.w SR
dint
nop
mov.w R12,&MPY
mov.w R14,&OP2
mov.w &RESLO,R12
mov.w &RESHI,R13
reti
;------------------------------------------------------------------------------
; 初始化RS485
;------------------------------------------------------------------------------
init_485:
bic.b #0x40,&FLL_CTL0 ;
bis.b #0x1,&U0CTL ;
bis.b #0x10,&U0CTL ;8-bit 字符
bis.b #0x34,&FLL_CTL1 ;开启第二个振荡器
CLEAR_F bic.b #0x2,&IFG1 ;清除OSCFault标识
mov.b #0xFF,R14 ;
T1 cmp.b #0x1,R14 ;
jnc T2
add.b #0xFF,R14
jmp T1
T2 bit.b #0x8,&FLL_CTL0 ;检测第二个振荡器是否正常工作
jc CLEAR_F ;
bis.b #0x1,&U0CTL ;
bis.b #0x10,&U0CTL ;
mov.b #0x30,&U0TCTL ;uclk=smclk
mov.b #0xA0,&U0BR0 ;在4MHz下进行9600波特率通讯
mov.b #0x1,&U0BR1 ;
mov.b #0x5E,&U0MCTL ;
bic.b #0x1,&U0CTL ;
bis.b #0xC0,&ME1
bis.b #0x40,&IE1 ;使能接收
clr.b &IFG1
bis.b #0x30,&P2SEL ;设置TX,RX
and.b #0xCF,&P2DIR
bis.b #0x10,&P2DIR
clr.b &Receive_Buf ;清零接收缓冲
clr.b &Send_Buf ;清零发送缓冲
bis.b #0x4,&P4DIR ;
bic.b #0x4,&P4SEL ;
bic.b #0x4,&P4OUT ;
ret
;------------------------------------------------------------------------------
; 发送数据
;------------------------------------------------------------------------------
rs485_SendData:
bis.b #0x4,&P4OUT ;使能发送
mov.b &Send_Buf,&U0TXBUF
T3 bit.b #0x1,&U0TCTL
jnc T3
bic.b #0x4,&P4OUT ;禁止发送
ret
;------------------------------------------------------------------------------
; 接收数据
;------------------------------------------------------------------------------
data_Receive:
mov.b &U0RXBUF,&Receive_Buf
mov.b #0x1,&R_Flag
reti
;------------------------------------------------------------------------------
; 初始化LED
;------------------------------------------------------------------------------
init_LED:
mov.b #0xFF,&P3DIR ;设置P3DIR
clr.b &P3OUT ;
bis.b #0x3,&P4DIR ;
and.b #0xFC,&P4OUT ;
clr.b &LED_CTRL ;
clr.b R14 ;
T4 cmp.b #0x6,R14 ;
jc EXIT_I ;
mov.b R14,R15 ; 初始化 LED_Buf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -