?? 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 + -