用proteus和keilc实现流水灯
在日常生活中,我们经常会看到一排led灯,按着顺序一个一个的亮,而且是亮过就灭。在实验中我们成为流水灯。现在来看看如何在使用按键的情况实现吧。
操作方法
- 01
首先要明白流水灯的实现原理。 当K1~K2分别按下时,经(P0 & 0X0F)运算得到的相应键值分别为0x0e、0x0d、0x0b、0x07,而无键按下时的键值为0x0f。因此,按键状态可以依据(P0 & 0X0F)是否等于0x0f进行判断。 说明:设置两个标志位:启停标志run(1表启动,0表停止),方向标dir(1表自上而下循环,0表自下而上循环)。 实现的功能:K1是总开关,当K1首次按下时,流水灯由下往上流动;当K2按下时停止流动;当K3按下时,使灯由上往下流动;K4则是由下往上流动。
- 02
思路:先判断是哪个键按下,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文件后会产生如下所示的目录。
- 03
根据以上思路画出电路图,如下所示:
- 04
之后,将hex文件导入80c51中即可执行。已测试,执行完好。 至于如何画电路图和生成hex文件,在以前的经验中都有涉及。