我想在AVR組件中創建一個程序,它將輪詢瞬時按鈕開關的狀態,並在按下開關時切換LED的狀態。我正在使用帶有ATMega328P芯片的Arduino Duemilanove。我有一個連接在數字引腳0和地之間的按鈕開關,以及一個連接數字引腳8和+ 5V之間的330歐姆電阻的LED。這是我到目前爲止的代碼:在AVR組件中創建一個撥動開關
;==============
; Declarations:
.def temp = r16
.org 0x0000
rjmp Reset
;==============
Reset:
ser temp
out DDRB, temp ; set all pins on Port B to OUTPUT mode
ldi temp, 0b11111110 ; set pin 0 on Port D to INPUT mode
out DDRD, temp
clr temp
out PORTB, temp ; clear temp and set all pins on Port B to LOW state
ldi temp, 0b00000001 ; set pin 0 on Port D to HIGH state
out PORTD, temp
;==============
; Main Program:
switch:
in temp, PIND ; get state of pins on Port D
cpi temp, 0 ; compare result to 0 (pushbutton is pressed)
brne PC+3 ; if != 0, go check again
ldi temp, (1<<PB0) ; otherwise, write logic 1 to pin 0 of Port B
out PINB, temp ; which toggles the state of the pin
rjmp switch
不幸的是這一切確實是光LED和保持它無論按鍵多少次推。我將這個代碼從一個發現here的程序中解脫出來,只要按下按鈕就可以打開上的LED。我只是想延長這一點,使LED保持當前狀態,直到再次按下按鈕。有什麼建議麼?
切換它你應該使用口罩不是整個'PIND'僅比較'PIND0'到'0'。特別是如果您的端口懸空(二極管上的照明可能會改變浮動引腳的電平並使'cpi temp,0'始終錯誤)。 此外,您可以使用'SBI'指令來更改'PINB'中的單個位。 不確定這會工作,但目前我沒有看到其他問題。 – Julien
按鈕彈跳。這在示例代碼中無關緊要,但在您的情況下,即使在@ Julien的提示之後,您也會收到隨機結果。 – datafiddler
我試圖圍繞如何使用'sbi'來寫入邏輯1到PB0,但我似乎無法使其工作。使用'sbi PORTB0,1'不會給出預期的結果。我看到你對按鈕反彈的觀點。也許在主循環中的某個延遲子例程會使開關脫落? –