单片机原理及应用:独立式键盘控制LED与多功能按键识别

这篇具有很好参考价值的文章主要介绍了单片机原理及应用:独立式键盘控制LED与多功能按键识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天来介绍另一个外设——按键与LED的配合工作,与开关不同,按键需要注意消除抖动带来的影响,代码逻辑也会更复杂一写,下面先为大家介绍独立式键盘的相关知识。

单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输入方式,由若干按键按照一定的规则组成,每一个按键实质就是一个按钮开关。而独立式键盘的各键相互独立,每个按键各接一条I/O口线,通过检测I/O输入线的电平状态,很容易地判断哪个按键被按下。

当无键按下时,通过上拉电阻,P0的 8 个I/O口引脚被上拉为高电平“ 1 ”;如果有键按下,将使对
应该键接的I/O口引脚,通过该键接地,信息为“0 ” 。
与开关不同,机械式按键在按下或释放时,由于机械弹性作用的影响 常伴随一定时间的触点机械抖 动, 然后才能稳定下来。 若有抖动,按键按下会被错误地认为是多次操作。 所以我们要在代码中执行消抖程序。
消抖程序的原理是 在检测到有按键按下时执行一个10ms左右的延时程序;再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态,从而消除抖动的影响。我现在以8位独立式键盘控制LED灯点亮作为案例,代码如下:
#include <reg52.h>     
void delay10ms(void)     //延时消抖程序,第三种delay,数量级为5~10k
{ 
   unsigned char i,j; 
   for(i=40;i>0;i--) 
     for(j=250;j>0;j--); 
} 
void main()         
{
  unsigned char x;
  P1=0xff;          //led全灭
  x=0;
  while(1)
  {
	while(x==0)     //无键被按下执行死循环,有键被按下才往下走
	{x=P0;             //第一次进入循环给x赋值,没有异常再取反恢复原值
     x=~x;}
    delay10ms();      //消抖
    x=P0;               //再次读键盘状态
	x=~x;
    if(x==0) continue;//如果无键按下则认为是按键抖动,重新扫描键盘 
	 
    switch(x)           //根据键值点亮对应的发光二极管
    {
      case 0x01: P1=0xfe; break;    //点亮第一个发光二极管
      case 0x02: P1=0xfd; break;    //点亮第二个发光二极管
      case 0x04: P1=0xfb; break;   //点亮第三个发光二极管
      case 0x08: P1=0xf7; break;   //点亮第四个发光二极管
      case 0x10: P1=0xef; break;   //点亮第五个发光二极管
      case 0x20: P1=0xdf; break;    //点亮第六个发光二极管
      case 0x40: P1=0xbf; break;   //点亮第七个发光二极管
      case 0x80: P1=0x7f; break;    //点亮第八个发光二极管
      default: break;
    }
  }
}
#include<reg52.h> 
   
sbit S1=P1^0;        		//将S1位定义为P1.0引脚
sbit S2=P1^1;        		//将S2位定义为P1.1引脚
sbit S3=P1^2;        		//将S3位定义为P1.2引脚
sbit S4=P1^3;        		//将S4位定义为P1.3引脚

unsigned char keyval;  		//定义键值储存变量单元

void led_delay(void);//第一种延时函数,流水灯延时
void delay10ms(void);//按键消抖
void key_scan(void)	;//键盘扫描
void ledstate();	 //switch封装,也可以写在主函数中
//void key(void);		 
//灯的四种变化
void forward(void);	//从上至下
void backward(void);//从下至上
void Alter(void);	//高四位与低四位互闪
void blink (void);	//全闪


void main(void)  	
{
  	keyval=0;       //键值初始化为0
 	while(1)
{		//key();
		key_scan();  			//调用键盘扫描函数
		ledstate();				//调用灯光执行程序
	}
}
void key_scan(void)			//函数功能:键盘扫描
{
 	P1=0xff;
	if((P1&0x0f)!=0x0f)   		//检测到有键按下
	{
		delay10ms();  		//延时10ms再去检测
		if(S1==0) keyval=1;    		//按键k1被按下
		if(S2==0) keyval=2;     		//按键k2被按下
		if(S3==0) keyval=3;     		//按键k3被按下
		if(S4==0) keyval=4;     		//按键k4被按下	
	}
		 
}
void forward(void)	//函数功能:正向流水点亮LED
{
	P3=0xfe; led_delay();        		//LED0亮
	P3=0xfd; led_delay();         		//LED1亮
	P3=0xfb; led_delay();         		//LED2亮
	P3=0xf7; led_delay();         		//LED3亮
	P3=0xef; led_delay();         		//LED4亮
	P3=0xdf; led_delay();         		//LED5亮
	P3=0xbf; led_delay();         		//LED6亮
	P3=0x7f; led_delay(); 				//LED7亮
 } 
void backward(void)		//函数:反向流水点亮LED
{
    P3=0x7f; led_delay();        		//LED7亮
	P3=0xbf; led_delay();        		//LED6亮
	P3=0xdf; led_delay();         		//LED5亮
	P3=0xef; led_delay();          		//LED4亮
	P3=0xf7; led_delay();         		//LED3亮
	P3=0xfb; led_delay();          		//LED2亮
	P3=0xfd; led_delay();        		//LED1亮
	P3=0xfe; led_delay();       		//LED0亮
}
void Alter(void)		//函数:交替点亮高4位与低4位LED
{
	P3=0x0f;
  	led_delay();
  	P3=0xf0;
  	led_delay();
}
void blink (void)		//函数:闪烁点亮LED
{
  	P3=0xff;
  	led_delay();
	P3=0x00;
  	led_delay();
} 
void led_delay(void)			//函数:延时
{
   unsigned char i,j;
	for(i=0;i<220;i++)
	for(j=0;j<220;j++)
	    ;
}
void delay10ms(void)	//函数:软件消抖延时10ms
{
	unsigned char i,j;
	for(i=0;i<100;i++)
	for(j=0;j<100;j++);
}
void ledstate()
{
		switch(keyval)
		{
		case 1:forward();	//键值为1,调用正向流水点亮函数
		break;
		case 2:backward();	//键值为2,调用反向流水点亮函数
		break;
		case 3:Alter();	//键值为3,调用高、低4位交替点亮函数
		break;
		case 4:blink ();	//键值为4,调用闪烁点亮函数
		break;
		}
} 
//键盘扫描和灯光操作可以合并为一个函数,还能省下sbit命名
/*void key(void)
{
P1=0xff;
if((P1&0x0f)!=0x0f)
{delay10ms();
switch(~(P1&0x0f))
      {case 0xf1:forward();	//键值为1,调用正向流水点亮函数
		break;
		case 0xf2:backward();	//键值为2,调用反向流水点亮函数
		break;
		case 0xf4:Alter();	//键值为3,调用高、低4位交替点亮函数
		break;
		case 0xf8:blink ();	//键值为4,调用闪烁点亮函数
		break; }
		}
	} */

 这里给大家展示了两个程序,第一个实例就是先检测按键的状态,然后用switch语句判断哪个键被按下,之后执行相应的点亮程序。第二个实例是把之前学过的LED点亮状态都封装成函数,然后在主程序里根据键盘的值执行相应的操作。

单片机原理及应用:独立式键盘控制LED与多功能按键识别,单片机原理及应用,单片机,计算机外设,嵌入式硬件,51单片机,proteus
实例仿真1
单片机原理及应用:独立式键盘控制LED与多功能按键识别,单片机原理及应用,单片机,计算机外设,嵌入式硬件,51单片机,proteus
实例仿真2

有两点需要注意

  1. delay10ms是到目前为止我们学习的第三个延时函数,作用是消抖,数量级为5~10k。 
  2. 为了节省空间,按键个数一般少于8个,需要用按位与“&”屏蔽不需要的引脚来防止异常电位

按键控制LED点亮

下面是多功能按键控制LED的案例,与前文不同,该案例是通过记录按键按下的次数来改变LED状态的。,在这种情况下,就需要考虑按住按键不松手的情况,以免一直进行灯光切换。

#include <reg52.h>
sbit key=P3^0; 
unsigned char ID; 
void delay10ms(void) 
{ 
  	unsigned char i,j; 
  	for(i=20;i>0;i--) 
    	for(j=248;j>0;j--); 
} 
void keyonoff()
{
		if(key==0) 		  //检测按键被按下
		{
			delay10ms();  //去抖
      		if(key==0) 
      		{ 
        		ID++;
				while(key==0); 	//防止按住不松手,等待按键释放  
        		if(ID==4) 
        		{ 
          			ID=0; 
        		} 
        		
			} 
    	}
}
void displayled()
{
    	switch(ID) 
    	{
  			case 0: P1=0x0e;break; 	//点亮D1,熄灭其它LED
      		case 1: P1=0x0d;break; 	//点亮D2,熄灭其它LED
      		case 2: P1=0x0b;break; 	//点亮D3,熄灭其它LED
      		case 3: P1=0x07;break; 	//点亮D4,熄灭其它LED
    	}  	//end switch
}
void main(void) 
{ 	P1=0x0f;
	while(1) 
  	{ 
		//按键识别程序
 		keyonoff();
		//根据按键结果,输出程序
		displayled();
  	}    	
}      		

这个模式在没有按键被按下的情况下点亮第一个LED作为标志,大家也可以自行更改case的值设置双击或全灭等操作,或者把前文封装的函数放在switch里执行更多的功能。

多功能按键控制LED点亮

 以上就是按键控制LED灯点亮的过程,之后会介绍按键控制数码管显示的案例。谢谢大家。文章来源地址https://www.toymoban.com/news/detail-812708.html

到了这里,关于单片机原理及应用:独立式键盘控制LED与多功能按键识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机原理与应用课程设计-基于51单片机的时钟日历

    摘 要 本课程设计是基于51单片机的日历时钟设计。作为嵌入式系统中常用的控制器,单片机在各种电子设备和系统中广泛应用。日历时钟作为一个常见的功能模块,在现代生活中具有重要意义。因此,设计一个基于51单片机的日历时钟,不仅有助于我们掌握单片机编程技术和

    2024年02月20日
    浏览(47)
  • 蓝桥杯 单片机原理及应用-试题汇总及答案

    单片机原理及应用-试题汇总及答案 1、单片机是将微处理器、一定容量的 RAM 和ROM以及 I/O 口、定时器等电路集成在一块芯片上而构成的微型计算机。 2、单片机89C51片内集成了 4 KB的FLASH ROM,共有 5 个中断源。 3、两位十六进制数最多可以表示 256 个存储单元。 4、89C51是以下哪

    2024年02月07日
    浏览(36)
  • 51单片机 --独立按键

    前言 前几章介绍的都是IO 口输出的使用,这一教程我们通过独立按键实验来介绍IO 口作为输入的使用。开发板上板载8 个独立按键。本教程所要实现的功能是:通过开发板上的独立按键K1 控制D1 指示灯亮灭。大家可以参考前面的实验内容。 一、按键介绍 按键是一种电子开关

    2024年02月06日
    浏览(46)
  • 51单片机(郭天祥版)——键盘检测原理及应用实现

    实验中我们使用的STC89C52 目录 前言 一、单片机是什么? 二、实验步骤 1.独立键盘检测 1.2代码如下(示例): 1.3图片 1.4视频 2.矩阵键盘检测 2.2代码如下(示例): 2.3图片 2.4视频 总结:以上就是今天要讲的内容,本文仅仅简单介绍了单片机键盘检测的应用实现,而单片机键盘

    2024年02月10日
    浏览(30)
  • 单片机原理及应用 实验五 电子秒表显示器

    单片机原理及应用(C51版) 功能: 绘制实验电路原理图,程序开始时显示“00”;当1s产生时,秒计数加1;秒表显示器计数到59后,自动从“00”开始。 目的:掌握定时/计数器的中断法工作原理,熟悉C51编程与调试方法。 步骤: 1.根据实验要求绘制所需电路原理图,如下图所

    2024年02月12日
    浏览(38)
  • 单片机原理及应用 实验三 指示灯循环控制

    单片机原理及应用(C51语言版) 实验三 指示灯循环控制 实验功能如下: 实现8个LED灯依次点亮的功能:P0.0→P0.1→P0.2→P0.3→ ┅ →P0.7→P0.6→P0.5→ ┅ →P0.0的顺序,无限循环,间隔约50ms。 环境配置: Proteus 7;Keil 步骤: 1.根据实验要求绘制电路图。   绘制时(1)选择并摆放

    2023年04月23日
    浏览(70)
  • 单片机独立按键扫描程序

    为了方便,写一些方便的程序片段以便以后使用 首先是定时器扫描按键给两个例子: 一: 二:

    2024年02月16日
    浏览(36)
  • 单片机原理与应用实验二 拆字程序(c语言版)

    (设计性实验) 掌握汇编语言设计和调试方法。 本程序一般用于把数据送显示缓冲区。设计思路是:利用DPTR寄存器做为地址指针,采用寄存器间接寻址的方式访问外部RAM。利用与操作指令从一个字节中取出需要的数据。 星研SUN ES59PA单片机实验仪和PC机。 实验内容:编程实

    2024年02月07日
    浏览(42)
  • 单片机原理及应用 实验六 双机通信与PCB设计

    单片机原理及应用(C51版) 实验目的及要求: 1.掌握串口通信工作原理及程序开发方法,熟悉ARES软件PCB设计过程; 2.按照P241图A.72绘制电路原理图1,将第6章实例2中2#机的查询法收发程序改为中断法(1#机发送过程不变)并实现原有功能; 3.采用ARES软件完成电路原理图2的PCB设计

    2024年02月06日
    浏览(35)
  • 四、51单片机控制独立按键

    按键相关知识。 1.1、按键工作原理 (1)按键内部是机械结构,也就是内部是没有电路的。按键对外表现位四个引脚,但本质上只是两个,引脚是两两连在一起的。按键按下内部引脚导通,松开内部断开。 (2)电路连接与原理图中图标。 按键一端接地,一端接单片机IO口。  (3)按

    2023年04月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包