/**** 在你的代码基础上更改 ****/ #include <reg51.h> #include <intrins.h> void delay(unsigned int z) { unsigned int a,b; for (a=0;a<z;a++) for (b=0;b<120;b++); } sbit key1=P1^0; sbit key2=P1^1; unsigned int i,n,k,c; void main() { while () { k=0xfe; c=0xf7; /*赋初值放前面,你的代码逻辑中并没有将其包含在if后面; 如果你想表达按键1后给k赋值请加上{};因为有两句代码 */ if (key1==0) i=1; if (key2==0) n=1; /*i和n应该是想用标志位;一个标志位有01两种状态 两种情况用一个标志位就够了,两位可以表示四种状态*/ /*****你仔细的品******/ /*比如你的代码中就可以用while(n)和while(!n)*/ if (key==0&&i==1) delay(10); if (key==0&&i==1) /* 你可以用 if(i==1) { P0=k; k= _crol_(k,1) delay(500); n=0; } */ { P0=k; k= _crol_(k,1) delay(500); n=0; /*标志位用来保存按键状态,这样就不用一直按着 而n=0;用来清除按键二的状态后面的i=0;同理 */ //while (!n); //while (1)后面直接接分号,表示单片机什么也不做,原地等待 //此处你的代码中多余,你的状况是流水灯闪一遍后灯全部灭了 //你的代码本来就处于外面的while(1)的大循环中 /*你仔细品*/ if (key==0&&n==1) delay(10); if (key==0&&n==1) { P0=c; c= _cror_(c,1) delay(500); i=0; } } } /*******精简版标志位法**********/ #include <reg51.h> #include <intrins.h> void delay(unsigned int z) { unsigned int a,b; for (a=0;a<z;a++) for (b=0;b<120;b++); } unsigned int i,k,c; void main() { while () { k=0xfe; c=0xf7; if (key1==0) delay(10); if (key1==0) i=1; //i 储存按键的状态 1 0 表示按键1和按键2 if (key2==0) delay(10); if (key2==0) i=0; //判断i的值等同于判断按键 if(i==0) { P0=k; k= _crol_(k,1) delay(500); } else { P0=c; c= _cror_(c,1) delay(500); } } } |
while循环内前两个if语句应该加上大括号,if语句后面没有大括号时,只是紧接的一条语句有效,不是你写在一行内就行的。 |
你看看我做的: #include<reg51.h> #include<intrins.h> #define GPIO_LED P2 sbit k1=P3^1; sbit k2=P3^0; void Delay10ms(unsigned int c); void main(void) { unsigned int i,j; j=0xfe; GPIO_LED=j; while(1) { if(k1==0) { Delay10ms(1); if(k1==0) { if(k2==0) { Delay10ms(1); if(k2==0) { j=_cror_(j,1); GPIO_LED=j; } } else { j=_crol_(j,1); GPIO_LED=j; } while((i<50)&&(k1==0)) { Delay10ms(1); i++; } i=0; } } } } void Delay10ms(unsigned int c) { unsigned char a,b; for(c;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } 我在HC6800-ES-V2.0板子上通过试验,结果是: 按下k1键,LED灯左移,不松手,一直左移。 按下k2键,没有任何反应。 按下k1键,LED灯左移,不松手就一直左移;再按下k2键(此时k1、k2键是同时按下的),LED灯右移,都不松手,灯一直右移;松开k2,LED灯恢复左移,不松手一直左移;松开k1,LED灯不再移动。 |
改这样试试
|
各位大佬,帮帮忙,我是在是想不到哪错了 |