单片机:矩阵键盘实现列扫描,数码管输出0~F

列扫描法类似行扫描法:话不多说,如下!
矩阵键盘如下图:
在这里插入图片描述


列扫描涉及到与运算:与运算符号为& ,计算规则是:有0全为0,全1才为1
	如:1111 00001011 0000进行与运算
									1111 0000
									1011 0000
								   -----------
					  运算结果:    1011 0000

   
行扫描法:假设按下的是3号键
第1步:识别键盘有无键按下
第2步,识别出哪个按键被按下。采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平。
当第1列为低电平,其余各列为高电平时,因为是3号键被按下,
第1行的行线仍处于高电平;当第2列为低电平,其余各列为高电平时,
第1行的行线仍处于高电平;直到让第4列为低电平,其余各列为高电平时,
此时第1行的行线电平变为低电平,据此,可判断第1行第4列交叉点处的按键,即3号键被按下。


#include <reg52.h>
typedef unsigned char u8;

#define KEY_PRESS  P1 //控制P1的口

unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,  
                                     0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F  

unsigned char KeyScan();//列扫描函数,返回相应的键值
unsigned char KeyPro(); //根据列扫描函数返回的键值,确定对应的按键,并返回0-15 即0-F
									 
unsigned char Value;  //保存键值


void delay(int ms) //延迟函数
{
	u8 i;
	while(ms--)
	{
		for(i=0; i<110; i++);
	}
}

void main()
{
	while(1)
	{
		delay(10);
		P0 = smg[KeyPro()];//输出选中的按键对应的键值
	}
}

unsigned char KeyScan() 
{  
	KEY_PRESS=0xf0; //令低四位(列)为0,高四位(行)为1,即1111 0000,若有按键按下,则高四位的其中一位为0          
	if(KEY_PRESS!=0xf0)//判断是否有按键按下          
	{  
		delay(10); //消抖    
		                   
		KEY_PRESS=0xf7;   //扫描第一列  
		if(KEY_PRESS!=0xf7)  
		{  
			Value=KEY_PRESS&0xf7;//进行与运算:有0全为0,全1才为1   				   	
			return Value;  
		}  
					  
		KEY_PRESS=0xfb;   //扫描第二列    
		if(KEY_PRESS!=0xfb)  
		{  
			Value=KEY_PRESS&0xfb;  				   	
			return Value;  
		}  
					 
		KEY_PRESS=0xfd;   //扫描第三列   
		if(KEY_PRESS!=0xfd)  
		{  
			Value=KEY_PRESS&0xfd;  				   	
			return Value;  
		}  
				
		KEY_PRESS=0xfe;  //扫描第四列    
		if(KEY_PRESS!=0xfe)  
		{  
			Value=KEY_PRESS&0xfe;  				   	
			return Value;  
		}  

		
	}	
	return Value;  
}  
  
unsigned char KeyPro()  
{  
	switch(KeyScan())  
	{  
		case 0x77:return 0;break;//0  
		case 0x7b:return 1;break;//1  
		case 0x7d:return 2;break;//2  
		case 0x7e:return 3;break;//3  
		
		case 0xb7:return 4;break;//4  
		case 0xbb:return 5;break;//5  
		case 0xbd:return 6;break;//6  
		case 0xbe:return 7;break;//7  
		
		case 0xd7:return 8;break;//8  
		case 0xdb:return 9;break;//9  
		case 0xdd:return 10;break;//a  
		case 0xde:return 11;break;//b  
		
		case 0xe7:return 12;break;//c  
		case 0xeb:return 13;break;//d  
		case 0xed:return 14;break;//e  
		case 0xee:return 15;break;//f  
	}  
}  

不对之处望见谅,并指出错误 ( ̄︶ ̄)↗ 在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值