51单片机(V51)———独立按键、4×4矩阵按键

导读:本篇文章讲解 51单片机(V51)———独立按键、4×4矩阵按键,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、独立按键

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1)独立按键1.0

代码样例(分文件编程)

config.h

//	初始化灯端口和数码管端口
sbit L0 = P1^0;
sbit L1 = P1^1;
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;

sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;

main.c

#include<reg52.h>
#include "config.h"

void main()
{	//	1111 1111
	P1 = 0xff;	//	让P1口一开始的灯全部为高电平,也就是不亮
	while(1)
	{
		L0 = K1;	//控制第一、二个灯亮
		L1 = K1;

		L2 = K2;	//控制第三、四个灯亮
		L3 = K2;

		L4 = K3;	//控制第五、六个灯亮
		L5 = K3;

		L6 = K4;	//控制第七、八个灯亮
		L7 = K4;
	}
}

(2)独立按键2.0

消除按键抖动

config.h

//	初始化灯端口和数码管端口
sbit L0 = P1^0;
sbit L1 = P1^1;
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;

sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;

main.c

#include<reg52.h>
#include "config.h"

void delay(unsigned int xms)	//	延迟函数
{
	unsigned int i,j;
	for(i=xms;i>0;i--)
		for(j=112;j>0;j--);
}

void main()
{
	P1 = 0xff;	//	让P1口一开始的灯全部为高电平,也就是不亮
	while(1)
	{
		if(K1 == 0)	// 头一次按键,灯亮
		{
			delay(10);	//	第一次按键后延迟10xms
			if(K1 == 0)	//	再一次按下
			{
				while(K1 == 0);	// 只要按键没有松开 ,会一直卡在这里
				L0 = ~L0;	// 按久松开后,灯会一直亮
			}
		}	
	}
}

二、4X4矩阵按键

(1)所用到的位移概念:在这里插入图片描述

位运算左移、右移、异或看这:位运算解析

在这里插入图片描述

使用的方法:
在这里插入图片描述

(2)代码实现:

config.h

//	初始化端口
sbit L0 = P1^0;		
sbit L1 = P1^1;		//	led灯口初始化
sbit L2 = P1^2;
sbit L3 = P1^3;
sbit L4 = P1^4;
sbit L5 = P1^5;
sbit L6 = P1^6;
sbit L7 = P1^7;

sbit K1 = P3^4;		//	独立键盘口初始化
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;

sbit DUAN = P2^6;	//	段选口初始化
sbit WEI  = P2^7;	//	位选口初始化

main.c

#include<reg52.h>
#include "config.h"

void delay(unsigned int xms)	// 延迟函数
{
	unsigned int i,j;
	for(i=xms;i>0;i--)
		for(j=112;j>0;j--);
}

unsigned char code sz[17] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  						 	  0x7d,0x07,0x7f,0x6f,0x77,0x7c,
						  	  0x39,0x5e,0x79,0x71,0x00	 // 0-9&A-F  不显示字型码
};

void showdata(unsigned char num)		// 数码管显示函数
{
	P0 = sz[num];  //	开始段选
	DUAN = 1;	   //	传信号,让它记住
	DUAN = 0;	   //	锁死现在的状态

}

void keyhandle()
{
	unsigned char t,key;

/**********************第一行矩阵*******************/

	P3 = 0xfe;	//	1111 1110 让P3.0口输出低
	t=P3;
	t=t&0xf0;	// 1111 0000 屏蔽后四位

	if(t != 0xf0) // 说明按键有被按住
	{
		delay(10);
		t = P3;
		t = t&0xf0;
		if( t != 0xf0)
		{
			t = P3;
			switch(t)
			{
				case 0xee:
					key = 0;   // 此时为 1110 1110  S1按键被按下
					break;

				case 0xde:
					key = 1;   // 此时为 1101 1110  S2按键被按下
					break;

				case 0xbe:
					key = 2;   // 此时为 1011 1110  S3按键被按下
					break;

				case 0x7e:
					key = 3;   // 此时为 0111 1110  S4按键被按下
					break;
		
			}
			// 判断按键是否被松开
			while( t != 0xf0){
			 	t = P3;
				t = t&0xf0;

			}

			showdata(key);
		
		}
	
	}

/**********************第二行矩阵*******************/

	P3 = 0xfd;	//	1111 1101 让P3.1口输出低
	t=P3;
	t=t&0xf0;	// 1111 0000 屏蔽后四位

	if(t != 0xf0) // 说明按键有被按住
	{
		delay(10);
		t = P3;
		t = t&0xf0;
		if( t != 0xf0)
		{
			t = P3;
			switch(t)
			{
				case 0xed:
					key = 4;   // 此时为 1110 1101  S5按键被按下
					break;

				case 0xdd:
					key = 5;   // 此时为 1101 1101  S6按键被按下
					break;

				case 0xbd:
					key = 6;   // 此时为 1011 1101  S7按键被按下
					break;

				case 0x7d:
					key = 7;   // 此时为 0111 1101  S8按键被按下
					break;
		
			}
			// 判断按键是否被松开
			while( t != 0xf0){
			 	t = P3;
				t = t&0xf0;

			}

			showdata(key);
		
		}
	
	}

/**********************第三行矩阵*******************/

	P3 = 0xfb;	//	1111 1011 让P3.2口输出低
	t=P3;
	t=t&0xf0;	// 1111 0000 屏蔽后四位

	if(t != 0xf0) // 说明按键有被按住
	{
		delay(10);
		t = P3;
		t = t&0xf0;
		if( t != 0xf0)
		{
			t = P3;
			switch(t)
			{
				case 0xeb:
					key = 8;   // 此时为 1110 1011  S9按键被按下
					break;

				case 0xdb:
					key = 9;   // 此时为 1101 1011  S10按键被按下
					break;

				case 0xbb:
					key = 10;   // 此时为 1011 1011 S11按键被按下
					break;

				case 0x7b:
					key = 11;   // 此时为 0111 1011  S12按键被按下
					break;
		
			}
			// 判断按键是否被松开
			while( t != 0xf0){
			 	t = P3;
				t = t&0xf0;

			}

			showdata(key);
		
		}
	
	}

/**********************第四行矩阵*******************/

	P3 = 0xf7;	//	1111 0111 让P3.3口输出低
	t=P3;
	t=t&0xf0;	// 1111 0000 屏蔽后四位

	if(t != 0xf0) // 说明按键有被按住
	{
		delay(10);
		t = P3;
		t = t&0xf0;
		if( t != 0xf0)
		{
			t = P3;
			switch(t)
			{
				case 0xe7:
					key = 12;   // 此时为 1110 0111  S13按键被按下
					break;

				case 0xd7:
					key = 13;   // 此时为 1101 0111  S14按键被按下
					break;

				case 0xb7:
					key = 14;   // 此时为 1011 0111  S15按键被按下
					break;

				case 0x77:
					key = 15;   // 此时为 0111 0111  S16按键被按下
					break;
		
			}
			// 判断按键是否被松开
			while( t != 0xf0){
			 	t = P3;
				t = t&0xf0;

			}

			showdata(key);	//	把按键的值发给数组,让其对应的数字打印再数码管上
		
		}
	
	}

}

void main()
{
	P0  = 0;	   	//	让位存,8位同时全部显示
	WEI = 1;	//	接受信号
	WEI = 0;	// 让锁存器锁死信号	
	
	while(1)
	{
		keyhandle();	//	不断的扫描,查看按了哪个键
	}
	
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68456.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!