注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
嘤鸣求友的个人空间 https://home.eeworld.com.cn/space-uid-464483.html [收藏] [复制] [分享] [RSS]
日志

按键去抖问题【结合 中断、串口通讯等】

已有 2038 次阅读2012-12-25 19:34

/******************************************************************************
XWWK-CC2530A模块外部中断测试程序+XWWK-CC2530A模块串口测试程序+IO测试程序
Filename:     CC2530EXINTest.c
Target:       cc2530
Revised:      2012年12月25日
Revision:     1.0
Description:
   通过按键P1.2中断方式,改变指示灯的状态。 按一下,LED等显示为方式二,再按一下为方式一,然后循环,但是有时按一下按键状态改变2次,不知是不是按键去抖没做好?

源程序只有串口通讯功能,中断按键什么的都是自己加的,估计是什么地方没有考虑到吧,请各位前辈多多指点
******************************************************************************/

#include
#include

#define uint  unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define RLED   P1_0          //定义LED1为P10口控制
#define YLED   P1_1          //定义LED2为P11口控制
#define KEY1   P1_2       //定义按键为P01口控制
//函数声明
void Delay(uint);                //延时函数声明
void Initial(void);                //初始化函数声明
void InitKey(void);             //初始化按键函数声明
uchar KeyScan(void);            //按键扫描函数声明

uchar Keyvalue = 0 ;                //定义变量记录按键动作
uint  KeyTouchtimes = 0 ;           //定义变量记录按键次数
uint flag=1;


void initUARTSEND(void);
void UartTX_Send_String(char *Data,int len);

char Txdata[25]=\"按键控制串口测试-然\\n1\\n\";
/****************************
//延时
*****************************/
void Delay(uint n)
{
        uint i;
        for(i = 0;i         for(i = 0;i         for(i = 0;i         for(i = 0;i         for(i = 0;i }
/****************************************************************
   串口初始化函数                               
****************************************************************/
void initUARTSEND(void)
{

    CLKCONCMD &= ~0x40;                          //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                     //等待晶振稳定
    CLKCONCMD &= ~0x47;                          //设置系统主时钟频率为32MHZ


    PERCFG = 0x00;                                //位置1 P0口
    P0SEL = 0x3c;                                //P0_2,P0_3,P0_4,P0_5用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0

    U0CSR |= 0x80;                                //UART方式
    U0GCR |= 9;                                       
    U0BAUD |= 59;                                //波特率设为19200
    UTX0IF = 0;                                 //UART0 TX中断标志初始置位0
}
/****************************
//初始化按键为中断输入方式
*****************************/
void InitKeyINT(void)
{
  P1INP |= 0x04; //上拉   
  P1IEN |= 0X04;   //P12设置为中断方式
  PICTL |= 0X01;   //下降沿触发

  IEN2 |= 0X10;   // P1设置为中断方式;
  P1IFG |= 0x00;   //初始化中断标志位
  EA = 1; //使能总的中断
}
/****************************************************************
串口发送字符串函数                       
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
  int j;
  for(j=0;j   {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}
/****************************
//初始化程序,将P10、P11 定义为输出口,并将LED灯初始化为灭
*****************************/
void InitIO(void)
{
    P1DIR |= 0x03; //P10、P11、P14定义为输出
    RLED = 0;
    YLED = 0;        //LED灯初始化为灭
}
/****************************
//中断处理函数
*****************************/
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
   int i;

   if(P1IFG>0)            //按键中断
   {
     P1IFG = 0;
     Delay(100);  
     if(P1IFG==0)         //按键中断
     {
       Delay(100);
       KeyTouchtimes=!KeyTouchtimes;
//       for(i=0;i<30;i++)Txdata=\' \';   //【加上此句串口只显示“方式1”    】
       if(KeyTouchtimes)
       {

         strcpy(Txdata,\"方式1\\n \");       //将UART0 TX test赋给Txdata;
         flag=2;
         UartTX_Send_String(Txdata,strlen(Txdata)); //串口发送数据
       }
       else
       {
       //  for(i=0;i<30;i++)Txdata=\' \';
         strcpy(Txdata,\"方式2\\n\");       //将UART0 TX test赋给Txdata;
         flag=1;  //每次中断发生时记录按键次数加1
         UartTX_Send_String(Txdata,strlen(Txdata)); //串口发送数据
       }
     }  
   }      
   P1IF = 0;             //清中断标志
}
/***************************
//主函数
***************************/
void main(void)
{
  uchar i;
  InitIO();       
  InitKeyINT();               //调用初始化函数
  initUARTSEND();
  UartTX_Send_String(Txdata,25);                //
  for(i=0;i<30;i++)Txdata=\' \';
  while(1)
  {
    if(flag == 1)       //按键设置为 LED2,LED1流水闪烁
    {

      YLED = !YLED;           
      Delay(20000);            
      RLED = !RLED;           
      Delay(20000);
      //KeyTouchtimes++;        
    }
    if(2 == flag)
    {
      YLED = !YLED;           
      //Delay(20000);            
      RLED = !RLED;           
      Delay(20000);
            YLED = !YLED;           
      //Delay(20000);            
      RLED = !RLED;           
      Delay(20000);
            YLED = !YLED;           
      //Delay(20000);            
      RLED = !RLED;           
      Delay(20000);
     // KeyTouchtimes = 0;   
    }

  }
}
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册