幸运微笑

微笑一下,世界就会变得不一样

2018年9月30日

LUCKY>

​【金沙滩51单片机开发板】简单矩阵按键扫描

本实验基于金沙滩的51单片机开发板进行

描述:当某个按键按下以后用开发板上最右边的4个LED小灯指示按键编号,灯亮表示高电平,灯灭表示低电平。如:“9”号按键被按下后,4个LED小灯状态分别为“亮、灭、灭、亮”,表示二进制1001,即数字9。

实验效果:

1538284247594.gif

实验所需要的原理图:

按键部分:

QQ截图20180930131745.jpg

LED部分:

QQ截图20180930134305.jpg

QQ截图20180930134351.jpg

QQ截图20180930134404.jpg

单片机部分:

QQ截图20180930134433.jpg

程序代码和解释:

#include<reg52.h>  //包含特殊功能寄存器定义的头文件

//定义数码管显示相关的IO接口
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

unsigned char code KeyCode[]={ //4矩阵键盘按键编码
0xE7,0xD7,0xB7,0x77,0xEB,0xDB,0xBB,0x7B,0xED,0xDD,0xBD,0x7D,0xEE,0xDE,0xBE,0x7E};

void delay(unsigned int cn);//延时cn个ms的函数声明/键盘扫描程序申明
void ScanKeyboard();
unsigned char key= 0;//初始化键值key=0,即在没有键按下时led全灭

void main()
{	
	ADDR0 = 0; 	//使能74HC138
	ADDR1 = 1;	//选中最右边的数码管来显示
	ADDR2 = 1;
	ADDR3 = 1;
	ENLED = 0;
	while(1)
	{
		ScanKeyboard();//循环扫描键盘
		P0 = ~key;//将得到的键值通过P0口输出到led显示,根据  ScanKeyboard可知 按下
		//相应的按键就会把对应的按键值赋给key这个变量比如按下1键,key = (1)D = 
		//(00000001)B,如果只想让最左边的一个灯亮,P0口应该赋值(11111110)B
		//正好和key取反得到的值相同,以此类推,只需要把P0口的值设置为key的取反即可 
	}
}

void ScanKeyboard()
{
	//键盘扫描程序

	unsigned char scan1 ,scan2,keyboard;
	unsigned char i;
	P2 = 0xf0;
	scan1 = P2;
	
	if((scan1&0xf0)!=0xf0)
	{
	
		//4条行线输出低电平,4条列线作为输出/读取列线状态
		
		//判断是否有键按下
		
		delay(10);  //延时去抖		
		scan1=P2;  //再次读取列线状态
		
		if((scan1&0xf0)!=0xf0) //再次判断是否有键按下
		{
			P2 = 0x0f;
			scan2 = P2;
			keyboard = scan1 |scan2;
			while((P2&0x0f)!=0x0f);
			for(i=0;i<=15;i++)
			{				
				//4条列线输出低电平,4条行线作为输出//读取行线状态/组合键值1/等待按键释放
								
				if(keyboard == KeyCode[i])//根据按键编码得出按键编号
				key = i;
			}
		}
	}
}

void delay(unsigned int cn)
{
	char i;
	while(cn--)
	{
		for(i = 0;i<110;i++);
	}
}

是不是很简单呐~

timg.gif


大家可以写一个按下一个密码后就开启流水灯的程序哦!

把你写得的代码上传到下方评论区吧~

来一发吐槽