📄 sample.s43
字号:
;*********************************************
;遥控遥测程序VER.1
;*********************************************
#include "MSP430X14X.H"
#define DI BIT0
#define RW BIT1
#define EN BIT2
#define CS1 BIT3
#define CS2 BIT4
#define ELD BIT5
#define RST BIT6
#define LED BIT7
#define URTS BIT3
#define ADCDATA 0X0200
#define DATAPOINT 0X0210
#define FLAG 0X0212
#define TIMEDUE BIT0
#define TIMEDUE2 BIT1
#define FIRSTDATA BIT2
#define URXOVERTIME BIT3
#define TRANSFER BIT4
#define TIME0 0X0214
#define TIME1 0X0216
#define URXTIME 0X0218
#define URXDATAPOINT 0X021A
#define UARTTABLE 0X0300
#define UARTSAVED 0X0400
ORG 0FFFEH
DW RESET
ORG 0FFEEH
DW RESET
DW RESET
ORG 0FFF2H
DW UARTINT
ORG 0FFF4H
DW RESET
DW RESET
DW RESET
DW RESET
DW RESET
ORG 0FFECH
DW INTTA
ORG 0FFE4H
DW RESET
DW RESET
DW RESET
DW RESET
ORG 0FFE2H
DW INTP2
ORG 0E000H
RESET MOV #0A00H,SP
MOV.B #0E0H,&DCOCTL
MOV.B #84H,&BCSCTL1
MOV.B #00H,&BCSCTL2 ;设置主频1.124M
CALL #INITIAL
MOV #0100H,R7
MOV @R7,R8 ;将信息段中的指针读入R8
XOR R8,#0FFFFH ;若R8=0FFFFH,说明第一次启动,不修改DATAPOINT
JZ LOOP6
MOV 0(R7),&DATAPOINT ;否则,恢复DATAPOINT
LOOP6
BIC.B #URXIFG0,&IFG1
BIS.B #URXIE0,&IE1 ;开接收中断
BIS #MC0,&TACTL ;开定时器,四毫秒中断一次
; CALL #ADCPRO
CALL #LCDLPRO ;LCD左屏刷新
BIS #FIRSTDATA,&FLAG
EINT
LOOP1
BIT #TIMEDUE,&FLAG ;判断数据刷新时间到?
JZ LOOP2
BIC #TIMEDUE,&FLAG ;清标志
CALL #LCDRPRO
LOOP2
BIT #TIMEDUE2,&FLAG ;判断两分钟时间到?
JZ LOOP0
BIC #TIMEDUE2,&FLAG
MOV &DATAPOINT,R14
AND #01FFH,R14
JNZ LOOP4 ;判断指针指向块首?
MOV &DATAPOINT,R15
CALL #ERASESEG ;是,擦除块
LOOP4
CALL #WRSEG ;将缓存数据放入FLASH
MOV &DATAPOINT,R14
XOR #0E000H,R14
JNZ LOOP5
MOV #2000H,&DATAPOINT
LOOP5
CALL #LCDLPRO
LOOP0
BIT #URXOVERTIME,&FLAG
JZ LOOP1
CMP #0,&UARTSAVED
JZ LOOP1
CALL #UARTPRO
CLR &UARTSAVED
JMP LOOP1
;----------------------------------------------------
;初始化子程序INITIAL
;----------------------------------------------------
INITIAL
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
CLR SR
MOV.B #0E0H,&DCOCTL
MOV.B #84H,&BCSCTL1
MOV.B #00H,&BCSCTL2 ;设置主频1.124M
CLR.B &P2DIR
MOV.B #01H,&P2IE
MOV.B #01H,&P2IES
CLR.B &P2SEL ;P2.0,P2.1脚下降沿中断
MOV.B #30H,&P3SEL ;P3.4,P3.5外围模块功能
BIC.B #URTS,&P3OUT
MOV.B #0DFH,&P3DIR
CLR.B &P4DIR
CLR.B &P4SEL ;P4输入
MOV.B #10000000B,&P5OUT
MOV.B #0FFH,&P5DIR
CLR.B &P5SEL ;P5输出
MOV.B #0,&P1OUT
MOV.B #0FFH,&P1DIR
CLR.B &P1SEL ;P1输出
CLR.B &P6DIR
MOV.B #0FFH,&P6SEL ;P6转换输入
MOV #0100H,&TACTL ;选择ACLK,禁止TAIFG中断,定时器暂停
CLR &TAR
MOV #0010H,&CCTL0
CLR &CCTL1
CLR &CCTL2
MOV #128,&CCR0 ;设置定时器A四毫秒中断一次
CLR.B &CACTL1 ;关比较器
; MOV.B #PENA+PEV+CHAR+SWRST,&U0CTL ;偶校验\8位数据
MOV.B #CHAR+SWRST,&U0CTL ;无偶校验\8位数据
MOV.B #SSEL0,&U0TCTL ;选择ACLK时钟
BIS.B #URXEIE,&U0RCTL ;所有字符使能标志位URXIFG
CLR.B &U0BR1
MOV.B #6,&U0BR0
MOV.B #6FH,&U0MCTL
BIC.B #SWRST,&U0CTL
MOV.B #URXE0+UTXE0,&ME1 ;UART接收可中断
BIC #ENC,&ADC12CTL0
MOV #88F0H,&ADC12CTL0
MOV #0202H,&ADC12CTL1
MOV.B #10H,&ADC12MCTL0
MOV.B #11H,&ADC12MCTL1
MOV.B #12H,&ADC12MCTL2
MOV.B #13H,&ADC12MCTL3
MOV.B #14H,&ADC12MCTL4
MOV.B #15H,&ADC12MCTL5
MOV.B #16H,&ADC12MCTL6
MOV.B #17H,&ADC12MCTL7
MOV.B #9AH,&ADC12MCTL8
CLR &ADC12IFG
CLR &ADC12IE ;ADC设置
MOV #2000H,&DATAPOINT ;当前数据指针=2000H
CLR &FLAG
CLR &TIME0
CLR &TIME1
CLR &URXTIME
CLR &UARTSAVED
MOV #UARTSAVED,&URXDATAPOINT
CLR.B &P2IFG
RET
;----------------------------------------------------
;串行通讯接收中断程序UARTINT
;----------------------------------------------------
UARTINT
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
PUSH R15
CMP #0,&UARTSAVED
JNZ UARTINT0
MOV #UARTSAVED,&URXDATAPOINT
UARTINT0
MOV &URXDATAPOINT,R15
BIC.B #URXIFG0,&IFG1
MOV.B &U0RXBUF,0(R15)
INC &URXDATAPOINT
CLR &URXTIME
BIC #URXOVERTIME,&FLAG
POP R15
RETI
;----------------------------------------------------
;四毫秒定时中断程序INTTA
;----------------------------------------------------
INTTA
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
PUSH R5
PUSH R6
PUSH R7
BIT #URXOVERTIME,&FLAG
JNZ INTTA3
INC &URXTIME
CMP #125,&URXTIME
JL INTTA3
BIS #URXOVERTIME,&FLAG
INTTA3
CALL #ADCPRO ;进行ADC采样
MOV #8,R5
MOV #ADC12MEM0,R6
MOV #ADCDATA,R7
BIT #FIRSTDATA,&FLAG
JZ INTTA1
BIC #FIRSTDATA,&FLAG
INTTA2
MOV @R6+,0(R7)
INCD R7
DEC R5
JNZ INTTA2 ;是第一个数据,只保存
JMP INTTA0
INTTA1
ADD @R6+,0(R7)
CLRC
RRC 0(R7)
INCD R7
DEC R5
JNZ INTTA1 ;否则,进行平均处理
INTTA0
INC &TIME0
CMP #128,&TIME0
JL INTTAEND
CLR &TIME0
BIS #TIMEDUE,&FLAG ;0.5s LCD刷新一次
INC &TIME1
CMP #20,&TIME1
JL INTTAEND
CLR &TIME1
BIS #TIMEDUE2,&FLAG
INTTAEND
POP R7
POP R6
POP R5
RETI
;----------------------------------------------------
;键处理中断程序INTP2
;----------------------------------------------------
INTP2
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
CALL #DELAY20MS
BIT.B #BIT0,&P2IN
JNZ INTP2LOOP
XOR.B #ELD,&P5OUT
JMP INTP2END
INTP2LOOP
BIT.B #BIT1,&P2IN
JNZ INTP2END
; XOR #ADCOFF,&FLAG
; BIT #ADCOFF,&FLAG
; JZ INTP2LOOP1
; BIS.B #LED,&P5OUT
; JMP INTP2END
;INTP2LOOP1
; BIC.B #LED,&P5OUT
INTP2END
BIT.B #0FFH,&P2IN
JZ INTP2END
CALL #DELAY20MS
CLR.B &P2IFG
RETI
;----------------------------------------------------
;异步串行口处理子程序UARTPRO
;----------------------------------------------------
UARTPRO
DINT
MOV #UARTSAVED,R15
CMP.B #0FEH,0(R15)
JNZ UARTPROEND ;前导出错退出
MOV #5,R5
UARTPROLOOP
CMP.B #68H,0(R15)
JZ UARTPRO1
INC R15
DEC R5
JNZ UARTPROLOOP
JMP UARTPROEND ;帧起始符错退出
UARTPRO1
INC R15
MOV.B @R15+,R5
SWPB R5
MOV.B @R15+,R12
BIS R12,R5
MOV.B @R15+,R6
SWPB R6
MOV.B @R15+,R12
BIS R12,R6
MOV.B @R15+,R7
SWPB R7
MOV.B @R15+,R12
BIS R12,R7
CALL #CORRECTION
MOV R8,R13 ;获得帧长,放于R13中
MOV R15,R14 ;获得循环起始地址,放于R14中
MOV R14,R12
ADD R13,R12
ADD R13,R12
ADD R13,R12
CMP.B #16H,0(R12)
JNZ UARTPROEND ;帧结束符错退出
MOV R13,R12
MOV R14,R15
UARTPROLOOP3
MOV R15,R9
MOV.B @R9,R5
ADD R13,R9
MOV.B @R9,R6
ADD R13,R9
MOV.B @R9,R7
CALL #CORRECTION
MOV.B R8,0(R15)
INC R15
DEC R12
JNZ UARTPROLOOP3 ;纠错处理
MOV R14,R12
MOV R13,R5
DEC R5
CLR R6
UARTPROLOOP1
XOR.B @R12+,R6
DEC R5
JNZ UARTPROLOOP1
CMP.B @R12,R6
JNZ UARTPROEND ;纵向校验出错退出
CMP.B @R14,&P4IN ;目标地址=本设备地址?
JZ UARTPRO2
CMP.B #0,2(R14) ;判断需要中转?
JZ UARTPROEND
MOV.B 3(R14),R5
MOV R14,R12
ADD R5,R12
CMP.B 4(R12),&P4IN
JZ UARTPRO3 ;需要中转
UARTPROEND
BIC #TRANSFER,&FLAG
EINT
RET
UARTPRO2
MOV.B @R14,R7
MOV.B 1(R14),0(R14)
MOV.B R7,1(R14) ;DA,SA交换
MOV R14,R15
ADD R13,R15 ;R15放指令地址
DEC R15
DEC R15
CMP.B #02H,0(R15)
JNZ UARTPRO4
MOV.B #03H,0(R15) ;实时数据回传
MOV R13,R7
ADD #48,R7
UARTPRO20
MOV R14,R12
SUB #6,R12
MOV.B R7,1(R12)
SWPB R7
MOV.B R7,0(R12)
MOV.B R7,2(R12)
SWPB R7
MOV.B R7,3(R12)
MOV.B R7,5(R12)
SWPB R7
MOV.B R7,4(R12) ;修改帧长
CMP.B #0,2(R14)
JZ UARTNEXT1
MOV.B 2(R14),R12
CLR.B 3(R14) ;CC=0
MOV R14,R11
MOV #UARTTABLE,R10
UARTNEXT2
MOV.B 4(R11),0(R10)
INC R10
INC R11
DEC R12
JNZ UARTNEXT2
MOV.B 2(R14),R12
DEC R10
MOV R14,R11
UARTNEXT3
MOV.B @R10,4(R11)
DEC R10
INC R11
DEC R12
JNZ UARTNEXT3 ;TABLE反转
UARTNEXT1
MOV #UARTSAVED,R6
UARTPRO22
CMP R6,R14
JZ UARTPRO23
BIT.B #TXEPT,&U0TCTL
JZ $-4
MOV.B @R6+,&U0TXBUF
JMP UARTPRO22
UARTPRO23
MOV #3,R6
DEC R13
UARTPRO25
CLR R8
PUSH R13
PUSH R14
UARTPRO24
BIT.B #TXEPT,&U0TCTL
JZ UARTPRO24
MOV.B @R14,&U0TXBUF
XOR.B @R14,R8
BIT.B #TXEPT,&U0TCTL
JZ $-4
INC R14
DEC R13
JNZ UARTPRO24
BIT #TRANSFER,&FLAG
JNZ UARTPRO28
CMP.B #3,0(R15)
JNZ UARTPRO21
MOV #32,R5
UARTPRO26
MOV.B #0,&U0TXBUF
BIT.B #TXEPT,&U0TCTL
JZ $-4
DEC R5
JNZ UARTPRO26
MOV #16,R5
MOV #ADCDATA,R7
UARTPRO27
MOV.B @R7,&U0TXBUF
BIT.B #TXEPT,&U0TCTL
JZ $-4
XOR.B @R7,R8
INC R7
DEC R5
JNZ UARTPRO27
UARTPRO28
MOV.B R8,&U0TXBUF
POP R14
POP R13
DEC R6
JNZ UARTPRO25
BIT.B #TXEPT,&U0TCTL
JZ $-4
MOV.B #16H,&U0TXBUF
JMP UARTPROEND
UARTPRO21
CMP.B #9,0(R15)
JZ UARTPRO28
CMP.B #5,0(R15)
JNZ UARTPROEND
MOV #0C000H,R7
MOV &DATAPOINT,R5
UARTPRO55
CMP #2000H,R5
JNZ UARTPRO56
MOV #0E000H,R5
UARTPRO56
DEC R5
MOV.B @R5,&U0TXBUF
XOR.B @R5,R8
BIT.B #TXEPT,&U0TCTL
JZ $-4
DEC R7
JNZ UARTPRO55
JMP UARTPRO28
UARTPRO4
CMP.B #08H,0(R15)
JNZ UARTPRO5
MOV.B #09H,0(R15) ;通道链路测试
JMP UARTNEXT1
UARTPRO5
CMP.B #04H,0(R15)
JNZ UARTPROEND
MOV.B #05H,0(R15) ;历史数据回传
MOV R13,R7
ADD #0C000H,R7
JMP UARTPRO20
UARTPRO3
INC.B 3(R14)
BIS #TRANSFER,&FLAG
JMP UARTNEXT1 ;中转处理
;----------------------------------------------------
;纠错子程序CORRECTION,R5、R6、R7为被纠错字节,R8为正确字节
;----------------------------------------------------
CORRECTION
MOV R6,R8
BIS R5,R8 ;Y0=R8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -