xietaigao
获得 9 次赞
帮助过70人
可以参考一下这个程序,思路都一样,都是通过延时的方式排除干扰,因为如果是干扰的话,时间都特别短#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit key1=P3^4; //定义按键位置 sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; sbit LED1=P1^0; sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; /*------------------------------------------------ 延时子程序 ------------------------------------------------*/ void delay(unsigned int cnt) { while(--cnt); } /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { while(1) { if(!key1) { //按下相应的按键,led亮起 delay(1000); if(!key1) { LED1=0; } } if(!key2) { //按下相应的按键,led亮起 delay(1000);//去抖动 if(!key2) //检测按键确实按下,进行按键处理 { LED2=0; //这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关 } } if(!key3) { //按下相应的按键,led亮起 delay(1000); if(!key3) { LED3=0; } } if(!key4) { //按下相应的按键,led亮起 delay(1000); if(!key4) { LED4=0; } } } }
sorry,没有宏定义,枚举类型枚举变量未赋初值,其默认的值是0,后面的依次加1。所以KeySureDown=1 ,OnceKeyDown=2,ContiousKeyDown=3,state的值在switch里面被赋值了,而state的初始化值是NoKeyDown,所以第一次必然执行第一个case
KeySureDown ,OnceKeyDown,ContiousKeyDown是枚举类型,头文件里应该有宏定义,仔细看看,state是和switch语句里的case后面的常量比较的啊,如果相等则执行后面的语句,直到遇到break,continue,或switch末尾才退出
多敲代码,多看看别人的程序,最好每天抽点时间学习一下,不然很快就忘了。还有注意效率问题,刚开始不会的肯定很多,实在不会不要卡在哪里,跳过以后回头看慢慢就明白了,这样效率高,到后期学习也比较有针对性。