单片机作业独立按键控制4个灯的亮灭,两种方式一个扫描方式,一个中断方式

时间: 2023-06-25 07:07:55 浏览: 158
以下是基于51单片机的代码,分别实现了按键控制4个LED的亮灭的扫描方式和中断方式。 ## 扫描方式 ```c #include <reg52.h> sbit LED1 = P1^0; sbit LED2 = P1^1; sbit LED3 = P1^2; sbit LED4 = P1^3; sbit KEY1 = P3^2; sbit KEY2 = P3^3; void delay(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) { for(j=0;j<125;j++); } } void main() { unsigned char key_state = 0; // 按键状态,0表示未按下,1表示按下 unsigned char led_state = 0; // LED状态,0表示灭,1表示亮 while(1) { // 扫描按键状态 if(KEY1 == 0) // 判断KEY1是否按下 { delay(10); // 延时去抖动 if(KEY1 == 0) // 再次判断KEY1是否按下 { key_state = 1; // 设置按键状态为按下 } } else if(KEY2 == 0) // 判断KEY2是否按下 { delay(10); // 延时去抖动 if(KEY2 == 0) // 再次判断KEY2是否按下 { key_state = 0; // 设置按键状态为未按下 } } // 控制LED状态 if(key_state == 1) // 如果按键已经按下 { if(led_state == 0) // 如果LED灯是灭的 { LED1 = 1; // 点亮LED1 LED2 = 1; // 点亮LED2 LED3 = 1; // 点亮LED3 LED4 = 1; // 点亮LED4 led_state = 1; // 设置LED状态为亮 } else // 如果LED灯是亮的 { LED1 = 0; // 熄灭LED1 LED2 = 0; // 熄灭LED2 LED3 = 0; // 熄灭LED3 LED4 = 0; // 熄灭LED4 led_state = 0; // 设置LED状态为灭 } while(KEY1 == 0 || KEY2 == 0); // 等待按键释放 } } } ``` ## 中断方式 ```c #include <reg52.h> sbit LED1 = P1^0; sbit LED2 = P1^1; sbit LED3 = P1^2; sbit LED4 = P1^3; sbit KEY1 = P3^2; sbit KEY2 = P3^3; void delay(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) { for(j=0;j<125;j++); } } void key_interrupt() interrupt 0 // 定义中断函数 { static unsigned char key_state = 0; // 按键状态,0表示未按下,1表示按下 static unsigned char led_state = 0; // LED状态,0表示灭,1表示亮 if(KEY1 == 0) // 判断KEY1是否按下 { delay(10); // 延时去抖动 if(KEY1 == 0) // 再次判断KEY1是否按下 { key_state = 1; // 设置按键状态为按下 } } else if(KEY2 == 0) // 判断KEY2是否按下 { delay(10); // 延时去抖动 if(KEY2 == 0) // 再次判断KEY2是否按下 { key_state = 0; // 设置按键状态为未按下 } } // 控制LED状态 if(key_state == 1) // 如果按键已经按下 { if(led_state == 0) // 如果LED灯是灭的 { LED1 = 1; // 点亮LED1 LED2 = 1; // 点亮LED2 LED3 = 1; // 点亮LED3 LED4 = 1; // 点亮LED4 led_state = 1; // 设置LED状态为亮 } else // 如果LED灯是亮的 { LED1 = 0; // 熄灭LED1 LED2 = 0; // 熄灭LED2 LED3 = 0; // 熄灭LED3 LED4 = 0; // 熄灭LED4 led_state = 0; // 设置LED状态为灭 } } } void main() { EA = 1; // 允许中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发 while(1) { // 主函数中不需要执行任何代码 } } ```

相关推荐

最新推荐

recommend-type

51单片机单中断多按键的应用.doc

在单片机的按键编程中,有时会遇到一个问题,用多个按键来控制多个死循环,而程序一旦进入循环就跳不出来,此时会想到用中断,而普通单片机一般只有2个外部中断,stc系列的查了一下最多也只有5个外部中断,那要是...
recommend-type

独立按键控制LED灯的闪烁.doc

89C51单片机独立按键 按键控制LED灯的学习记录
recommend-type

51单片机脉冲宽度调制(PWM)控制LED灯亮度

绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯...
recommend-type

一种基于单片机的水位自动控制系统设计

本文介绍了水位自动控制系统工作的基本原理。阐述了一种基于单片机的通用水位控制系统的基本组成,并提出了该系统模块化的硬件和软件设计方法,最后,对该系统的工程应用作了评价和讨论。
recommend-type

renesas rl78单片机 BOOT_APP都开启同一个中断 操作.docx

renesas rl78单片机 BOOT_APP都开启同一个中断 操作.docx 讲解901 子母工程在boot区域和app区域使用同一个中断的操作,并且在boot区域调用app区域的函数过程。 1、boot 和app 使用同一个中断 定时器7,在boot区...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差

![MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差](https://site.cdn.mengte.online/official/2021/11/20211128213137293.png) # 1. 正态分布概述 正态分布,又称高斯分布,是统计学中最重要的连续概率分布之一。它广泛应用于自然科学、社会科学和工程领域。 正态分布的概率密度函数为: ``` f(x) = (1 / (σ√(2π))) * exp(-(x - μ)² / (2σ²)) ``` 其中: - μ:正态分布的均值 - σ:正态分布的标准差 - π:圆周率 正态分布具有以下特性: - 对称性:
recommend-type

我正在开发一款个人碳足迹计算app,如何撰写其需求分析文档,请给我一个范例

为了更全面、清晰地定义个人碳足迹计算app的需求,需求分析文档应该包含以下内容: 1.项目简介:对该app项目的概述及目标进行说明。 2.用户分析:包括目标用户群、用户需求、行为等。 3.功能需求:对app的基本功能进行定义,如用户登录、数据录入、数据统计等。 4.非功能需求:对使用app的性能和质量等进行定义,如界面设计、数据安全、可扩展性等。 5.运行环境:包括app的开发环境和使用环境。 下面是一个范例: 需求分析文档 1. 项目简介 该app项目旨在为用户提供一款方便、易用、可定制的个人碳足迹计算平台,以促进环保和可持续性发展。 2. 用户分析 目标用户群:全球关
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。