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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 五、独立按键的基本操作与扩展应用 -> 正文阅读

[嵌入式]五、独立按键的基本操作与扩展应用

目录

1、独立按键的基本应用

代码:

while用法:

1、按下灯亮,松开熄灭

2、按下灯亮,再次按下熄灭

2、独立按键的扩展应用


1、独立按键的基本应用

(独立按键:J5跳线帽接到2、3脚)

J5跳线帽接到2、3引脚,使按键S4~S7四个按键的另外一段接地从而成为4个独立键盘。在扫描按键的过程中,发现有按键触发信号后,先做消抖处理,当确认按键按下时,才进行相应的功能处理。

按下S7、S6、S5、S4分别点亮L1、L2、L3、L4指示灯,松开按键熄灭,消抖处理。

代码:

#include "reg52.h"

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

void DelayKey(unsigned char t)
{
	while(t--);
}

void InitHC138(unsigned char n)
{
	switch (n)
	{
		case 4://8路LED
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 0;
		break;
		case 5://蜂鸣器与继电器
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 1;
		break;
		case 6://数码管位置
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 0;
		break;
		case 7://数码管段选
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 1;
		break;
	}
}

void ScanKeys_Alone()
{
	InitHC138(4);
	P0 = 0xff;
	if (S7 == 0)
	{
		DelayKey(100);
		if(S7 == 0)
		{
			L1 = 0;
			while(!S7);//条件成立,为真1,程序停留在while(1)处
			L1 = 1;    //条件不成立,为假0,while(0)不执行
		}
	}
	if (S6 == 0)
	{
		DelayKey(100);
		if(S6 == 0)
		{
			L2 = 0;
			while(!S6);
			L2 = 1;
		}
	}
	if (S5 == 0)
	{
		DelayKey(100);
		if(S5 == 0)
		{
			L3 = 0;
			while(!S5);
			L3 = 1;
		}
	}
	if (S4 == 0)
	{
		DelayKey(100);
		if(S4 == 0)
		{
			L4 = 0;
			while(!S4);
			L4 = 1;
		}
	}
}

void main()
{
	while(1)
	{
		ScanKeys_Alone();
	}
}

while用法:

1、按下灯亮,松开熄灭

if (S7 == 0)
	{
		DelayKey(100);
		if(S7 == 0)
		{
			L1 = 0;
			while(!S7);//条件成立,为真1,程序停留在while(1)处
			L1 = 1;    //条件不成立,为假0,while(0)不执行
		}
	}
if (S5 == 0)
	{
		DelayKey(100);
		if (S5 == 0)
		{
			if (flat == 1)
			{
				L3 = 0;
				while(!S5);
				L3 = 1;
			}
			else if (flat == 2)
			{
				L5 = 0;
				while(!S5);
				L5 = 1;
			}
		}
	}

2、按下灯亮,再次按下熄灭

if (S7 == 0)
	{
		DelayKey(100);
		if (S7 == 0)
		{
			if (flat == 0)
			{
				L1 = 0;			//S7按下,L1亮
				flat = 1;		//L1亮的状态
			}
			else if (flat == 1)
			{
				L1 = 1;			//L1灭
				flat = 0;
			}
			while(!S7);
		}

while(条件);

①条件成立,为真(1),一直停留在while(1)处执行循环;

(S7=0按键按下。!S7=1,while(1)死循环一直执行,不执行L1=1,灯亮

②条件不成立,为假(0),跳出循环,不执行while(0)。

S7=1按键没有按下。!S7=0,while(0)循环不执行跳出循环,执行L1=1,灯灭

2、独立按键的扩展应用

S7、S6为选择键,确定控制键控制哪组LED指示灯;S5、S4为控制键,按下点亮指定的LED指示灯,松开熄灭

①按下S7点亮L1,L1点亮后,S6不响应操作,S5控制L3S4控制L4

再次按下S7,L1熄灭,S6可响应操作。

②按下S6点亮L2,L2点亮后,S7不响应操作,S5控制L5S4控制L6

再次按下S6,L2熄灭,S7可响应操作。

③S7、S6未按下时,即L1、L2未点亮时,S5、S4不响应操作(未作LED区域选择时,控制键不能操作)

#include "reg52.h"

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;
sbit L5 = P0^4;
sbit L6 = P0^5;

unsigned char flat = 0;

void SelectHC573(unsigned char channel)	   
{
  	switch(channel)
	{
	   case 4:
	     P2 = (P2 & 0x1f) | 0x80;
		 break;
	   case 5:
	     P2 = (P2 & 0x1f) | 0xa0;
		 break;
		 case 6:
	     P2 = (P2 & 0x1f) | 0xc0;
		 break;
		 case 7:
	     P2 = (P2 & 0x1f) | 0xe0;
		 break;
	}
}

void InitHC138(unsigned char n)
{
	switch (n)
	{
		case 4://8路LED
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 0;
		break;
		case 5://蜂鸣器与继电器
			HC138_C = 1;
			HC138_B = 0;
			HC138_A = 1;
		break;
		case 6://数码管位置
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 0;
		break;
		case 7://数码管段选
			HC138_C = 1;
			HC138_B = 1;
			HC138_A = 1;
		break;
	}
}

void DelayKey(unsigned char t)
{
	while(t--);
}

void InitSystem()
{
	InitHC138(5);
	P0 = 0x00;
}

void ScanKeys_()
{
//按下S7点亮L1;再次按下S7,L1熄灭
	if (S7 == 0)
	{
		DelayKey(100);
		if (S7 == 0)
		{
			if (flat == 0)
			{
				L1 = 0;			//S7按下,L1亮
				flat = 1;		//L1亮的状态
			}
			else if (flat == 1)
			{
				L1 = 1;			//L1灭
				flat = 0;
			}
			while(!S7);
		}
	}

//按下S6点亮L2;再次按下S6,L2熄灭	
	if (S6 == 0)
	{
		DelayKey(100);
		if (S6 == 0)
		{
			if (flat == 0)
			{
				L2 = 0;			//S6按下,L2亮
				flat = 2;		//L2亮的状态
			}
			else if (flat == 2)
			{
				L2 = 1;			//L2灭
				flat = 0;
			}
			while(!S6);
		}
	}
	
//S5,控制L3(S7,flat=1)、L5(S6,flat=2)	
	if (S5 == 0)
	{
		DelayKey(100);
		if (S5 == 0)
		{
			if (flat == 1)	//按下S7,S5控制L3
			{
				L3 = 0;
				while(!S5);
				L3 = 1;
			}
			else if (flat == 2)//按下S6,S5控制L5
			{
				L5 = 0;
				while(!S5);
				L5 = 1;
			}
		}
	}
	
//S4,控制L4(S7,flat=1)、L6(S6,flat=2)	
	if (S4 == 0)
	{
		DelayKey(100);
		if (S4 == 0)
		{
			if (flat == 1)	//按下S7,S5控制L3
			{
				L4 = 0;
				while(!S5);
				L4 = 1;
			}
			else if (flat == 2)//按下S6,S5控制L5
			{
				L6 = 0;
				while(!S5);
				L6 = 1;
			}
		}
	}	
	
}

void main()
{
//	InitSystem();
	SelectHC573(4);
//	InitHC138(4);
	while(1)
	{
		ScanKeys_();
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:04:46  更:2022-01-28 12:05:15 
 
开发: 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/26 10:21:33-

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