⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xbjikeyboadone.c

📁 洗包机键盘中断及采样子程序
💻 C
字号:
#include "interface.h"



#if KEYBOARD_EN   //键盘操作的条件编译


////////////////////////////////////////////////////////////////
//键值全局变量定义
unsigned char c_key_value;//当前键值
unsigned char c_key_valueP1;//当前键值


//###########################################################################################
//键盘驱动操作


/////////////////////////////////////////////////////////////////
//功能:获取当前键值
//注:
unsigned char get_key(void)
{
  unsigned char key;
  //
  key=c_key_value;
  c_key_value=NOKEY;//
  return(key);
}

unsigned char get_keyP1(void)
{
  unsigned char key;
  //
  key=c_key_valueP1;
  c_key_valueP1=NOKEY;//
  return(key);
}



/////////////////////////////////////////////////////////////////
//功能:初始化键盘
//
void keyboard_ins(void)
{
  //
  out_port_bit(KH1,0);//SET 0
  out_port_bit(KH2,0);//SET 0
  out_port_bit(KH3,0);//SET 0
  
  in_port_bit(KV1);
  in_port_bit(KV2);
  in_port_bit(KV3);
  //
  op_p1p2_I(KV1,1); //开中断
  op_p1p2_I(KV2,1); //开中断
  op_p1p2_I(KV3,1); //开中断
  
  P1DIR&=0xfd;
  P1IE|=0x02;//开中断
  P1IES&=0xfd;//上升沿
  P1IFG&=0xfd;
  
  c_key_valueP1=NOKEY;//

  c_key_value=NOKEY;//
  
  
  //开总中断允许 GIE set 1
  _BIS_SR(GIE);//
  
}

/////////////////////////////////////////////////////////////////
//功能:用于主程序中,当没有键按下时,开键盘中断
//
void open_keyboard(void)
{
  //
  //unsigned char i;
  //i=P1IN;
  //i=P1IN;
  
  //P2
  if((P2IN&0x60)==0x60){
    //没有键按下,开键盘中断
    P2IFG&=0x9f;
    P2IE|=0x60;
  }
}


/////////////////////////////////////////////////////////////////
//功能:用于主程序中,当没有键按下时,开键盘中断
//
void open_keyboardP1(void)
{
  if((P1IN&0x02)==0x00){
    //没有键按下,开键盘中断
    P1DIR&=0xfd;
    P1IES&=0xfd;//上升沿中断触发
    P1IFG&=0xfd;//中断标志
    P1IE|=0x02;//中断功能
  }
}



/////////////////////////////////////////////////////////////////
//功能:打开或关闭P1、P2口中指定位的中断功能
//入口参数:port端口----如P32==0x32;输出值----0x01为置位 0x00为清零.
//          value:为1打开,为0关闭
//注:
void op_p1p2_I(unsigned char port,unsigned char value)
{
  unsigned char i,j;
  i=port&0x0f;
  i=0x01<<i;
  j=i;
  i=~i;
  if(value){
    // ==0x01 开中断
    switch(port&0xf0){
      case 0x10://P1
        P1IES|=j;
        P1IFG&=i;
        P1IE|=j;
        break;
      case 0x20://P2
        P2IES|=j;
        P2IFG&=i;
        P2IE|=j;
        break;
    }
  }
  else{
    // ==0x00 关中断
    switch(port&0xf0){
      case 0x10://P1
        P1IE&=i;
        break;
      case 0x20://P2
        P2IE&=i;
        break;
    }
  }
  
}

/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序  ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中

//interrupt[PORT2_VECTOR] void Port2_interrupt(void)
interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
  P1IE&=0xfd;
  P1IFG&=0xfd;//清标志位
  clr_WDT();//清WDT
  c_key_valueP1=scan_boardP1();

  if((P1IN&0x02)==0x00){
    //没有键按下,开键盘中断
    P1DIR&=0xfd;
    P1IES&=0xfd;
    P1IFG&=0xfd;
    P1IE|=0x02;
  }
  
  c_key_value=scan_board();
  //清标志位
  op_p1p2_I(KV1,1); //开中断
  op_p1p2_I(KV2,1); //开中断
  op_p1p2_I(KV3,1); //开中断
}

/////////////////////////////////////////////////////////////////
//功能: 用于键盘操作中的取键值
//注:在有键按下时调用该函数取值
//注:CEN20051231时修改,由于将MCLK=DCOCLK,所以延时由20mS改为4mS。已作测试及高低温实验。

unsigned char scan_boardP1(void)
{
  unsigned char tk;

  delay_1us(4000);//4mS  cen20051230
    
  //开始取键值
  tk=P1IN;
  tk=P1IN;
  if((tk&0x02)==0x02){
    tk=0x01;
  }
  else{
    tk=0;
  }
   return(tk);
}



/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序  ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中

//#pragma vector=PORT1_VECTOR
//__interrupt void Port1_interrupt(void)
/*interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
  c_key_value=scan_board();
  //清标志位
  op_p1p2_I(KV1,1); //开中断
  op_p1p2_I(KV2,1); //开中断
  op_p1p2_I(KV3,1); //开中断
}*/


/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序  ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中
/*interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
  c_key_value=scan_board1();
  //清标志位
  P1DIR&=0xfd;
  P1IES&=0xfd;
  P1IFG&=0xfd;
  P1IE|=0x02;
}
*/

/////////////////////////////////////////////////////////////////
//功能:P2口中断服务程序  ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中

//#pragma vector=PORT2_VECTOR
//__interrupt void Port2_interrupt(void)
interrupt[PORT2_VECTOR] void Port2_interrupt(void)
{
  P2IE&=0x1f;
  P2IFG&=0x1f;//清标志位
  c_key_value=scan_board();

  if((P2IN&0x60)==0x60){
    //没有键按下,开键盘中断
    P2IFG&=0x9f;
    P2IE|=0x60;
  }
}

/////////////////////////////////////////////////////////////////
//功能: 用于键盘操作中的取键值
//注:在有键按下时调用该函数取值
//注:CEN20051231时修改,由于将MCLK=DCOCLK,所以延时由20mS改为4mS。已作测试及高低温实验。
unsigned char scan_board(void)
{
  unsigned char tk;
  
  //delay_1us(20000);//延时20mS
  delay_1us(4000);//4mS  cen20051230
    
  //开始取键值
  out_port_bit(KH1,0);//SET 0
  out_port_bit(KH2,1);//SET 1
  out_port_bit(KH3,1);//SET 1
  
  tk=in_port_bit(KV3);
  tk=tk<<1;
  tk=tk+in_port_bit(KV2);
  tk=tk<<1;
  tk=tk+in_port_bit(KV1);
  tk=~tk;
  tk=tk&0x07;
  if(tk>0){
    tk=tk+0x10;//KH1
  }
  else{
    out_port_bit(KH1,1);//SET 1
    out_port_bit(KH2,0);//SET 0
    out_port_bit(KH3,1);//SET 1
    tk=in_port_bit(KV3);
    tk=tk<<1;
    tk=tk+in_port_bit(KV2);
    tk=tk<<1;
    tk=tk+in_port_bit(KV1);
    tk=~tk;
    tk=tk&0x07;
    if(tk>0){
      tk=tk+0x20;//KH2
    }
    else{
      out_port_bit(KH1,1);//SET 1
      out_port_bit(KH2,1);//SET 1
      out_port_bit(KH3,0);//SET 0
      tk=in_port_bit(KV3);
      tk=tk<<1;
      tk=tk+in_port_bit(KV2);
      tk=tk<<1;
      tk=tk+in_port_bit(KV1);
      tk=~tk;
      tk=tk&0x07;
      if(tk>0){
        tk=tk+0x30;//KH3
      }
    }
  }
  
   //KV 值取值
   if((tk&0x0f)==0x04){
      tk=tk&0xf0;
      tk=tk+0x03;
   }
   
  out_port_bit(KH1,0);//SET 0
  out_port_bit(KH2,0);//SET 0
  out_port_bit(KH3,0);//SET 0
   
   return(tk);
}



#endif     //键盘操作的条件编译










⌨️ 快捷键说明

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