?? keydlas_alarm.s43
字號:
; 此示例介紹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位作為掃描線行輸出,高3位作為列線讀入
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 ;4根行線掃描完了嗎
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 ; 測試3根列線是否為1,是否有按健
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 ;從表中查得十進制數
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -