www.pudn.com > remotemeter.rar > 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
BIS R7,R5 ;Y1=R5
BIS R7,R6 ;Y2=R6
AND R5,R8
AND R6,R8
RET
;----------------------------------------------------
;延时子程序DELAY20MS
;----------------------------------------------------
DELAY20MS:
PUSH R5
MOV #2000,R5
DELAYLOOP
CALL #DELAY10US
DEC R5
JNZ DELAYLOOP
POP R5
RET
DELAY10US
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;----------------------------------------------------
;显示左屏子程序LCDLPRO
;----------------------------------------------------
LCDLPRO
BIS.B #RST,&P5OUT
CALL #DELAY10US
BIC.B #RST,&P5OUT ;复位LCD
MOV #00B8H,R5
CALL #LCDWRI ;设置页地址=0
MOV #0040H,R5
CALL #LCDWRI ;设置Y地址=0
MOV #64,R6
MOV #CH_TABLE1,R7
LCDLPRO1
MOV @R7+,R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO1
MOV #00B9H,R5
CALL #LCDWRI ;设置页地址=1
MOV #64,R6
MOV #CH_TABLE1,R7
LCDLPRO2
MOV @R7+,R5
SWPB R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO2 ;显示第一行汉字
MOV #00BAH,R5
CALL #LCDWRI ;设置页地址=2
MOV #64,R6
MOV #CH_TABLE2,R7
LCDLPRO3
MOV @R7+,R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO3
MOV #00BBH,R5
CALL #LCDWRI ;设置页地址=3
MOV #64,R6
MOV #CH_TABLE2,R7
LCDLPRO4
MOV @R7+,R5
SWPB R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO4 ;显示第二行汉字
MOV #00BCH,R5
CALL #LCDWRI ;设置页地址=4
MOV #0070H,R5
CALL #LCDWRI ;设置Y地址=48
MOV #16,R6
MOV #CH_TABLE3,R7
LCDLPRO5
MOV @R7+,R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO5
MOV #00BDH,R5
CALL #LCDWRI ;设置页地址=5
MOV #0070H,R5
CALL #LCDWRI ;设置Y地址=48
MOV #16,R6
MOV #CH_TABLE3,R7
LCDLPRO6
MOV @R7+,R5
SWPB R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO6 ;显示第三行汉字
MOV #00BEH,R5
CALL #LCDWRI ;设置页地址=6
MOV #0070H,R5
CALL #LCDWRI ;设置Y地址=48
MOV #16,R6
MOV #CH_TABLE4,R7
LCDLPRO7
MOV @R7+,R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO7
MOV #00BFH,R5
CALL #LCDWRI ;设置页地址=7
MOV #0070H,R5
CALL #LCDWRI ;设置Y地址=48
MOV #16,R6
MOV #CH_TABLE4,R7
LCDLPRO8
MOV @R7+,R5
SWPB R5
AND #00FFH,R5
CALL #LCDWRD
DEC R6
JNZ LCDLPRO8 ;显示第四行汉字
MOV.B &P4IN,R14 ;读通道号
AND #00FFH,R14
CALL #HBCD
MOV #12,R6
CLRC
LCDLPRO9
RLC R12
RLC R13
DEC R6
JNZ LCDLPRO9
AND #0,R12
BIS #0DDDDH,R12
MOV #6,R6
MOV #0BDH,R7
CLR R8
CALL #REFRESH
MOV #0DDDDH,R12
MOV #0DDDDH,R13
MOV #6,R6
MOV #0BCH,R7
CALL #REFRESH
MOV #0DDDDH,R12
MOV #0DDDDH,R13
MOV #6,R6
MOV #0BEH,R7
CALL #REFRESH
MOV #0DDDDH,R12
MOV #0DDDDH,R13
MOV #6,R6
MOV #0BFH,R7
CALL #REFRESH
MOV #003FH,R5
CALL #LCDWRI ;开显示
RET
;----------------------------------------------------
;显示右屏子程序LCDRPRO
;----------------------------------------------------
LCDRPRO
MOV #ADCDATA,R9
MOV #00B7H,R7
MOV #0100H,R8
MOV #6,R10
LCDRPRO1
MOV @R9+,R11
MOV #5,R6
CALL #TRANSVOLT
CALL #HBCD
MOV #8,R6
INC R7
CALL #REFRESH
DEC R10
JNZ LCDRPRO1
MOV #2,R10
LCDRPRO2
MOV @R9+,R11
MOV #1,R6
CALL #TRANSVOLT
CALL #HBCD
MOV R13,R15
SWPB R15
AND #0F00H,R15
BIS #00B0H,R15
MOV #4,R6
LCDRPRO3
CLRC
RLC R12
RLC R13
DEC R6
JNZ LCDRPRO3
AND #0F00FH,R13
BIS R15,R13
AND #0FF00H,R12
BIS #00EFH,R12
MOV #8,R6
INC R7
CALL #REFRESH
DEC R10
JNZ LCDRPRO2
RET
;----------------------------------------------------
;换算成电压值子程序TRANSVOLT,R11,R6输入,R14输出
;----------------------------------------------------
TRANSVOLT
PUSH R7
PUSH R8
DINT
MOV #2500,&MPY
MOV R6,&OP2
NOP
NOP
MOV &RESHI,R6
MOV &RESLO,&MPY
MOV R11,&OP2
NOP
NOP
MOV &RESHI,R8
MOV &RESLO,R7
MOV R6,&MPY
MOV R11,&OP2
NOP
NOP
ADD &RESLO,R8
MOV #12,R6
TRANSLOOP
CLRC
RRC R8
RRC R7
DEC R6
JNZ TRANSLOOP
MOV R7,R14
POP R8
POP R7
EINT
RET
;----------------------------------------------------
;刷新屏子程序REFRESH,输入数据R12\R13,字符数R6
; 页地址R7,R8:高字节非零选择CS2
;----------------------------------------------------
REFRESH
PUSH R9
PUSH R10
MOV R7,R5
CALL #LCDWRI
MOV #40H,R5
CALL #LCDWRI
REFLOOP
CLRC
MOV #4,R9
REFLOOP0
RLC R12
RLC R13
RLC R10
DEC R9
JNZ REFLOOP0
RLC R10
RLC R10
RLC R10
AND #0078H,R10
MOV #8,R9
ADD #D_TABLE,R10
REFLOOP1
MOV.B @R10+,R5
BIS R8,R5
CALL #LCDWRD
DEC R9
JNZ REFLOOP1
DEC R6
JNZ REFLOOP
POP R10
POP R9
RET
;----------------------------------------------------
;写LCD命令子程序LCDWRI,R5放命令字
;----------------------------------------------------
LCDWRI
BIC.B #EN+RW+DI,&P5OUT
BIS.B #CS1+CS2,&P5OUT
BIS.B #EN,&P5OUT
NOP
MOV.B R5,&P1OUT
NOP
BIC.B #EN,&P5OUT
RET
;----------------------------------------------------
;读LCD状态子程序RDSTATUS,R5输出
;----------------------------------------------------
RDSTATUS
MOV.B #0,&P1DIR
BIC.B #EN+DI,&P5OUT
BIS.B #RW+CS1+CS2,&P5OUT
BIS.B #EN,&P5OUT
NOP
MOV.B &P1IN,R5
NOP
BIC.B #EN,&P5OUT
MOV.B #0FFH,&P1DIR
RET
;----------------------------------------------------
;写LCD数据子程序LCDWRD,R5放数据字节,高字节非零选择CS2
;----------------------------------------------------
LCDWRD
BIC.B #EN+RW+CS1+CS2,&P5OUT
BIS.B #DI,&P5OUT
PUSH R5
BIT #0FF00H,R5
JZ LCDWRD1
BIS.B #CS2,&P5OUT
JMP LCDWRD2
LCDWRD1
BIS.B #CS1,&P5OUT
LCDWRD2
POP R5
BIS.B #EN,&P5OUT
NOP
MOV.B R5,&P1OUT
NOP
BIC.B #EN,&P5OUT
RET
;----------------------------------------------------
;16进制转换成BCD码子程序HBCD,IN:R14,OUT:R13,R12
;----------------------------------------------------
HBCD
PUSH R10
PUSH R11
CLR R12
CLR R13
MOV #10000,R11
CALL #BCDDIV
SWPB R10
RLA R10
RLA R10
RLA R10
RLA R10
MOV R10,R13 ;万位
MOV #1000,R11
CALL #BCDDIV
SWPB R10
BIS R10,R13 ;千位
BIS #00B0H,R13 ;小数点
MOV #100,R11
CALL #BCDDIV
BIS R10,R13 ;百位
MOV #10,R11
CALL #BCDDIV
SWPB R10
RLA R10
RLA R10
RLA R10
RLA R10
BIS R10,R12 ;十位
AND #000FH,R14
SWPB R14
BIS R14,R12 ;个位
BIS #00DAH,R12 ;空+V
POP R11
POP R10
RET
;----------------------------------------------------
;BCD码除法子程序BCDDIV,被除数R14,除数R11,返回 R10
;----------------------------------------------------
BCDDIV
CLR R10
BCDDIV0
CMP R11,R14
JL BCDDIVEND
SUB R11,R14
INC R10
JMP BCDDIV0
BCDDIVEND
RET
;----------------------------------------------------
;ADC转换子程序ADCPRO
;----------------------------------------------------
ADCPRO
CLR &ADC12IFG
BIS #ADC12SC+ENC,&ADC12CTL0
ADCLOOP
BIT #BIT8,&ADC12IFG
JZ ADCLOOP
BIC #ADC12SC+ENC,&ADC12CTL0
RET
;----------------------------------------------------
;FLASH数据段擦除、写操作子程序ERASESEG、WRSEG,R15放段首地址
;----------------------------------------------------
ERASESEG
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
DINT ;禁止中断
MOV #FWKEY+FSSEL0+FN1,&FCTL2
MOV #FWKEY+ERASE,&FCTL1
MOV #FWKEY,&FCTL3
MOV #0FFH,0(R15)
MOV #FWKEY,&FCTL1
MOV #FWKEY+LOCK,&FCTL3
EINT
RET
WRSEG
PUSH R13
PUSH R14
MOV #WDTPW+WDTHOLD,&WDTCTL ;关WDT
DINT ;禁止中断
MOV #FWKEY+FSSEL0+FN1,&FCTL2
MOV &DATAPOINT,R15
MOV #8,R14
MOV #ADCDATA,R13
WRSEGLOOP
MOV #FWKEY+WRT,&FCTL1
MOV #FWKEY,&FCTL3
MOV @R13+,0(R15)
MOV #FWKEY,&FCTL1
INCD R15
DEC R14
JNZ WRSEGLOOP
MOV R15,&DATAPOINT
BIS #FIRSTDATA,&FLAG
MOV #0100H,R15
CALL ERASESEG ;擦除信息段
MOV #FWKEY+WRT,&FCTL1
MOV #FWKEY,&FCTL3
MOV #DATAPOINT,0(R15) ;写数据指针DATAPOINT于信息段
MOV #FWKEY,&FCTL1
XOR #FXKEY+LOCK,&FCTL3
POP R14
POP R13
EINT
RET
CH_TABLE1
DW 0000H,0420H,7CC2H,0618H,22C0H,4110H,3FFEH,4090H
DW 2010H,1FF8H,0048H,0048H,7FC4H,0064H,0040H,0000H ;"浙"
DW 0000H,4020H,4020H,2020H,1020H,0820H,0620H,01FEH
DW 0220H,0420H,0820H,1020H,2020H,6030H,2020H,0000H ;"大"
DW 0000H,0000H,0FF0H,0490H,0490H,0490H,3FFEH,4490H
DW 4490H,4490H,4490H,47F8H,4010H,7000H,0000H,0000H ;"电"
DW 0000H,0000H,0000H,0000H,0C484H,0A2FEH,9280H,8C00H
DW 0000H,0000H,0000H,4040H,8080H,0000H,0000H,0000H ;"1\2\"
CH_TABLE2
DW 0000H,2000H,7F7CH,2044H,1FC4H,1144H,117CH,0220H
DW 7F10H,22AEH,2248H,22A8H,7E9CH,0108H,0100H,0000H ;"路"
DW 0000H,4000H,3000H,0FF8H,0128H,4124H,23E6H,1804H
DW 07F8H,0048H,0048H,0044H,7FC6H,0064H,0040H,0000H ;"所"
DW 0000H,0060H,3E5CH,0250H,0250H,7FFEH,0250H,2250H
DW 3E50H,0000H,07F8H,2000H,4000H,3FFEH,0000H,0000H ;"制"
DW 0000H,0000H,0000H,3000H,2844H,2492H,0FE92H,206CH
DW 0000H,0000H,0000H,4040H,8080H,0000H,0000H,0000H ;"3\4\"
CH_TABLE3
DW 0000H,0000H,0000H,7C00H,924EH,928AH,928AH,6072H
DW 0000H,0000H,0000H,4040H,8080H,0000H,0000H,0000H ;"5\6\"
CH_TABLE4
DW 0000H,0000H,0000H,0000H,6C02H,92F2H,920EH,6C02H
DW 0000H,0000H,0000H,4040H,8080H,0000H,0000H,0000H ;"7\8\"
D_TABLE
DB 00H,00H,3EH,7FH,41H,7FH,3EH,00H ;"0"
DB 00H,00H,42H,7FH,7FH,40H,00H,00H ;"1"
DB 00H,00H,62H,73H,59H,4FH,46H,00H ;"2"
DB 00H,00H,22H,6BH,49H,7FH,36H,00H ;"3"
DB 00H,18H,1CH,16H,7FH,7FH,10H,00H ;"4"
DB 00H,00H,27H,67H,45H,75H,39H,00H ;"5"
DB 00H,3EH,7FH,49H,49H,79H,30H,00H ;"6"
DB 00H,00H,01H,79H,7FH,07H,01H,00H ;"7"
DB 00H,00H,36H,7FH,49H,7FH,36H,00H ;"8"
DB 00H,00H,06H,4FH,49H,7FH,3EH,00H ;"9"
DB 01H,07H,39H,40H,39H,07H,01H,00H ;"V"(0AH)
DB 00H,00H,00H,60H,60H,00H,00H,00H ;"."(0BH)
DB 03H,03H,3CH,42H,81H,81H,81H,42H ;"℃"(0CH)
DB 00H,00H,00H,00H,00H,00H,00H,00H ;"NULL"(0DH)
DB 40H,7EH,02H,7EH,02H,7EH,40H,00H ;"m"(0EH)
DB 80H,0E0H,9EH,11H,9EH,0E0H,80H,00H ;"A"(0FH)
END