IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 一个案例带你了解独立式键盘设计原理 -> 正文阅读

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

单片机与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++);
}

?这样我们一步步实现了独立式键盘设计。下面附上总程序。

#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;
		}
	}
}
	
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:50:48  更:2022-10-17 12:50:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:47:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码