一个案例带你了解独立式键盘设计原理

这篇具有很好参考价值的文章主要介绍了一个案例带你了解独立式键盘设计原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单片机与4个独立按键S1~S4以及8只LED指示灯构成一个独立式键盘系统。4个按键接在P1.0~P1.3引脚,P3口接8只LED指示灯,控制8只LED指示灯的亮和灭,原理图如下。当按下S1按键时,P3口的8只LED指示灯正向流水点亮;当按下S2按键时,P3口的8只LED指示灯反向流水点亮;当按下S3按键时,P3口的4只LED指示灯高低交替点亮;当按下S4按键时,P3口的8只LED指示灯闪烁点亮;

一个案例带你了解独立式键盘设计原理

 

由于本例中的4个按健分别对应4种不同的点亮功能,且具有不同的交理号"keyval" ,具体如下:

●按下S1按键时,keyval=1。

●按下S2按键时,keyval=2。

●按下S3按键时,keyval=3。

●按下S4按键时,keyval=4。

本例的独立式键盘的工作原理如下:

(1)首先判断是否有按键按下

 将接有4个按键的P1口低4位(P1.0~P1.3)写人1,使PI口低4位为输人状态。然后读入低4位的电平,只要不全为1,则说明有键按下。读取方法如下:

P1 =0xff;

i((P1&0x0f)! =0x0f);


//读人的P1口低4位各按键的状态,按位与运算后的结果

//不是0xOf,表明低4位必有1位是0,说明有键按下


(2)按键去抖动 

当判别有键按下时,调用软件延时子程序,延时约10 ms后再进行判别,若按键确实按下,则执行相应的按键功能,否则重新开始进行扫描。

(3)获得键号

 确认有键按下时,可采用扫描方法,来判断哪个键按下,并获取键值。

代码实现

1.定义按键引脚

#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;

 2. 主函数

void main()
{
	keyval=0;
	while(1)
	{
		key_scan();
		switch(keyval)
		{
			case 1:forward();
				break;
			case 2:backward();
				break;
			case 3:alter();
				break;
			case 4:blink();
				break;
		}
	}
}

3.键盘扫描函数

void key_scan()
{
	P1=0xff;
	if((P1&0x0f)!=0x0f)
	{
		delay10ms();
		if(S1==0)
		keyval=1;
		if(S2==0)
		keyval=2;
		if(S3==0)
		keyval=3;
		if(S4==0)
		keyval=4;
	}
}

 4.正向流水点亮LED

void forward()
{
	P3=0xfe;
	led_delay();
	P3=0xfd;
	led_delay();
	P3=0xfb;
	led_delay();
	P3=0xf7;
	led_delay();
	P3=0xef;
	led_delay();
	P3=0xdf;
	led_delay();
	P3=0xbf;
	led_delay();
	P3=0x7f;
	led_delay();
}

5.反向流水点亮LED函数

void backward()
{
	P3=0x7f;
	led_delay();
	P3=0xbf;
	led_delay();
	P3=0xdf;
	led_delay();
	P3=0xef;
	led_delay();
	P3=0xf7;
	led_delay();
	P3=0xfb;
	led_delay();
	P3=0xfd;
	led_delay();
	P3=0xfe;
	led_delay();
}

 6.交替点亮高低LED函数

void alter()
{
	P3=0x0f;
	led_delay();
	P3=0xf0;
	led_delay();
}

7.闪烁点亮LED函数

void blink()
{
	P3=0xff;
	led_delay();
	P3=0x00;
	led_delay();
}

 8.流水灯显示延时函数

void led_delay(void)
{
	unsigned char i,j;
	for(i=0;i<220;i++)
	for(j=0;j<220;j++);
}

9.软件消抖延时函数

void delay10ms()
{
	unsigned char i,j;
	for(i=0;i<100;i++)
	for(j=0;j<100;j++);
}

 这样我们一步步实现了独立式键盘设计。下面附上总程序。文章来源地址https://www.toymoban.com/news/detail-411865.html

#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;


void key_scan()
{
	P1=0xff;
	if((P1&0x0f)!=0x0f)
	{
		delay10ms();
		if(S1==0)
		keyval=1;
		if(S2==0)
		keyval=2;
		if(S3==0)
		keyval=3;
		if(S4==0)
		keyval=4;
	}
}

void forward()
{
	P3=0xfe;
	led_delay();
	P3=0xfd;
	led_delay();
	P3=0xfb;
	led_delay();
	P3=0xf7;
	led_delay();
	P3=0xef;
	led_delay();
	P3=0xdf;
	led_delay();
	P3=0xbf;
	led_delay();
	P3=0x7f;
	led_delay();
}

void backward()
{
	P3=0x7f;
	led_delay();
	P3=0xbf;
	led_delay();
	P3=0xdf;
	led_delay();
	P3=0xef;
	led_delay();
	P3=0xf7;
	led_delay();
	P3=0xfb;
	led_delay();
	P3=0xfd;
	led_delay();
	P3=0xfe;
	led_delay();
}

void alter()
{
	P3=0x0f;
	led_delay();
	P3=0xf0;
	led_delay();
}


void blink()
{
	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()
{
	unsigned char i,j;
	for(i=0;i<100;i++)
	for(j=0;j<100;j++);
}

void main()
{
	keyval=0;
	while(1)
	{
		key_scan();
		switch(keyval)
		{
			case 1:forward();
				break;
			case 2:backward();
				break;
			case 3:alter();
				break;
			case 4:blink();
				break;
		}
	}
}
	

到了这里,关于一个案例带你了解独立式键盘设计原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构与算法】三个经典案例带你了解动态规划

    从表中我们可以看到,最大的公共子串长度为2,一共有两个长度为2的公共子串,分别是第一个字符串的第2个字符到第3个字符和第一个字符串的第3个字符到第4个字符,即 ba 和 ac 根据上面的方法,我们来用代码封装一下求取最大公共子串的函数 function publicStr(s1, s2) { // 创建

    2024年04月09日
    浏览(95)
  • 【Hadoop】一个例子带你了解MapReduce

    写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二

    2024年02月03日
    浏览(36)
  • 一个简单的转账场景示例带你了解并发安全?

    本文转帐场景主要参考来自于极客时间 王老师的 《Java 并发编程实战》 一个简单的转账场景示例带你了解并发安全? 例如如银行业务里面的转账操作,账户 A 减少 100 元,账户 B 增加 100 元。 我们声明了个账户类:Account,该类有一个成员变量余额:balance,还有一个用于转账

    2024年01月22日
    浏览(47)
  • 【Spark】一个例子带你了解Spark运算流程

    写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二

    2024年02月11日
    浏览(42)
  • 做为一个产品经理带你了解--Axure交互和情境

                           📚📚 🏅我是bing人,一个在CSDN分享笔记的博主。📚📚                                                                  🌟在这里,我要推荐给大家我的专栏《Axure》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都

    2024年02月04日
    浏览(49)
  • 带你了解LVGL:一个开源的嵌入式图形库

    嵌入式系统是一种将计算机硬件和软件集成在一个特定的应用中的系统,例如智能手机、智能手表、汽车仪表盘等。嵌入式系统通常需要与用户进行交互,因此需要一个友好和易用的图形用户界面(GUI)。然而,开发一个高质量的GUI并不容易,因为嵌入式系统通常有限的资源

    2024年02月09日
    浏览(64)
  • 不知道该学那一个语言?一文带你了解三门语言

    名字:阿玥的小东东 学习:Python。正在学习c++ 主页:阿玥的小东东 目录 粉丝留言,回答问题 1.首先,初步了解 

    2024年02月21日
    浏览(48)
  • Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)

    1.1、案例需求 创建一个独立消费者,消费firstTopic主题中数据,所下图所示: 注意:在消费者 API 代码中必须配置消费者组 id。命令行启动消费者不填写消费者组id 会被自动填写随机的消费者组 id。 1.2、案例代码 代码 1.3、测试 在 Kafka 集群控制台,创建firstTopic主题 在 IDEA中

    2024年02月09日
    浏览(40)
  • 云原生应用开发,通过一个案例手把手带你入门

    针对云势所趋的市场发展。云计算和云原生应用已经成为主流技术趋势,学习这类技能有远见。可以开发出符合云原生运营模式的应用,满足企业业务发展需要。 实现资源的高效利用和弹性扩展。通过微服务架构、容器技术、弹性计算等手段,构建出计算资源利用高、扩展灵活的

    2024年02月06日
    浏览(70)
  • Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)

    1.1、案例需求 创建一个独立消费者,消费firstTopic主题 0 号分区的数据,所下图所示: 1.2、案例代码 生产者往firstTopic主题 0 号分区发送数据代码 消费者消费firstTopic主题 0 分区数据代码 1.3、测试 在 IDEA 中执行消费者程序,如下图: 在 IDEA 中执行生产者程序 ,在控制台观察

    2024年02月09日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包