C++ int8的增量计数

C++ int8的增量计数,c++,cortex-m,C++,Cortex M,我正在研究cortex 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>

我正在研究cortex 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                                 
}
//
//Smpl_7seg_键盘
//
//输入:3x3小键盘(按键时输入=1~9,未按键时输入=0
//输出:7段LED
//
#包括
#包括“nuc1x.h”
#包括“DrvSYS.h”
#包括“七段h”
#包括“scankey.h”
#包括“NUC1xx-LB_002\LCD_Driver.h”
int32_t main(无效)
{
int8_t编号;
字符a[]={0'};
整数计数=0;
字符arr[]=“”;
UNLOCKREG();
DrvSYS_开放(48000000);
LOCKREG();
打开键盘();
初始_面板();
clr_所有面板();
//打印液晶显示器(0,“Msrit”);
sprintf(arr,“%d”,计数);
打印液晶显示器(0,arr);
而(1)
{
数字=扫描键();
//a[0]=48+个数字;
如果(数字==1)
{
clr_所有面板();
计数++;
//打印液晶显示器(0,“\(\ \ \ \ \ \ \/\)”;
//打印液晶显示器(1,“\(=”.=\)”;
//打印液晶显示器(2,“\(\”\)\(\”)”;
sprintf(arr,“%d”,计数);
打印液晶显示器(0,arr);
}
else if(数字=2)
{
clr_所有面板();
计数--;
//打印液晶显示器(0,“O”);
//打印液晶显示器(1“\/\”);
//打印液晶显示器(2“\/\”);
sprintf(arr,“%d”,计数);
打印液晶显示器(1,arr);
}
//打印液晶显示器(1,a);
//扫描键盘以获取数字(1~9)
显示七段(1,数字);//在七段LED上显示数字
DrvSYS_Delay(5000);//保持7段显示的延迟时间
关闭_seven_segment();//关闭7段LED
}
}

例如,输出为: 12,28,28,29,41


我需要对代码进行哪些更改,以使计数变量正常递增?

递增本身没有问题。问题是您在一个紧密的循环中检查
Scankey()
。无论您释放按钮的速度有多快,循环都会执行几次,使计数器增加一倍以上

在再次增加计数器之前,您需要等待按钮释放。一种方法是保留从
Scankey()
获得的最新值,并且仅在
Scankey()
的输出更改时输入
if
序列:

int8_t prev_number = 0;
...
while(1) {
  number = Scankey();
  if (number != prev_number) {
    if(number == 1) {
      clr_all_panel();
      ...
    } else if (...) {
      ...
    }
  }
  prev_number = number;
  ...
}
也请仔细阅读