当然按键的功能不是像前两讲的代码这么单调,前两讲的代码是认识到程序中寄存器位的值是可以受外部电路影响而改变的。这一讲我们要做的就是根据前两讲的知识不断探索按键的一些规律和原理。
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单片机-按键用法
设计资源 培训 开发板 精华推荐
- LTC2610IUFD 八通道、14 位数模转换器的典型应用
- 使用 MikroElektronika 的 KX126-1063 的参考设计
- 基于51单片机的步进电机控制-设计报告(说明书)及源程序
- LTM4619,模块稳压器将 4.5V 至 26.5V 输入转换为双 3.3V 和 1.2V 输出,每个输出具有 4A 最大输出电流
- 使用 Analog Devices 的 LTC2908CDDB-B1 的参考设计
- LT1171CQ、5V/2.5A 正电流升压降压转换器的典型应用
- SP6641B、3.3V 带 SuperCap 开关、DC/DC 升压稳压器的典型应用
- BTS740S2 智能高端电源开关 2 通道电流检测的典型应用
- L5986 2.5A 降压型开关稳压器的典型应用
- MIKROE-3271,基于 LM4860M 1W 音频功率放大器的 AudioAmp 4 Click Board