2014-04-19 37 views
1

我正在研究cortex m0。我想增加一個聲明爲int8_t的變量的計數,但是顯示的輸出相當不穩定。代碼: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

我需要什麼樣的變化做出的代碼,使計數變量遞增一般?

回答

1

增量本身很好。問題在於你正在嚴格檢查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; 
    ... 
} 

debouncing又讀了。

+0

謝謝你的工作! – Bluesir9