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

(基于江协科技)51单片机入门:2.独立按键

目录

对寄存器的精细化控制

独立按键         

 ​编辑      

1.独立按键控制单个LED亮灭

        按键消抖                 

2.独立按键长按LED长亮

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

4.独立按键控制LED移动


对寄存器的精细化控制

                在LED模块原理图中最右端能看见 P20 P21 P22 等值,上章也讲了银脚控制着一条线路的电压而决定一个电子元件或者多个电子元件是否工作,寄存器又控制银脚。将P20进行拆分 P2 为寄存器名,0 为这条线路对应寄存器的位(51单片机一个寄存器8位)。

                所以可以给 P2_0 赋值去单个控制这条线路的电压 1 为 0V  ,0 为 5V。

独立按键         

       

                可以从最右端看到 P30 P31 P32 等数字,和上方LED灯一样

                可以对 P3 这个寄存器整体判断,也可以对 P3_0 独立判断

1.独立按键控制单个LED亮灭

                所以可以利用 if 语句来判断按键处于什么状态,如果为证处理后续代码

例如:判断独立按键按下,执行代码为讲单个LED打开 或 关闭

                不是独立按键控制了LED的亮灭,是LED决定LED的亮灭,控制一直都是单片机

        按键消抖                 

                由于机械粗点的弹性作用,一个开关 开关 闭合 时不会马上稳定地接通,会有一连串抖动

                这类抖动会给程序逻辑带来严重的干扰

例如:你的程序本意是“按一下键,LED灯状态改变一次”。但由于抖动,单片机在几毫秒内检测到了多次“下降沿”或“低电平”,导致LED灯的状态快速切换了多次,最终你可能看到的效果是:按一次键,LED灯闪烁了好几下,或者直接没有变化(因为奇数次切换后又变回原状)

                所以在在程序上进行消抖处理

if(P3_0 == 0){Delay(20);        // 按下消抖while(P3_0==0)£;  // 判断是否松手Delay(20);        // 松手消抖}

独立按键控制单个LED亮灭 代码如下:

#include <REGX52.H>
#include <intrins.h>void Delay(int num)		
{while(num--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}int main()
{while(1){if(P3_0 == 0){Delay(20);while(P3_0==0);Delay(20);P2_0 = ~P2_0;        // 亮变暗 暗变亮}}return 0;
}

2.独立按键长按LED长亮

#include <REGX52.H>
#include <intrins.h>void Delay(int num)		//@11.0592MHz
{while(num--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}int main()
{while(1){if(P3_0 == 0)          // 判断是否按下{Delay(20);         // 按下消抖if(P3_0 == 0)      // 确认中途没有松手{P2_0 = 0;      // LED亮灯}			while(P3_0==0);    // 不松手持续循环,使LED亮着Delay(20);         // 松手消抖}else                   // 松手后,第二次外层循环进入将灯熄灭{P2_0 = 1;          }}return 0;
}

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

#include <REGX52.H>
#include <intrins.h>void Delay(int num)		//@11.0592MHz
{while(num--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}int main()
{unsigned char c = 0;while(1){if(P3_0 == 0){Delay(20);while(P3_0==0);Delay(20);c++;P2 = ~c;}}return 0;
}

                2进制显示本质上就是一直+1

                但由于 0 灯亮,1 灯灭,等的转态相反

                所以对+1的值进行取反即可 

4.独立按键控制LED移动

                这里千万注意,变量创建一定要在main函数之后,前面不能有任何代码阻挡

#include <REGX52.H>
#include <intrins.h>void Delay(int num)		//@11.0592MHz
{while(num--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}int main()
{unsigned char c = 1;int i = 0;P2 = 0xFE;while(1){if(P3_0 == 0){Delay(20);while(P3_0==0);Delay(20);i++;if( i == 8){i = 0;}P2 = ~(c<<i);}if(P3_1 == 0){Delay(20);while(P3_1 == 0);Delay(20);if(i == 0){i=8;}i--;P2=~(c<<i);}}return 0;
}

http://www.dtcms.com/a/411891.html

相关文章:

  • SpreadJS 纯前端表格控件:破解中国式复杂报表技术文档
  • 免费公司网站申请官方网站开发制作公司
  • 山东电力建设第一工程公司网站人物设计网站
  • 企业网站seo案例电子信息工程论坛
  • 华为FreeBuds SE4 ANC为什么有风时降噪忽强忽弱?
  • JxBrowser 8.12.0 版本发布啦!
  • nacos 服务端与客户端通讯流程实现
  • Docker05-Redis启动
  • 给你一个网站如何做推广wordpress 页面加载时间 查询次数_和内存
  • 【LeetCode 每日一题】120. 三角形最小路径和——(解法二)自底向上
  • 教育培训门户网站模板下载网上有什么做兼职的网站
  • AI工具使用随笔
  • 基于PyQt5的邮件客户端开发:完整实现与深度解析
  • 建手机wap网站大概多少钱页面模板够30条
  • idea可以做网站吗大数据营销网站
  • wordpress导航站源码天津做系统集成的公司网站
  • 郑州网站制作公司怎么样wordpress 视频站主题
  • 谷歌外贸网站seo怎么做免费舆情信息网站
  • 整站优化和单词深圳互联网公司集中在哪个区
  • 【crud】update
  • Qt键盘输入法的开源方案
  • 门户网站 建设 通知wordpress略缩图压缩
  • .net网站开发简介广州平面设计培训机构
  • 沭阳网站设计绿植网站怎么做
  • DVWA | XSS 跨站脚本注入
  • 建设银行网站公告在哪wordpress前台浏览量插件
  • Java的认识及环境搭载
  • 网站做著作权网络信息公司是做什么的
  • Milvus 2.6 Data-in, Data-out,简化向量搜索
  • 鄠邑区建设和住房保障局网站广东深圳龙岗区天气