new0001.c

来自「p89lpc915程序」· C语言 代码 · 共 60 行

C
60
字号
/*其他:我的按键扫描程序 [雨玄] 2005-8-21 14:54:06
 * 晶体:            7.3728MHZ
 * 看门狗:         安全极别2-常开    2.1秒溢出 
 * 日期:            04年7月
 */

#define key_bound 0x07              //占用3个口p0-p2
#define key_init 0x05               //按键的初始状态PB0,PB2-上拉,PB1高有效
#define key_port (PINB&key_bound)     //读PB口

unsigned char Task_bz=key_bound;                //按键任务标志,按下相应位置,开时为1
unsigned char KeyState=key_init;                //按键的状态
static unsigned char KeyTask,KeyVal;
static unsigned char KeyTime;                    //按键去接抖动计数器
static unsigned char DealKey;                    //按键处理标志
/********************************************
*函数说明:扫描按键
*程序说明:每100US定时到扫描一次按键端口?
*参数:无
*返回:无
********************************************/    
void scan_key(void)
{
unsigned char keybitstate;
switch(KeyTask)
        {
        case 0:     if(key_port!=KeyState) //检测到按键有变化           
                                  {               
                                        KeyVal=key_port;//把键值读进
                                        KeyTime=50;     //去抖动计数器
                                        KeyTask++;
                                    }
                    break;
        case 1:    //去抖动
                     if(key_port==KeyVal)   //比较每次读到键值,相等?
                                  { 
                                   KeyTime--;//计数器减1
                                   if(!KeyTime) KeyTask++;
                                   }
                     else           //如果不相等返到0重新开始读
                                    KeyTask=0;
                     break;
        case 2:     
                     //当按键输入口有触发时,与keybitstate对应的位为1,放开为0
                      keybitstate=KeyVal^key_init;
                      if(keybitstate&Task_bz)          //判断是否新触发
                                     {                
                                      DealKey=TRUE;    //按键处理标志置位
                                      }
                     KeyState=KeyVal;                 //把读到的键的状态存在器
                    //Task_bz有按键按下未放开时相应位置0,放开时为1.
                    Task_bz =(key_bound^keybitstate); 
                    KeyTask=0;        
                     //返回第一步,等待按键状态改变
                    break;
                }
        }
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?