历史上的今天
今天是:2025年08月19日(星期二)
2021年08月19日 | 51单片机-按键猜想
2021-08-19 来源:eefocus
当然按键的功能不是像前两讲的代码这么单调,前两讲的代码是认识到程序中寄存器位的值是可以受外部电路影响而改变的。这一讲我们要做的就是根据前两讲的知识不断探索按键的一些规律和原理。
1.状态图
可能我们理想中的按键过程图如下

那我们不妨在这种猜想下用代码测试看看是什么效果。
首先要测试的是我们自己快速按下按键后就松开,上图的“按键按下时P2.7的状态”持续的时间到底是多长,我们就用流水灯的方式来查看按下之后迅速松开,小灯会跳到哪里显示。
2.代码及分析
#include sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit KEY4 = P2^7; void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned char i=1; ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//************************** P2 = 0xF7;//让K4能具备有被拉低的条件先 P0 = 0xFE;//先点亮最右端的小灯 while(1) { if(KEY4==0) { delay_ms(10); P0=~(0x01< i++; if(i>=8)i=0; } } } #include sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit KEY4 = P2^7; void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned char i=1; ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//************************** P2 = 0xF7;//让K4能具备有被拉低的条件先 P0 = 0xFE;//先点亮最右端的小灯 while(1) { if(KEY4==0) { delay_ms(10); P0=~(0x01< i++; if(i>=8)i=0; } } } while(1) { P0=0xFF; switch(i) { case 0: IO0_OUT();P0=LedChar[0];break; case 1: IO0_OUT();P0=LedChar[1];break; case 2: IO0_OUT();P0=LedChar[2];break; case 3: IO0_OUT();P0=LedChar[3];break; case 4: IO1_OUT();P0=LedChar[3];break; case 5: IO2_OUT();P0=LedChar[3];break; case 6: IO3_OUT();P0=LedChar[3];break; case 7: IO4_OUT();P0=LedChar[3];break; case 8: IO5_OUT();P0=LedChar[3];break; case 9: IO5_OUT();P0=LedChar[4];break; case 10:IO5_OUT();P0=LedChar[5];break; case 11:IO5_OUT();P0=LedChar[0];break; case 12:IO4_OUT();P0=LedChar[0];break; case 13:IO3_OUT();P0=LedChar[0];break; case 14:IO2_OUT();P0=LedChar[0];break; case 15:IO1_OUT();P0=LedChar[0];break; } if(KEY4==0)i++; if(i>=16)i=0;//让i在0~15之间变化 delay_ms(30); } 1阶段一下子来到4阶段,那么i肯定是因为按键的动作,被加了3次等于3才会在4阶段处停留,而在按键按下的动作中i自加一次之后都需要经过“delay_ms(30);”,可想而知,P2.7在按键动作中被拉低的持续时间就有60~90ms。 因为我们有了“delay_ms(30);”才会看到2,3阶段有亮度的持续短时间显示,之前叫大家按着K4不放,看到的是数码管在循环做跑马灯,i在K4按下不放中KEY4一直等于0所以i一直从0~15不停的改变,加上延时部分,6个数码管上的16段灯就看起来像流水灯一样在跑了。讲解到这里我们已经对按键的原理和代码操作有一定的了解了。
上一篇:51单片机-按键&蜂鸣器&数码管
下一篇:51单片机-按键用法
史海拾趣
|
首先:PCB(印刷电路板)的原料是什么呢?大家知道有种东西叫\\\\\\\\\\\"玻璃纤维\\\\\\\\\\\"吧,这种材料我们在日常生活中出处可见,比如防火布、防火毡的核心就是玻璃纤维,玻璃纤维很容易和树脂相结合,我们把结构紧密、强度高的玻纤布浸入树 ...… 查看全部问答> |
|
请教大家一下,我的传感器模块A输出信号是0-5V,该模块的电源是另一个模块B提供的,同时模块A的信号也要输出到模块B,但是两个模块之间只能允许一根同轴电缆通信,所以我想把0-5V的传感器的信号通电源过载波的传送,怎么实现呢? 传感器电源是12V的 ...… 查看全部问答> |
|
ISE Design Suite: Embedded Edition 内包含的嵌入式系统工具(包括处理器平台调整实用程序、软件应用开发工具、调试工具链及器件驱动器与库)方面的信息… 查看全部问答> |
|
把短点数C1C90000H转换成为十进制 (1) 将十六进制代码写成二进制,并奋力出符号位,阶码和尾数 因为; C1C90000H=11000001110010010000000000000000 &nb ...… 查看全部问答> |
|
rt_main函数进行vxworks实时仿真时需要注意的地方 各位: rtw编译后,仿真得出的模型.lo,在vxworks下总是找不到rt_main里面的一个函数:rt_ODEUpdateCouinousState,这是为什么啊?麻烦各位帮个忙指点一下… 查看全部问答> |
|
刚学习不久,代码写的比较烂,主要想学习下LCD,抄了下某开发板的代码,自己改了下,代码如下: #include #include #include #include #include #define uchar unsigned char #define uint unsigned int sbit E=P2^7; &n ...… 查看全部问答> |
|
unsigned char CS_EN,DI_EN ;void delay(int i){ while(i>0) { i--; }}unsigned char Write_Cmd(unsigned char *cmd,unsigned char lres){ unsigned ...… 查看全部问答> |




