⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430温度测控程序.asm

📁 MSP430系列单片机适用小程序
💻 ASM
字号:
 南京航空航天大学 魏小龙 编写,欢迎大家讨论,交流     
                    
; 此示例介绍430的低功耗设计方法,程序包含显示,键盘,ADC,定时器,中断等等.
; 在这个例子中有LED显示 与 行列式键盘,这些程序的编写在相应的地方已经介绍
; 这个程序还是要求显示出所按键的键值
; 但要求作到低功耗,所以大部分的事情在中断程序里实现,
; 显示用中断实现,而且5秒没有按键按下则自动关断显示,用以节省能耗
; 按健的值显示在最左边一位,
; ADC10(温度的ADC转换)显示在最右边的三位,
;  温度转换后暂时存放在220H---240H,然后求和,平均,-***H,/20H---->

;  以10禁进制显示实际温度值

;  约定:显示缓存在200H  以后的6个单元,显示位寄存器为 206H;208H为显示计数器
;  20Ah 按键计时器

;  增加了报警功能
;  用键盘输入两位10进制数,为温度警戒值
;  当温度大于设置值时输出报警

#include    "msp430x13x.h"
             RSEG    CSTACK                  ; System stack
      ;       DS      0   
             RSEG    CODE                    ; Program code 的开始    
             
Reset        mov     #SFE(CSTACK),SP         ; 
SetupWDT     mov     #WDTPW+WDTHOLD,&WDTCTL  ; 

SetupTA      mov     #TASSEL1+TACLR,&TACTL   ; SMCLK, Clear TAR
SetupC0      mov     #CCIE,&CCTL0            ; 使能CCR0 中断
             mov     #500,&CCR0              ; 
SetupP1      bis     #MC1,&TACTL             ; 定时器工作在连续模式
             eint                            ; 开中断
             MOV     #0FFDFH,&206H            
             MOV     #200H,&208H
             MOV     #30000,&20AH
             BIS.B   #08H,&P4DIR
        ;      MOV.B   #21H,&201H
             MOV.B   #22H,&202H
             MOV     #220H,&210H            ;ADC缓存的起始位置
             mov.b   #0,&212h
             mov.b   #0,&214h
Mainloop     bis     #LPM1,SR              ; 低功耗模式


;---------------------------------------------------------------------------
TA0_isr      add        #500,&CCR0            ; Add Offset to CCR0
             call       #adc10
             CMP        #240h,&210H
             JNZ        TA0_0
             CALL       #ADCHULI
      ;      
TA0_0   ;     CMP        #0,&20AH               ;按键计时器,为0时,将关显示
        ;     JZ         TA0_1     
             CALL       #KEY             
             CALL       #DISPLAY_LED
             DEC        &20AH 
             CALL       #ALARM
             reti     
                
TA0_1        CALL    #KEY                       ;关显示                     
             MOV.B   #0,P5OUT
             MOV.B   #00,P5DIR
             RETI          


ALARM          PUSH   R5           ;报警子程序
               PUSH   R6
               MOV.B  &205H,R5
               MOV.B  &201H,R6
               CLRC
               SUB.B  R6,R5
               JNC     ALARMEND
               
               MOV.B  &204H,R5
               AND.B  #0FH,R5
               MOV.B  &200H,R6
               AND.B  #0FH,R6
               CLRC
               SUB.B  R6,R5
               JNC     ALARMEND
               BIS.B  #08H,&P4OUT   ;超出警戒温度,报警
               AND.B  #0FH,&200H
               ADD.B  #10H,&200H
               POP    R6
               POP    R5
               RET
               
ALARMEND       BIC.B  #08H,&P4OUT   ;没有超出警戒温度,不报警
               AND.B  #0FH,&200H
               POP    R6
               POP    R5
               RET
               
KEY            PUSH.B    &P1DIR
               PUSH.B    &P1OUT
               CALL      #KEYJUDGE     ; 没有按键就退出,有就得到键值并处理
               JNC       KEY2          ;
               MOV       #2000,R15
KEY0           DEC       R15
               JNZ       KEY0
               CALL      #KEYJUDGE
               JNC       KEY2          ;去抖动
               CALL      #KEYCODE      ;得到键值
               PUSH      R9
KEY1           CALL      #KEYJUDGE     ;等待按键松开
               JC        KEY1
               POP       R9    

               tst.b     &214h         ;214H为一二进制计数器,当为0时键值被送到201H,否则送到200H
               jz       key11
               mov.b     r9,&200h
               mov.b     #0,&214h
               jmp       key12
key11          mov.b     r9,&201h               
               mov.b     #1,&214h
               
key12               
               
               MOV       #50000,&20AH   
               CALL      #KEY_TAB      ;处理按键
KEY2           POP.B     &P1OUT
               POP.B     &P1DIR
               RET               
               
KEY_TAB        ;  
               NOP
               RET               

KEYCODE        MOV.B     #0,&P5DIR
               MOV.B     #0FH,&P1DIR      ;低4位作为扫描线行输出,高三位作为列线读入
               MOV       #0,R9
               MOV       #1,R8
KEYCODELOOP    MOV.B     R8,&P1OUT        ;R8为扫描信号的输出
               BIT.B     #10H,&P1IN
               JC        KEYCODE1         ;测试P1.4
               BIT.B     #20H,&P1IN
               JC        KEYCODE2         ;测试P1.5
               BIT.B     #40H,&P1IN
               JC        KEYCODE3         ;测试P1.6
               RLA.B     R8
               ADD.B     #3,R9
               CMP.B     #12,R9           ;四 根行线扫描完了吗
               JNZ       KEYCODELOOP
               
KEYCODE1       ADD       #0,R9
               RET
KEYCODE2       ADD       #1,R9
               RET
KEYCODE3       ADD       #2,R9
               RET                                      
               
KEYJUDGE       MOV.B     #0FFH,&P1DIR
               MOV.B     #0,&P1OUT
               MOV.B     #0FH,&P1DIR  
               MOV.B     #0FH,&P1OUT
               BIT.B     #070H,&P1IN      ; 测试三根列线是否为一,是否有按健
               RET                        ; 若有,C=1

adc10        ;MOV.B   #0,&P5DIR
             NOP
             NOP
             bic     #ENC,&ADC12CTL0     ;ENC=0       
             mov     #REFON+ADC12ON,&ADC12CTL0;VER=片内1。5V
             mov     #SHP+ADC12SSEL_2,&ADC12CTL1   ;上升沿采样,主时钟,
             bis     #1000h,&ADC12CTL1        ;选择MEM1  0001  0000  0000  0000
             mov.b   #1Ah,&ADC12MCTL1         ;选择ADC通道0A  0001 1010  参考电压:VER--VSS
             bis     #ENC,&ADC12CTL0          ; set ENC bit
             nop
             nop
             nop
             nop
             nop
             nop
             nop
             nop
             bis     #ADC12SC,&ADC12CTL0     ; 开始转换
testEOC1     bit     #BIT1,&ADC12IFG         ; 是否转换完毕 (ADC12IFG.0=1?)
             jz      testEOC1                 ; 
             MOV     &210H,R15              ;210H 为缓存指针
             mov     &ADC12MEM1,0(R15)           ; 转存到220H--240H
             INC     &210H
             INC     &210H
             MOV.B   #0FFH,&P5DIR
             RET
             
ADCHULI      MOV        #220H,&0210H
             dec.b      &212h
             cmp.b      #30,&212h
             jnz        adc104
             mov.b      #0,&212h
             CLRC
             MOV        #0,R5
             MOV        #0220H,R15
ADC102       ADD        @R15,R5
             INC        R15
             INC        R15
             CMP        #240H,R15
             JNZ        ADC102

             RRA        R5
             RRA        R5
             RRA        R5
             RRA        R5
             BIC        #0F000H,R5    ;除16得平均值
             MOV        R5,R6         ;后面用R6处理小数部分
             
             RRA        R5
             RRA        R5
             RRA        R5
             RRA        R5
    ;          RRA        R5
             BIC        #0F000H,R5    ;除32得
             
             SUB        #159,R5
             MOV.B      TABWENDU(R5),R5  ;从表中查得10进制数

             
             MOV.B   R5,&204H        ;显示格式:两位证整数,一位小数,从最左边开始
             BIC.B   #0F0H,&204H
             ADD.B   #10H,&204H             
             MOV.B   R5,&205H
             RRA.B   &205H
             RRA.B   &205H
             RRA.B   &205H
             RRA.B   &205H    
             BIC.B   #0F0H,&205H
             ;203H       小数部分的计算,平均值后5位除以3。2 
             
             BIC     #0FFE0H,R6       ;剩下最低5位。
             MOV     R6,R12
             MOV     #10,R11
             CALL    #MPYU
             MOV     #0,R13
             MOV     R14,R12
             MOV     #32,R11
             CALL    #DIVIDE
             MOV.B   R14,&203H
              
adc104       ret                                            
                 
DISPLAY_LED    MOV.B       #0FFh,&P1DIR            ; 
               MOV.B       #0FFH,&P5DIR
               MOV         &208H,R15
               MOV.B       @R15,R15
               MOV.B       TABLED(R15),R15  ;从表中查得显示码
               MOV.B       R15,&P5OUT
               MOV.B ?    &206H,&P1OUT     ;&206-----&P1OUT  
               INC         &208H
               RRA.B       &206H           
               CMP         #206H,&208H
               JNZ         DIS6LOOP
               MOV         #0FFDFH,&206H
               MOV         #200H,&208H
DIS6LOOP       RET        
            

;---------------------------------------------------------------------------
MPYU   ;    无符号数乘法  R11 x R12 = R15 | R14
       ;    Input:  R11, R12 , R10 = working register
       ;    Output: R15, R14 
;---------------------------------------------------------------------------
            clr     R14                     ; 0 -> LSBs result
            clr     R15                     ; 0 -> MSBs result
MACU        clr     R13                     ; MSBs multiplier
            mov     #1,R10                  ; bit test register
MPY2        bit     R10,R11                 ; test actual bit
            jz      MPY1                    ; IF 0: do nothing
            add     R12,R14                 ; IF 1: add multiplier to result
            addc    R13,R15                 ;
MPY1        rla     R12                     ; multiplier x 2
            rlc     R13                     ;
            rla     R10                     ; next bit to test
            jnc     MPY2                    ; if bit in carry: finished
            ret                             ; Return from subroutine
                                            ;
                                            
                                            

;---------------------------------------------------------------------------
DIVIDE ;    Unsigned 32/16 divide R13 | R12 / R11 = R14  
       ;    Input:  R13, R12, R10 is a working register  
       ;    Output: R14  
;---------------------------------------------------------------------------
            clr     R14                     ; Clear Accumulator Low
            mov     #17,R10                 ; Initalize Loop Counter
DIV1        cmp     R11,R13                 ;
            jlo     DIV2                    ;
            sub     R11,R13                 ;
DIV2        rlc     R14                     ;
            jc      DIV4                    ; Error: result > 16 bits
            dec     R10                     ; Decrement loop counter
            jz      DIV4                    ; Is 0: terminate w/o err
            rla     R12                     ;
            rlc     R13                     ;
            jnc     DIV1                    ;
            sub     R11,R13                 ;
            setc                            ;
            jmp     DIV2                    ;
DIV4        ret                             ; Error indication in C
              ;

                
            
TABLED:       DB  3FH , 06H ,  5BH   ,4FH        ;0   1   2   3
	      DB  66H , 6DH ,  7DH ,  07H        ;4   5   6   7
	      DB  7FH , 6FH ,  77H,   7CH        ;8   9   A   B
	      DB  39H , 5EH,   79H  , 71H        ;C   D   E   F

	      DB  0BFH, 86H   ,0DBH,  0CFH       ;0.  1.  2.  3.
	      DB  0E6H ,0EDH , 0FDH , 87H        ;4.  5.  6.  7.
	      DB  0FFH ,0EFH  ,0F7H  ,0FCH       ;8.  9.  A.  B.
	      DB  0B9H ,0DEH , 0F9H  ,0F1H       ;C.  D.  E.  F.
				; .  -       P
	      DB  80H , 40H  , 00H  , 73H
	      DB  0C0H                          
	      
TABWENDU      DB    0,1,2,3,4,5,6,7,8,9
              DB    10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
              DB    20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
              DB    30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
              DB    40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
              DB    50H,51H,52H,53H,54H,55H,56H,57H,58H,59H	      

;---------------------------------------------------------------------------
             COMMON  INTVEC                  ; Interrupt vectors
             
             ORG     TIMERA0_VECTOR
             DW      TA0_isr
             ORG     RESET_VECTOR
             DW      Reset
                                                                            
;---------------------------------------------------------------------------
             END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -