键盘输入

一、独立键盘输入

使用到C语言中的if语句,键盘输入检测方法,轮询法

按键电路图(查找串口,命名)
在这里插入图片描述
记得在头文件中,将各个引脚命名好
P3引脚属于自己在头文件bstv51.h中进行位定义
sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7;

独立键盘

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

void main()
{
   bstv51_init();  //开发板初始化函数
   while(1)
   {
	   if(k1==0)//判断是否为0(低电平),低就是已经按下    (按下为低电平---0)
	   {
	   		L0=0;   //若是 ,点灯L0
	   }
	   else
	   {
	   L0=1;
   		}
	}
}
改进(有进行防抖动的判断)
#include <reg52.h>
#include"bstv51.h"

void delay(uint x)          //延迟函数,用来等会判断抖动
{
	int i,j;
	for(i=x;i>0;i--)
		for(j=112;j>0;j--)
		;
}

void main()
{
   bstv51_init();//初始化板
   while(1)
   {
	   if(k2==0)//判断是否按下
	   {
	   		delay(5);  //进行延迟,抖动判断(一般为5-10ms)
	   		if(k2==0)	//延迟后确实的确按下,就执行亮灯的操作
			{
			L0=~L0;   //此处采用了【~】反转。
					  //即按下进行一次亮灯/灭灯的操作,再次按下进行的操作与上一次相反
			}
		
	   }
	   if(k3==0)//判断是否按下k1
	   {
	   		delay(5);  //进行延迟,防抖动
	   		if(k3==0)	//确认还是按下,就执行亮灯的操作
			{
			L2=~L2;
			}
		
	   }
	  
	}
}

二,矩阵键盘输入(单片机入门重点)

如果使用3x3矩阵,需要6个I/O口;使用4x4矩阵,需要8个I/O口,使用5x5矩阵,需要10个I/O口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
位运算不改变参与运算的变量的值,要改变值就要进行赋值操作。
【位与—&】【逻辑与—&&】
【位或—|】【逻辑或—||】
逻辑运算结果就只有0和1
位运算是8位二进制进行运算,结果也是8位二进制

任何数等于,任何数与上1等于它本身。&
任何数1等于1,任何数或上0等于它本身。 |

{eg. P0=P0&0xfe 结果就是1111 1110 (0xfe=1111 1110)}

思路:1使用数组对数码管的字型码进行输入
2延迟函数防抖动
3数码管显示函数(段选,位选,使能端)
4按键扫描函数

//矩阵键盘 第一列的使用
#include<reg52.h>
#include"bstv51.h"
uchar code s[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void delay(uint x)
{
	uint i,j;
	for(i=x;i>0;i--)
		for(j=112;j>0;j--)	   ;
}

void display(uchar n)//数码管显示函数,段选,具体显示的东西
{
	P0=s[n];
	DU=1;
	DU=0;  //锁存芯片
}


void sm()	//按键扫描函数
{
	uchar t,k;
	P3=0xfe;//0xfe=1111 11110;要第一口P3^0输出为0.低电平
	t=P3;//读取串口数据
	t=t&0xf0;//{利用位与}0xf0=1111 0000,主要是判断前四位的状态,1与任何数=任何数本身,同时屏蔽后四位,0与任何数=0
	if(t!=0xf0)      //判断四个输出端口都不等于1,即没有有按键按下
	{		         //如果被按下,执行下面的内容
		delay(5);   //进行防抖
		t=P3;        //把读到的端口值重新拿来判断
		t=t&0xf0;    //进行同样的屏蔽操作
		if(t!=0xf0)  //确认真的按下
		{
			t=P3;    //读值,再次进行判断,存在t这个变量里面
			switch(t)
			{
				case 0xee:k=0;break;//1110 1110
				case 0xde:k=1;break;//1101 1110
				case 0xbe:k=2;break;//1011 1110
				case 0x7e:k=3;break;//0111 1110
			}

			while(t!=0xf0)//进行判断按键是否松开按键,=0xfe/1111 1110就是松开的时候以及同样的屏蔽操作
			{			  //一旦松开,就=fe了,执行操作
				t=P3;
				t=t&0xf0;
			}
			display(k);
		}

	}
}

void main()
{
	 bstv51_init();	 //初始化开发板
	 P0=0;           //数码管	   位选
	 WE=1;
	 WE=0;
	 while(1)
	 {
		sm();
	 }




}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值