有生之年之空白 阅读:30次 时间:2024-12-08 11:44:46在日常生活中,我们经常会看到一排led灯,按着顺序一个一个的亮,而且是亮过就灭,在实验中我们成为流水灯,现在来看看如何在使用按键的情况实现吧,以下内容是由微蓝经验网用户发布proteus做流水灯,用proteus和keilc实现流水灯,希望对于用户有一定帮助,为朋友进行解决疑惑,如若想了解更多相关内容,可以向底部移动了解更多与本教程文章相关解决经验方法!
proteus;keilc
首先要明白流水灯的实现原理,当K1~K2分别按下时,经(P0 & 0X0F)运算得到的相应键值分别为0x0e、0x0d、0x0b、0x07,而无键按下时的键值为0x0f,因此,按键状态可以依据(P0 & 0X0F)是否等于0x0f进行判断,说明:设置两个标志位:启停标志run(1表启动,0表停止),方向标dir(1表自上而下循环,0表自下而上循环),实现的功能:K1是总开关,当K1首次按下时,流水灯由下往上流动;当K2按下时停止流动;当K3按下时,使灯由上往下流动;K4则是由下往上流动。
思路:先判断是哪个键按下,K1为启动位,K2为停止,K3和K4转向,按照这个思路写出keilc代码:
#include "reg51,h"
unsigned char led[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(unsigned char time){
unsigned int j = 15000;
for(;time > 0; time--)
for(;j > 0;j--);
}
void main(){
bit dir = 0,run = 0;
char i;
while(1){
switch(P0 & 0x0f){
case 0x0e:run = 1;break;
case 0x0d:run = 0,dir = 0;break;
case 0x0b:dir = 1;break;
case 0x07:dir = 0;break;
}
if(run)
if(dir)
for(i = 0; i < 8; i++){
P2 = led[i];
delay(200);
}
else
for(i = 7;i >= 0;i--){
P2 = led[i];
delay(200);
}
else P2 = 0xff;
}
}
然后生成hex文件,一般写完keilc代码并生成hex文件后会产生如下所示的目录。

根据以上思路画出电路图,如下所示:

之后,将hex文件导入80c51中即可执行,已测试,执行完好,至于如何画电路图和生成hex文件,在以前的经验中都有涉及。
一定要注意电阻的阻值,电路图中比较靠上的电阻阻值均为10k,与led等相连的电阻阻值都为100,若电阻阻值搞错,很有可能导致led灯不亮,以上经验结束,与proteus做流水灯,用proteus和keilc实现流水灯有关的经验教程内容,若解决问题请点击“有用”,没有解决请向下浏览“相关”内容或点击“无用”平台积极改进优质原创的内容文章,点击下方工具分享给更多的朋友吧!
声明 未经许可,请勿转载。
© 2025 VLPOS.com 版权所有 微蓝网 ICP备案号:黑ICP备20003952号-1