单片机学习小组
直播中

王若峰

8年用户 176经验值
私信 关注

3*4按键扫描这样行不行

各位大虾,这样做按键扫描行不行的通;后面我还要显示按键值0-9和实现“确认”与“取消”功能按键界面,我还不确信这样行不行,是不是最好的
#define cancel     0x01
#define comfirm           0x02
#define function_array    0x03
#define null              0
#define uchar unsigned char
#define uint  unsigned int
//uint8 disp_code[4],key_buf[4],room_buf[4];
//uint8 idata data_buff[16],idata call_number_buf[12];
/********************************************************************************************
* 函数名称:Key_Idle()
* 功    能:键盘松开
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Key_idle()
{
   while( ( P1 & 0x0f ) != 0x0f );
}
//*****************************************************************************************
//函数名称:Key_scan()按键输入扫描
//入口参数:无
//出口参数:无
//******************************************************************************************/
uchar Key_scan()
{
   uchar line,lie,value;
   int key;
   P1=0x0f;
   line=P1&&0x0f;
   if(line!=0x0f)
   {
    delay(50);
if(line!=0x0f)
line=P1&&0x0f;
1=line|0xf0;
lie=P1&&0xf0;
if(lie!=0xf0)
{
  delay(50);
  if(lie!=0xf0)
  lie=P1&&0xf0;
     value=line+lie;
  
}
   }
   Key_idle();
   switch(value)
   {
      case 0xd7: key=0;break;
   case 0xee: key=1;break;
   case 0xce: key=2;break;
   case 0xbe: key=3;break;
   case 0xed: key=4;break;
   case 0xdd: key=5;break;
   case 0xbd: key=6;break;
   case 0xeb: key=7;break;
   case 0xdb: key=8;break;
   case 0xbb: key=9;break;      //0-9
   case 0xe7: return comfirm;break;    //确认键
   case 0xd7: return cancel;break;    //取消健
   default : return null;
   }
}

回帖(2)

h1654155275.5697

2019-2-22 09:49:02
一定要最好就很难说了.所谓山外有山,你认为最好了,也许和别人的比起来差一截...
给你个建议:能满足需求就好.
举报

阿信509

2019-2-22 11:39:54
我的按键扫描从来都不会用延时防抖,都是定时扫描,你这个明显实时性不行
举报

更多回帖

发帖
×
20
完善资料,
赚取积分