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