📄 232_a.s43
字号:
;------------------------------------------------------------------------------
;文件名称:
; 232_a.s43
;文件说明:
; 用于两个对等的实验板通过232接口进行通讯,本方通过行列扫描键盘发送的
; 数据现在在对方的LED上,波特率使用9600
;------------------------------------------------------------------------------
#include "msp430x44x.h"
;------------------------------------------------------------------------------
; 定义数据
;------------------------------------------------------------------------------
Receive_Buf equ 200H ;232接收缓冲区
Send_Buf equ 201H ;232发送缓冲区
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_232 ;初始化232
eint ;开中断
MainLoop call #key_Event ;检测键盘
cmp.b #0x1,&KEY_Flag ;如果有键值可读取
jne T12
mov.b &KEY_Val,&Send_Buf
call #rs232_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 ; 初始化BT
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 ; R12,R13返回数据
mov.w &RESHI,R13 ;
reti
;------------------------------------------------------------------------------
; 初始化RS232
;------------------------------------------------------------------------------
init_232:
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 ;清零发送缓冲
ret
;------------------------------------------------------------------------------
; 发送数据
;------------------------------------------------------------------------------
rs232_SendData:
mov.b &Send_Buf,&U0TXBUF
T3 bit.b #0x1,&U0TCTL ; 是否发送成功了?
jnc T3
ret
;------------------------------------------------------------------------------
; 接收数据
;------------------------------------------------------------------------------
data_Receive:
mov.b &U0RXBUF,&Receive_Buf ; 接受数据
mov.b #0x1,&R_Flag ; 设置标识
reti
;------------------------------------------------------------------------------
; 初始化LED
;------------------------------------------------------------------------------
init_LED:
mov.b #0xFF,&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
and.w #0xFF,R15 ;
clr.b LED_Buf(R15) ;
inc.b R14 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -