以下是我对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;
}
}
我陷入了必须阅读第二位数字的地方。我会在第一个嵌套循环中做这个吗?或者我如何从我的开关中读取两位数字,每按一次按钮就会显示一次?
答案 0 :(得分:1)
要制作可用于较长编号序列的可变程序,只需使用循环即可。 for(uint8_t i=0; i<NUMBER_OF_DIGITS; i++)
。端口读取需要在循环内部。
但是,您无法按照自己的方式阅读按钮。所有按钮都有一个机电信号反弹,您需要将其过滤掉以防止错误读数。您必须在任何类型的嵌入式系统上执行此操作。
最简单的方法是对按钮进行一次采样,保存结果,等待几毫秒,然后再次采样。如果样品比较相等,则接受它作为结果(按下或未按下)。
或者,你可以在按钮信号的边缘触发一个中断,从那里启动一个定时器,然后当定时器用完时,读取端口。
更高级的方法使用某种形式的median filters。
答案 1 :(得分:0)
所以,如果我做对了你想做这样的事情
Start:
Wait for pushbutton
Wait for first digit
Wait for pushbutton
Wait for second digit
If digits they are the same
Turn off Red LED
Turn on Green LED
Else
Goto start
你能证实吗?首先在伪代码中执行代码总是一件好事。它非常好地概述了您想要做的事情。