51单片机自学--矩阵按键扫描

 

看惯了千篇一律的0X55这样的代码,再来看我写的以十进制的按键扫描,是否眼前一新?

 

要说明的是,延时消抖,可用int i=350;while(i--);这两句替换.

接下来看按键定义:

 

这样就完成了矩阵按键扫描,及按键重新定义,要说明的是,要取得相加的十进制值,可以直接从送数码管显示读出,就可以对按键进行任意重新定义了.

 

 

上述的矩阵按键也可以采用中断消抖,如50-100毫秒甚至更短的时间。

 

 

其实我挺讨厌case
准备改写以前的代码,用其他方式实现同样功能。

修改以上代码不足:

#include"ShuJu_LeiXin.H"	/*头文件,数据类型定义*/
#include"YanShi.H"			/*延时函数:毫秒,1.08微秒,5微秒*/
#include"QuZhen_JianPan.H"
U8 JianZhi = 0; /*存按键值*/
extern bit k;	/*调用主文件变量*/

/*检测20个(4*4 +4)按键的键盘扫描函数,0~19数值*/
//U8 JianPan_QuZhi()
//{
//	P3 = 0xf0;/*判断哪一列被按下1111 0000 P3^0~7*/
//	if( P3 != 0xf0)
//	{
//		YanShi5us(/*消抖*/);
//			switch(P3)
//			{
//				case 0xe0:	JianZhi = 0;	break;	/*s6 s10 s14 s18*/
//				case 0xd0:	JianZhi = 1;	break;	/*s7 s11 s15 s19*/
//				case 0xb0:	JianZhi = 2;	break;	/*s8 s12 s16 s20*/				
//				case 0x70:	JianZhi = 3;	break;	/*s9 s13 s17 s21*/
//			} 
//		
//		P3 = 0x0f;/*判断哪一行被按下0000 1111 P3^0~7*/
//			switch(P3)
//			{
//				                                       /*s 6 s 7 s 8 s 9*/
//				case 0x0d:	JianZhi += 4;	    break; /*s10 s11 s12 s13*/
//				case 0x0b:	JianZhi += 8;	    break; /*s14 s15 s16 s17*/
//				case 0x07:	JianZhi += 12;	    break; /*s18 s19 s20 s21*/
//			}
//		while(P3 != 0x0f)k=1; YanShiUs(350);
//	}
//	P3 = 0xff;/*判断独立按键 1111 1111 P3^0~7*/
//	if(P3 != 0xff)
//	{
//		switch(P3)
//		{
//			case 0xfe:	JianZhi = 16;	break;
//			case 0xfd:	JianZhi = 17;	break;
//			case 0xfb:	JianZhi = 18;	break;
//			case 0xf7:	JianZhi = 19;	break;
//		}
//		while(P3 != 0xff)k=1; YanShi5us(/*松手检测*/);
//	}
//	return JianZhi;	
//}
unsigned char JianPan_ShaoMiao(/*使用行列反转扫描法,简易计算器1602显示*/)
{
	unsigned char H,L; 
	unsigned int i=350;
	P3=15;                      
	if(P3!=15)
	{
		H=P3;          
		P3=240;     
		L=P3;         
		while(P3!=240)k=1;
		while(i--);	  
	}
	P3 = 255;				
	return(H+L);        
}

unsigned char JianPan_QuZhi16()
{
        unsigned char JianZhi;
	switch(JianPan_ShaoMiao())
	{
		case 238:JianZhi = 0; break; /*s06=0 s07=4 s08=8 s09=12*/
		case 237:JianZhi = 1; break; /*s10=1 s11=5 s12=9 s13=13*/
		case 235:JianZhi = 2; break; /*s14=2 s15=6 s16=10 s17=14*/
		case 231:JianZhi = 3; break; /*s18=3 s19=7 s20=11 s21=15*/
		case 222:JianZhi = 4; break;
		case 221:JianZhi = 5; break;
		case 219:JianZhi = 6; break;
		case 215:JianZhi = 7; break;
		case 190:JianZhi = 8; break;
		case 189:JianZhi = 9; break;
		case 187:JianZhi = 10; break;
		case 183:JianZhi = 11; break;
		case 126:JianZhi = 12; break;
		case 125:JianZhi = 13; break;
		case 123:JianZhi = 14; break;
		case 119:JianZhi = 15; break;
		default: JianZhi = 255;break; 
	}
	return JianZhi;
}

unsigned char code ShaoMiaoZhi[]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
unsigned char JianPan_QuZhi()
{
	unsigned char Jian_Zhi=0,LinShi=JianPan_ShaoMiao();
	while(LinShi!=ShaoMiaoZhi[Jian_Zhi])if(++Jian_Zhi > 15)break;
	return (Jian_Zhi > 15)? 255 : Jian_Zhi;
}

 

 

 

 

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值