进阶教程:单片机独立按键,分别控制不同的LED点亮流水 代码详解
大家好,小伙伴们通过以上几篇文章的学习,我相信已经对于单片机控制LED流水的项目已经很熟悉了吧,其实还可以尝试着改一些代码实现花样流水地效果,感兴趣的小伙伴可以试一下,此处不再赘述。 我们言归正传继续说回我们今天的实验项目,单片机的独立按键控制流水灯点亮,其实这个只比上一个实验复杂一点点,上一个实验请移步,就是在流水灯的基础上添加了按键独立控制。及有0~7八个按键及0~7八个LED,当按下按键对应的LED即被点亮。当有规律的不停按下按键时,就会呈现LED花样流水地效果。和上面几篇文章一样,我们同样从软件和硬件的两个角度来为大家讲解一下。 硬件方面 LED的原理已经说了很多次了,此处不再赘述。 按键的种类其实有很多,但是都大同小异,基本功能是不变的,下面先说一下最简单的也是今天实验中需要的点动开关按键:这种按键工作原理就是你一按下去,就会通电(或实现相应功能),像计算机键盘一样,汽车按键,电话按键一样,一松开就会自动弹起断电。如果一直按下去则会一直生效,直到按键再次弹起。 单片机关于控制方式和工作原理都不再重复,不明白的小伙伴请自行爬楼或者私信。 有一点我还是要说一下,既然是按键,那就要有人按,这里就涉及到一个误操作的问题,因为误操作往往不是我们想要的,往往会给我们带来损失或者麻烦,为了避免这种情况防止我们误操作,我们需要添加防止误操作的代码,我们单片机上通常叫做消抖,即消除按键抖动。好了,了解完了硬件以后那么我们下面开始讲解软件代码部分。 C语言参考源代码如下: define uint int //定义类型变量 #define uchar char //宏定义字符型变量 sbit S1 = P3^7; //用P3.7来检测按键是否被按下 sbit S2 = P3^6; sbit S3 = P3^5; sbit S4 = P3^4; sbit S5 = P3^3; sbit S6 = P3^2; sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7; void delay(uint z); void main() { uchar i; uint k; if(S1 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S1 == 0) //再次检测按键被按下,说明确实被按下了 { for(i=0;i<3;i ) //for循环控制蜂鸣器响3声 { for(k=0;k<5000;k );//延时500ms bell = 0; //输出低电平,使蜂鸣器鸣叫 for(k=0;k<10000;k ); //延时500ms bell = 1; //输出高电平,使蜂鸣器停止 } } } if(S2 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S2 == 0) //再次检测按键被按下,说明确实被按下了 { LED1 = 0; //正向流动 delay(500); LED1 = 1; LED2 = 0; delay(500); LED2 = 1; LED3 = 0; delay(500); LED3 = 1; LED4 = 0; delay(500); LED4 = 1; LED5 = 0; delay(500); LED5 = 1; LED6 = 0; delay(500); LED6 = 1; LED7 = 0; delay(500); LED7 = 1; LED8 = 0; delay(500);LED8 = 1; } } if(S3 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S3 == 0) //再次检测按键被按下,说明确实被按下了 { LED8 = 0; //反向流动 delay(500); LED8 = 1; LED7 = 0; delay(500); LED7 = 1; LED6 = 0; delay(500); LED6 = 1; LED5 = 0; delay(500); LED5 = 1;LED4 = 0; delay(500); LED4 = 1; LED3 = 0; delay(500); LED3 = 1; LED2 = 0; delay(500); LED2 = 1; LED1 = 0; delay(500); LED1 = 1; } } if(S4 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S4 == 0) //再次检测按键被按下,说明确实被按下了 { LED1 = 0; //1、3、5、7亮 LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 0; LED6 = 1; LED7 = 0; LED8 = 1; } } if(S5 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S5 == 0) //再次检测按键被按下,说明确实被按下了 { LED1 = 1; //2、4、6、8亮 LED2 = 0; LED3 = 1; LED4 = 0; LED5 = 1; LED6 = 0; LED7 = 1; LED8 = 0; } } if(S6 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖 if(S6 == 0) //再次检测按键被按下,说明确实被按下了 { LED1 = 1; //全部灯灭 LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7 = 1; LED8 = 1; } } } void delay(uint z) { uint x,y; //定义循环变量 for(x=z;x>0;x--) //执行FOR循环语句 for(y=120;y>0;y--); //执行FOR循环语句 } 上述功能是用最基础的编程方法实现的,聪明的你想一想还有其他办法实现吗?通过以上代码,我用PROTEUS仿真图如下:结果8个按键可以分别控制8个LED,实验成功! 最后如果有什么问题或者建议请给我留言或者私信啊,看到一定第一时间回复,如果你喜欢我的文章,欢迎关注转发评论哦,我们下期再见! 专注基础,从软硬件两个维度,从零开始带你探寻单片机的神秘世界! |