51单片机矩阵键盘

51单片机矩阵键盘

行列扫描法
①所有的行线置高电平,依次对列线进行扫描。
②将第一列置低电平,P1.0=0
③若检测到行线P1.4=0,则K0键被按下。
同理若P1.5=0,则K4被按下。

Pertues仿真图
在这里插入图片描述
在这里插入图片描述
C程序

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

unsigned char code table[]=
{
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
	0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
}; 

void Delay400us()		//@11.0592MHz
{
	unsigned char i;
	_nop_();
	i = 181;
	while (--i);
}
void main()
{  
   uchar TMP,NUM;
   P1=0xF0;          //行线置低电平,列线置高电平
   TMP=P1;
   if((TMP&P1)!=0xF0)
   //如果列线为低电平,则说明有键按下
   Delay400us();
   while((TMP&P1)!=0xF0)
   {
       P1=0xFE;         //第一列置低电平
	   TMP=P1;
	   switch(TMP)
	   { 
	     case 0xEE:NUM=0;
	     break;
	     case 0xDE:NUM=4;
	     break;
	     case 0xBE:NUM=8;
	     break;
	     case 0x7E:NUM=12;
	     break;
	    }
		  P1=0xFD;        //第二列置低电平
			TMP=P1;
			switch(TMP)
			{
			 case 0xED:NUM=1;
		   break;
			 case 0xDD:NUM=5;
		   break;
			 case 0xBD:NUM=9;
		   break;
		   case 0x7D:NUM=13;
		   break;
			}
			P1=0xFB;        //第三列置低电平
			TMP=P1;
			switch(TMP)
			{
			 case 0xEB:NUM=2;
		   break;
			 case 0xDB:NUM=6;
		   break;
		   case 0xBB:NUM=10;
		   break;
			 case 0x7B:NUM=14;
		   break;
			}
			P1=0xF7;         //第四列置低电平
			TMP=P1;
			switch(TMP)
			{
			 case 0xE7:NUM=3;
		   break;
			 case 0xD7:NUM=7;
		   break;
			 case 0xB7:NUM=11;
		   break;
			 case 0x77:NUM=15;
		   break;
			}
	     P2=~table[NUM];   
	     //查表得对应的键码,给数码管显示
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值