两个值之间的嵌入式 C 计数器

Embedded C counter between two values

请帮助解决我的问题。

我试图避免超出下面程序中计数 up/down 值 0 到 100 之间的限制;

我正在使用 8051 微控制器和 2x16 LCD 显示 0 到 100 之间的值。按下向上按钮时数字增加 1,而按下按钮时数字减少 1。

我的代码不断递增 100 以上且小于 0 的值。

// This is a code in Embedded C written on MikroC compiler for 8051 microcontroller
// The microcontroller shall count up / down on the LCD when press up / down button. 

unsigned int cntr=0; //  counter value 
char lcdv[6];       // Value to displau on lcd

sbit UP at P3.B7;   // declare button UP at port 3 Bit 7.
sbit DN at P3.B6;   // declare button UP at port 3 Bit 6.

// LCD module connections

sbit LCD_RS at P2_0_bit;      // Declare LCD reset pin.
sbit LCD_EN at P2_1_bit;      // Declare LCD Enable pin.
sbit LCD_D4 at P2_2_bit;      // Declare LCD D4 pin.
sbit LCD_D5 at P2_3_bit;      // Declare LCD D5 pin.
sbit LCD_D6 at P2_4_bit;      // Declare LCD D6 pin.
sbit LCD_D7 at P2_5_bit;      // Declare LCD D7 pin.

// End LCD module connections

char text[16]; // this is stored in RAM



 void main() {                      // Main program


  P3 = 255;         // Configure PORT3 as input

  Lcd_Init();       // Initialize LCD

cntr=0;   // Starting counter value


  Lcd_Cmd(_LCD_CLEAR); 
  Lcd_Cmd(_LCD_CURSOR_OFF);

  while(1) {

   while ((cntrset<=100)&&(cntrset>=0))  // Not sure how to limit Min and Max value.

 {
   wordTostr(cntrset,volset);

   LCD_Out(2,1,volset);

  if (UP==0)
  cntrset ++;
  while (UP==0);

  if (DN==0)
  cntrset=--;
  while (DN==0);
                     }


                }    
                }

if (UP==0 && cntrset < 100 ) cntrset++; 
while (UP==0); 

if (DN==0 cntrset > 0 ) cntrset--; 
while (DN==0); 

您可能仍然遇到开关弹跳问题,导致单次按下导致计数器发生多次变化。但这是一个不同的问题。

关于评论:如果增量不是乘以并且当前值不需要是增量的倍数,那么改为应用饱和度更容易:

if( UP == 0 ) cntrset += increment; 
while (UP==0); 

if( DN == 0 ) cntrset -= increment ; 
while (DN==0); 

if( cntrset < 0 ) cntrset = 0 ;
else if( cntrset > MAX_CNTRSET ) cntrset = MAX_CNTRSET ;

要使其正常工作,您必须将 cntrset 更改为 signed int。如果你不想那样做(假设 16 位 unsigned):

...

if( (cntrset & 0x8000u) != 0 ) cntrset = 0u ;
else if( cntrset > MAX_CNTRSET ) cntrset = MAX_CNTRSET ;