这是我必须要 dp 的内容:
考虑一个 ATmega324A 开发板和一个 CSSE2010/CSSE7201 IO 板。开关 S3 到 S0 连接到 AVR 端口 B 引脚 3 到 0。按钮 B0 连接到 AVR 端口 A 引脚 0。LED L0 和 L2 分别连接到 AVR 端口 C 引脚 0 和 2。 LED L0(红色)是“锁定”LED,只有在锁被锁定时才会亮起。 LED L2 (绿色)是“解锁”LED,只有在解锁时才会亮起。锁 最初以锁定状态启动。用户在开关(S3 至 S0)上输入数字的二进制代码,然后按下并松开按钮 B0 以“输入”第一个数字。然后用户在开关上输入第二个数字的二进制代码,按下并松开按钮 B0 以“输入”第二个数字。如果数字与预期值匹配(学号的最后一位和学号的第三位),则锁应“解锁”,否则应保持锁定状态,直到输入正确的两位数。
到目前为止,这是我的代码:
#include <avr/io.h>
/* Seven segment display values */
uint8_t seven_seg[16] = { 63,6,91,79,102,109,125,7,127,111,119,124,57,94,121,113};
int main(void) {
uint8_t digit;
uint8_t temp;
uint8_t digit2;
uint8_t code[2] = {6,3}
DDRA = 11111110; //port A is input (last bit)
DDRB = 0X00; //port B is input
DDRC = 0x0F; //port c is output
DDRD = 0XFF; //set port D to be output
while(1) {
/* Read in a digit from lower half of port C pins */
/* We read the whole byte and mask out upper bits */
PORTB = 1; //Led is red
clock = PINA & 00000001; //read in last bit of port A
temp = PINB & 0X0F; //read in lower half of port b
/* Checks to see the first digit is correct */
if(temp == code[0] && clock == 1) {
digit = temp;
PORTD = seven_seg[temp];
} else {
PORTD = 0;
}
}
我卡在了必须读取第二位数字的位置。我会在第一个的嵌套循环中执行此操作吗?或者我将如何从我的开关中读取两位数字,每次按下按钮时都会输入?
最佳答案
要制作可用于更长数字序列的变量程序,只需使用循环即可。 for(uint8_t i=0; i<NUMBER_OF_DIGITS; i++)
.端口读取需要在循环内。
但是,您不能像现在这样阅读按钮。所有按钮都有机电信号反弹,您需要将其过滤掉以防止读数错误。您必须在任何类型的嵌入式系统上执行此操作。
最简单的方法是对按钮采样一次,保存结果,等待几毫秒,然后再次采样。如果样本比较相等,则接受它作为结果(按下或未按下)。
或者,您可以在按钮信号的边沿触发中断,从那里启动定时器,然后当定时器用完时,读取端口。
更高级的方法使用某种形式的 median filters .
关于c - AVR 编程 - 如何在 C 中读取连续的按钮按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493592/