buttons.c
来自「里面给出了ATmega103单片机编程的C语言实例程序」· C语言 代码 · 共 81 行
C
81 行
/* ATmega103 buttons.c file
Author : Robert Stuart
Company : PDL Industries Ltd
Date of Creation : 22 July 1999
Tested : 12 August 1999
Function :
*/
/* include */
#include "button.h"
/* function is called from "runtime.c" every interrupt */
void ReadButtons( void )
{
BufferButton();
DetermineButtonState();
}
void BufferButton( void )
{
switch ( BUTTON ) /* determine which button has been hit */
{
case SET_BUTTON : PushedButton = SET_MAP; break;
case UP_BUTTON : PushedButton = UP_MAP; break;
case DOWN_BUTTON : PushedButton = DOWN_MAP; break;
default : PushedButton = NONE_MAP;
}
if ( PushedButton == NONE_MAP )
{
Buffer = 0; /* resets the delay counter and button in reset mode */
Button = BUTTON_NONE;
ButtonStatus = 0;
SETBIT( ButtonStatus, BUTTON_RESET );
}
else
DebounceButton(); /* check which button was hit */
}
void DebounceButton( void )
{
if ( LastButton == PushedButton ) /* same button hit as last interrupt */
Buffer++; /* increment delay counter */
else
Buffer = 0; /* different button has been hit */
LastButton = PushedButton; /* set "last_button" for next interrupt */
}
void DetermineButtonState( void )
{
if ( Buffer > _50MS ) /* button debouce timeout */
{
Button = LastButton; /* set button state to which button has been hit */
Buffer = MINIMUM( Buffer, UNSIGNED_INT_LIMIT );
/* prevent "button_buffer" from overflowing */
if ( CHECKBIT( ButtonStatus, BUTTON_RESET ) )
{ /* button has just been hit */
SETBIT( ButtonStatus, BUTTON_SINGLE );
CLEARBIT( ButtonStatus, BUTTON_RESET );
}
else
{
CLEARBIT( ButtonStatus, BUTTON_SINGLE );
if ( Buffer > _1SEC ) /* delay for 1s before hold is true */
SETBIT( ButtonStatus, BUTTON_HOLD );
}
}
else /* button is in debouce mode */
CLEARBIT( ButtonStatus, BUTTON_HOLD | BUTTON_SINGLE );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?