使用Atmega32读取按钮的状态以打开AVR中的LED
Reading state of push button to turn on LED in AVR using Atmega32
我有一个程序应该从连接到 PORTA 的 DIP 开关读取输入值,当按下 PC0 上的按钮时,它会将位输出到 PORTB 上的 LED,或者如果按下 PC7,则显示在 PORTD 上。当按下 PC3 时,它应该将两个字节相乘得到一个存储为高字节和低字节的 16 位值。
问题是,一旦我按下按钮一次,结果就会显示在 LED 中。但是,在按下第一个按钮后,逻辑停止工作。例如,在 PORTA 上切换输入时,无论是否按下按钮,它仍然会显示在 LED 中。
我无法准确指出问题出在哪里,我真的需要调试方面的帮助。
我正在使用 atmega32,在 Atmel studio 中编程,并在 Proteus 中进行仿真。
感谢任何帮助。
.cseg
.org 0x0000
; set stack pointer
ldi r29, low(ramend)
out spl, r29
ldi r29, high(ramend)
out sph, r29
start:
ser r16
out ddrb, r16 ; portb output
out ddrd, r16 ; portd output
clr r16
out ddra, r16 ;porta input
out ddrc, r16 ;portc input
ser r16
out portc, r16 ;pull-up resistor on PORTC
rjmp main
main:
sbic pinc, 0 ;skip if button is not pressed on PC0
call Load_Low ;call subroutine function to load the lower bit
sbic pinc, 7
call Load_High ;call subroutine function to load the higher bit
sbic pinc, 3
call Multiply ;call subroutine function to multiply both stored values
rjmp main
Load_High:
in r20, pina ;read bits in PINA to R20
mov r30, r20 ;store copy
out portb, r30 ;output to LEDs on PORTB
cbi portc, 0 ;clear bit
ret
Load_High:
in r20, pina
mov r31, r20
out portd, r31
cbi portc, 7
ret
Multiply:
mul r31, r30
out portd, r0
out portb, r1
cbi portc, 3
ret
原理图中没有下拉电阻,可以在松开按键时拉低逻辑电平。因此电压是不确定的,在现实生活中电压将浮动导致输入上的意外逻辑电平变化。
您可以将按钮连接到“GND”并接合内部上拉电阻(将 PORTC
的相应位设置为 1 而在 DDRC
这些位中,而不是添加外部下拉电阻是 0)
还有你所有的例程中都有奇怪的行没有解释:
cbi portc, 0 ;clear bit
cbi portc, 7
cbi portc, 3
这些是按钮输入,为什么你每次都清除 PORTC
位?
我有一个程序应该从连接到 PORTA 的 DIP 开关读取输入值,当按下 PC0 上的按钮时,它会将位输出到 PORTB 上的 LED,或者如果按下 PC7,则显示在 PORTD 上。当按下 PC3 时,它应该将两个字节相乘得到一个存储为高字节和低字节的 16 位值。
问题是,一旦我按下按钮一次,结果就会显示在 LED 中。但是,在按下第一个按钮后,逻辑停止工作。例如,在 PORTA 上切换输入时,无论是否按下按钮,它仍然会显示在 LED 中。
我无法准确指出问题出在哪里,我真的需要调试方面的帮助。
我正在使用 atmega32,在 Atmel studio 中编程,并在 Proteus 中进行仿真。
感谢任何帮助。
.cseg
.org 0x0000
; set stack pointer
ldi r29, low(ramend)
out spl, r29
ldi r29, high(ramend)
out sph, r29
start:
ser r16
out ddrb, r16 ; portb output
out ddrd, r16 ; portd output
clr r16
out ddra, r16 ;porta input
out ddrc, r16 ;portc input
ser r16
out portc, r16 ;pull-up resistor on PORTC
rjmp main
main:
sbic pinc, 0 ;skip if button is not pressed on PC0
call Load_Low ;call subroutine function to load the lower bit
sbic pinc, 7
call Load_High ;call subroutine function to load the higher bit
sbic pinc, 3
call Multiply ;call subroutine function to multiply both stored values
rjmp main
Load_High:
in r20, pina ;read bits in PINA to R20
mov r30, r20 ;store copy
out portb, r30 ;output to LEDs on PORTB
cbi portc, 0 ;clear bit
ret
Load_High:
in r20, pina
mov r31, r20
out portd, r31
cbi portc, 7
ret
Multiply:
mul r31, r30
out portd, r0
out portb, r1
cbi portc, 3
ret
原理图中没有下拉电阻,可以在松开按键时拉低逻辑电平。因此电压是不确定的,在现实生活中电压将浮动导致输入上的意外逻辑电平变化。
您可以将按钮连接到“GND”并接合内部上拉电阻(将 PORTC
的相应位设置为 1 而在 DDRC
这些位中,而不是添加外部下拉电阻是 0)
还有你所有的例程中都有奇怪的行没有解释:
cbi portc, 0 ;clear bit
cbi portc, 7
cbi portc, 3
这些是按钮输入,为什么你每次都清除 PORTC
位?