【问题标题】:AVR Programming - How to read in consecutive button presses in CAVR 编程 - 如何在 C 中读取连续按下的按钮
【发布时间】:2014-05-06 11:34:12
【问题描述】:

这就是我要说的:

考虑一个 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;
    }



}

我卡在必须读取第二个数字的地方。我会在第一个嵌套循环中执行此操作吗?或者我将如何从我的开关中读取两位数,每次按下按钮都会计时?

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于嵌入式编程的,应该移到Electrical Engineering StackExchange
  • @Don'tYouWorryChild 只要它主要是关于编程而不是硬件,它就不会偏离主题。但是,在电子网站上获得更多更好答案的机会更高。
  • @Lundin : 好吧,不劝阻这些问题会在这里吸引越来越多的嵌入式问题,但正如你所说,电子网站更适合他们,所以他们更适合那里。
  • 嵌入式编程问题鼓励。不,EE 网站在他们认为合适的方面非常狭窄。
  • 当您在 C 代码中使用二进制数时,您必须添加“0bXXXXXX”。否则它会将数字处理为不需要的十进制数。

标签: c embedded avr


【解决方案1】:

要制作一个可用于更长数字序列的变量程序,只需使用循环即可。 for(uint8_t i=0; i&lt;NUMBER_OF_DIGITS; i++)。端口读数需要在循环内。

但是,您无法按照自己的方式阅读按钮。所有按钮都有一个机电信号反弹,您需要将其过滤掉以防止错误读数。您必须在任何类型的嵌入式系统上执行此操作。

最简单的方法是对按钮采样一次,保存结果,等待几毫秒,然后再次采样。如果样本比较相等,则接受它作为结果(按下或未按下)。

或者,您可以在按钮信号的边缘触发中断,从那里启动一个定时器,然后当定时器用完时,读取端口。

更高级的方法使用某种形式的median filters

【讨论】:

    【解决方案2】:

    所以如果我说得对,你想做这样的事情

    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   
    

    你能确认一下吗?首先用伪代码编写代码总是一件好事。它很好地概述了您想要做什么。

    【讨论】:

    • 嘿,很像这样,只是我们直接等待第一个数字而不是等待第一个按钮。 IE。开始:等待第一个数字 等待按钮 等待第二个数字 等待按钮 如果数字相同 关闭红色 LED 打开绿色 LED 否则转到开始
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2023-03-22
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多