Счетчик приращений для int8_t

Я работаю над кортексом m0. Я хочу увеличить количество переменных, объявленных как int8_t, но при выводе выводится довольно ошибочно. Код:

//
// Smpl_7seg_keypad
//
// Input:  3x3 keypad (input = 1~9 when key is pressed, =0 when key is not pressed
// Output: 7-segment LEDs
//
#include <stdio.h>
#include "NUC1xx.h"#include "DrvSYS.h"#include "Seven_Segment.h"#include "scankey.h"#include "NUC1xx-LB_002\LCD_Driver.h"

int32_t main (void)
{
int8_t number;
char a[]={'0'};
int count=0;
char arr[]="    ";

UNLOCKREG();
DrvSYS_Open(48000000);
LOCKREG();

OpenKeyPad();
Initial_panel();
clr_all_panel();
//print_lcd(0, "Msrit");
sprintf(arr,"%d",count);
print_lcd(0,arr);
while(1)
{
number = Scankey();
//a[0]=48+number;
if(number ==1)
{
clr_all_panel();
count++;
//print_lcd(0,"\(\\__/\)");
//print_lcd(1,"\(='.'=\)");
//print_lcd(2,"\(\"\)_\(\"\)");
sprintf(arr,"%d",count);
print_lcd(0,arr);}
else if(number==2)
{
clr_all_panel();
count--;
//print_lcd(0," O");
//print_lcd(1,"\/|\\");
//print_lcd(2,"\/ \\");
sprintf(arr,"%d",count);
print_lcd(1,arr);

}
//print_lcd(1, a);
// scan keypad to get a number (1~9)
show_seven_segment(1,number); // display number on 7-segment LEDs
DrvSYS_Delay(5000);           // delay time for keeping 7-segment display
close_seven_segment();        // turn off 7-segment LEDs
}

}

Например вывод идет:
12,28,28,29,41

Какие изменения мне нужно внести в код, чтобы переменная count увеличивалась нормально?

1

Решение

Сам прирост в порядке. Проблема в том, что вы проверяете Scankey() в тесной петле. Независимо от того, как быстро вы отпустите кнопку, цикл удастся выполнить несколько раз, увеличив счетчик более чем на единицу.

Вам нужно подождать, пока кнопка не будет отпущена, прежде чем снова увеличивать счетчик. Один из способов сделать это — сохранить самое последнее значение, которое вы получили от Scankey() и только введите if последовательность, когда на выходе Scankey() изменения:

int8_t prev_number = 0;
...
while(1) {
number = Scankey();
if (number != prev_number) {
if(number == 1) {
clr_all_panel();
...
} else if (...) {
...
}
}
prev_number = number;
...
}

Также читайте дальше дребезга.

1

Другие решения