单片机的流水灯C51程序的问题

#include "reg51.h"
char led[]={0x01,0x02,0x04,0x08}; //显示模型
//延时子程序
void delay(unsigned int time){
unsigned int j = 0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
//返回键值,当有键按下时,返回低4位相应位为1
//如果P0口低4位为全“1”,则返回0,
//否则返回低4位相应位为0,其它位为“1”
char key(){
P0=0xff;
return ((P0 & 0x0f) == 0x0f) ? 0 : (P0 & 0x0f);
}
void main(){
bit dir=0,run=0; char i;
while(1){ //根据键值
switch (key()){
case 0x0e:run=1;break; //P0.0为0,则run置“1”
case 0x0d:run=0;break; //P0.1为0,则run置“0”
case 0x0b:dir=1;break; //P0.2为0,则dir置“1”
case 0x07:dir=0;break; //P0.3为0,则dir置“0”
}
if (run) //若run为“1”
if(dir) //若dir为“1”
//自上而下流动
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else
//自下而上流动
for(i=3;i>=0;i--){
P2=led[i];
delay(200);
}
else P2=0;//灯全灭
}
}
其中按键读取
char key(){
P0=0xff;
return ((P0 & 0x0f) == 0x0f) ? 0 : (P0 & 0x0f);
}可否
直接改成return ((P0 & 0x0f);因为SWITCH没有相应入口也无法执行下去啊?

主程序里面没有读key的地方,当然执行不下去。
增加:
char key;
然后再超级循环体里switch前面增加:
key = key();

至于相关函数是否正确没仔细看,但上面的部分是一定要的。追问

这个函数应该没错老师给的做过的。。?读KEY后不是返回到while(1){ //根据键值
switch (key())这里吗?返回键值为0 有什么意义呢?

追答

0就什么都不干,程序会继续循环,直到你松开某一按键,然后进入switch进行相应操作。

追问

啊。。原来如此 谢谢了

温馨提示:内容为网友见解,仅供参考
无其他回答

用51单片机写了一个流水灯程序,有一点问题,请高手解惑
单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。要想按键随时有效,应该把两个移位函数_cror_,_crol_ 放在主程中,检测key也放在...

为什么我用C51里左移的指令不能实现流水灯的循环?
程序写的不对,你主函数里面 void main(){ aa=0xde;while(1){ P1=aa;delayms(500);aa=aa<<1; \/\/右移一位,移8次出去,还在往右移动,都移动出界了哈哈!} } 在程序里面写个判断语句移动完成后,在从新开始移动程序如下:int main(void){ aa=0xde;while(1){ P1=aa;delayms(500);a...

我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了...
3 我给你改正的,程序:功能是先是第一个灯亮,再是第一个灯灭,亮2,然后2灭,亮3...void time1() interrupt 3 { tt++;if(tt==10){ tt = 0; \/\/---这句表示中断10次换一个灯,不可少 \/\/---如果没有这句tt = 0,则成了中断256次才换一个灯 P1 =~(1<<aa); \/\/---下面这三...

在做51单片机流水灯时候,程序卡在一部分,成死循环
应该在子程序里再声明两个局部变量就可以了

51单片机C程序实验LED灯:[2]左到右的流水灯
依旧是基础的LED灯部分的实验 说明:实现一排灯从左到右依次一个一个点亮熄灭,实现流水灯 proteus电路图 元件清单:(分别是) 51单片机 电容 瓷片电容(也可用普通电容) 晶振 红色二极管 电阻 电路图的连接方法 程序清单 说明:本例有两种程序写法 第一种是入门级别比较基础的写法 先是依旧延时子...

谁帮我看下51单片机流水灯怎么不能正常流水闪亮
你程序最后的运行结果是不是所有LED都亮了,如果是这样的话,就是可能你P0口没有加上拉电阻,单片机P0不加上拉电阻的话,是输出不了高电平的。还有,楼主以后问程序问题的同时,最好也把硬件电路图给出,这样大家也才好回答。。。希望可以帮到你。。。

一个用C语言做51单片机做流水灯控制向左移动一位,右边补0的一段程序...
\/\/右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1.include "reg51.h"void delay(unsigned char m);main(){ unsigned char temp;temp=0xfe; \/\/temp=1111 1110,使得P1口的某个引脚为低电平(亮)while(1){ P1=temp; \/\/P1口的数据来自...

c51单片机流水灯程序。求问大神他为什么把16进制数定义成unsign char...
你把十六进制和16bit(16位)的概念搞混了。同一个数字,可以用10进制表示、也可以用16进制表示,当然二进制、8进制等都可以,甚至你自己造个12进制都没问题。比如你给一个变量a赋值为0xfe,a=0xfe,这个效果与下面这2种完全一样,看准了,是完全完全完全一样!!对单片机来说没有任何影响:一、...

帮我看一个C51流水灯的程序,看看为什么我总是跑到128步就从头跑了,应该...
char i = 0;上面这行定义错了, 这个是有符号变量, 最大只有127 定义成下面这样就对了 unsigned char i=0; 这个最大数量255

C51单片机:在流水灯程序运行时,如何通过外部中断程序。中断时如何运行中...
是外部中断期间当前亮着的LED灯继续亮着,流水不动?很好办呀,进入外部中断时你保存流水灯当前的状态就可以了。比如:ORG 0000H LJMP MAIN ORG 0003H LJMP EXTI0 LED EQU 30H ORG 0030H MAIN:MOV SP,#5FH SETB EX0 SET IT0 SETB EA MOV LED,#FEH LOOP:MOV P0,LED LCALL DELAY MOV A,...

相似回答