当前位置: 首页 > ops >正文

第三节 独立按键模块

目录

一、独立按键介绍

二、C语言知识

1.C51数据运算 

2.C51基本语句

三、程序设计

1、独立按键控制LED灯 

2、独立按键控制LED状态

3、独立按键控制LED显示二进制

4、独立按键控制LED位移

一、独立按键介绍

  1. 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。

 2、C51单片机的独立按键(左下角)

注意:

  1. 按键按下时低电平为0,没有按下时是高电平为1。
  2. K1P3_1口,K2P3_0口,顺序上是反过来的

3、电路原理图

        当按键K1按下时, K1为低电平。

3、按键消抖

        对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

如何解决按键抖动问题?

1)、软件:使用延迟函数延长20ms

2)、硬件:加一个电路来消抖,成本高,不建议使用。

二、C语言知识

1.C51数据运算 

 

(1)、算术运算

       5 / 2 = 2 ; 5 % 2 = 1。

(2)、逻辑运算

        &&:要所有条件为真才真,即一假全假。

        || : 有真则真。

        !: 用于对单个命题的真值进行取反操作

3)、位运算

(一)按位左移(<<)

         将一个数的各二进制位全部左移若干位,高位丢弃,低位补 0 。

       例如,a = 0000 0010(十进制 2 ),a << 1 后变为 0000 0100(十进制 4 )。

(二)按位右移(>>)

      运算规则:把一个数的各二进制位全部右移若干位,正数时,高位补 0;负数时,高位补 1 。

比如 a = 0000 0100,a >> 1 后变为0000 0010。

(三)按位与(&)

        运算规则:两个相应的二进制位都为 1 时,结果位才为 1 ,否则为 0。即 0&0 = 00&1 = 01&0 = 01&1 = 1 。

        例如 a = 0000 0101b = 0000 0110 ,a & b = 0000 0100 。

(四)按位或(|)

        运算规则:两个相应的二进制位只要有一个为 1 ,结果位就为 1 。即 0|0 = 00|1 = 11|0 = 11|1 = 1 。

        例如 a = 0000 0101b = 0000 0110 ,a | b = 0000 0111 。

(六)按位取反(~)

        运算规则:对一个数的所有二进制位取反,即 0 变 1 ,1 变 0 。

        例如 a = 0000 0101 ,~a = 1111 1010 。

2.C51基本语句

三、程序设计

1、独立按键控制LED灯 

#include<regx52.h>      
void main()
{while(1){if (P3_2==0){P2_0=0;    //press the key and turn on the LED}else{P2_0=1;}}

2、独立按键控制LED状态

1、设计延迟函数

 2、程序

#include<regx52.h>      
void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main()
{while(1){// 判断K3按键是否按下if (P3_2==0){Delay(20);  //按下前消抖while(P3_2==0); // 继续判断K3按键是否按下Delay(20); // 松开按键消抖P2_0 = ~P2_0;// 初始时,P2_0为高电平,取反后为低电平}}
}

3、独立按键控制LED显示二进制

#include<regx52.h>      
void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main()
{unsigned char LEDNum = 0;while(1){if (P3_2==0){Delay(20); while(P3_2==0); Delay(20); LEDNum++;P2 = ~LEDNum;}}
}

代码讲解: 

  • LEDNum=0时,P2=0xFF,所有 LED 灭(显示二进制11111111
  • LEDNum=1时,P2=0xFE,仅 D1 亮(显示二进制11111110
  • LEDNum=2时,P2=0xFD,仅 D2 亮(显示二进制11111101
  • 依此类推,直到LEDNum=255时,P2=0x00,所有 LED 亮(显示二进制00000000

4、独立按键控制LED位移

#include<regx52.h>      
void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}unsigned char LEDNum;
void main()
{P2 = ~0x01;while(1){// ÅжÏK3°´¼üÊÇ·ñ°´ÏÂif (P3_2==0){Delay(20);  while(P3_2==0);Delay(20); LEDNum++;if(LEDNum >= 8){LEDNum = 0;}P2=~(0x01<<LEDNum);}if (P3_0==0){Delay(20);  while(P3_0==0); Delay(20); if(LEDNum==0){LEDNum=7;}else{LEDNum--;}P2=~(0x01<<LEDNum);}}}

http://www.xdnf.cn/news/9672.html

相关文章:

  • 代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲)
  • 开发时如何通过Service暴露应用?ClusterIP、NodePort和LoadBalancer类型的使用场景分别是什么?
  • Python+VR:如何让虚拟世界更懂你?——用户行为分析的实践
  • 【Linux】(1)—进程概念-②Linux中的操作系统概念
  • 桂花网体育运动监测方案:开启幼儿园运动健康管理新篇章
  • 【Linux】shell脚本的变量与运算
  • Spring框架学习day2--Bean管理(IOC)
  • 【博客系统】博客系统第十一弹:部署博客系统项目到 Linux 系统
  • Elasticsearch集群管理的相关工具介绍
  • [Rust_1] 环境配置 | vs golang | 程序运行 | 包管理
  • 自定义异常小练习
  • Intellij IDEA 查找接口实现类的快捷键
  • CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
  • 数据可视化(第4、5、6次课)
  • 【Java Web】速通JavaScript
  • k8s pod启动失败问题排查
  • NanoGPT的BenchMarking.py
  • 数据治理是什么意思?数据治理平台有哪些?
  • 如何使用.Net Reactor 批量加密 DLL
  • PostgreSQL 备份与恢复策略
  • docker网络相关内容详解
  • Java开发经验——阿里巴巴编码规范实践解析7
  • Axure设计案例——科技感立体柱状图
  • 动态规划-931.下降路径最小和-力扣(LeetCode)
  • 高光谱成像相机:基于高光谱成像技术的玉米种子纯度检测研究
  • 华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 小程序 - 视图与逻辑
  • MySQL的基本架构
  • 社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源
  • Typora-macOS 风格代码块