一种矩阵按键扫描方法,很简略

去年大一比赛,因为时间问题,还有程序得现场手打,找老师要过他的程序,这种矩阵按键的确挺好用的,而且代码量不大。当时比赛4个小时,各种底层驱动还要自己手打,时间还是挺紧张的,当时功能要求都勉强写完了。

一般我程序不另作介绍,一般都写在注释里了,平常没太多时间。不过这个程序还真没注释……矩阵按键解释起来感觉很麻烦。

接法就按行P口低四位,列高4位接。

#define uchar unsigned int char
uchar key_s=0, key_v=0;
uchar code key_code[]       //键值表
={0xff,0xee,0xde,0xbe,0x7e,	// 无, K1, K2, K3,K4
  0xed,0xdd,0xbd,0x7d,      // K5, K6, K7,K8
  0xeb,0xdb,0xbb,0x7b,      // K9, K10, K11,K12
  0xe7,0xd7,0xb7,0x77};     // K13, K14, K15,K16

void Delay10ms()   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

/*************************************************************
 键盘扫描函数---无键按下或按键未释放返回0,否则返回1
 key_s --- 键号, 用于标识当前按下的闭合键,无键按下为0
 key_code---键值表 
*************************************************************/	
bit scan_key()
{
  uchar i,j,k;
  P2=0xf0;
  j=P2;
  j&=0xf0;
  P2=0x0f;
  k=P2;
  k&=0x0f;
  j=j|k;
  for(i=0;i<=16;i++)
  if (j==key_code[i])
  {
   key_s=i;
   break;
   }
  else key_s=0;
  return(key_s ^ key_v);
}

/*以下是调用方法,和独立按键差不多*/
//void ks()
//{
//	if(scan_key())
//	   {
//				Delay10ms();//软件去抖
//		 if(scan_key())
//		  {
//		   key_v= key_s;
//				if(key_v==2)        //当S2按下时
//			{
//				
			}
//					if(key_v==3)       //当s3
//					{

//					}
//		}
//	}
//}

注意把数码管,按键扫描之类的用定时器按一定时间分配运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘零翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值