哪位知道用51单片机如何判断从P1口出来的8个独立按键从左到右的顺序被按下才能把P2^0的LED灯打开的C程序

我想用P1口的8个独立按键来调光的,当从P1.0到P1.7的顺序一个接一个被按下时,P2.0的灯渐渐变亮,在第第二次又从P1.0到P1.7一个接一个被按下时,P2.0的灯变得越来越亮,在第二次的P1.7按键被按下时,P2.0的灯达到最亮,当顺序反过来被按下时,灯会慢慢地变暗,请大神给我建议,

你这样用这么多的按键来控制灯的亮度有点麻烦了,还不如就用两个按键,一个是增加亮度,每按一次亮度增加一点,增加多少次后达到最亮。另一个按键是降低亮度的,每按一次降低一点,按相同的次数后灯就关掉了。这样操作起来比较方便,也利于写程序,更适合于操作,节省了按键,好处是很多的。追问

可是我想制作的是滑动式的无极调光,所以按键就得多几个了,请大神给我想想办法
我就是那个按键扫描识别的部分不知道怎么编写的

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-28
会写程序的话,给你个提示应该很容易的。

从你的描述,我大概了解了,是需要 第一次 P1.0-1.7 灯光从0-50%,第二次51-100%,
那么,你只需要写两个灯光控制的按键调节,然后根据当前灯光亮度设置的变量来判断使用哪一个亮度调节就行了,这样说懂了么?
如果还不懂我写个例子吧,当然只是例子,不能直接使用:
uchar Light; //定义灯光亮度变量,这里我们假设它的值是0-100

if(Light<50)
{
if(P1.0==0)Light=0;
if(P1.1==0)Light=10;
...
if(P1.7==0)Light=50;
}
else
{
if(P1.0==0)Light=60;
if(P1.1==0)Light=70;
...
if(P1.7==0)Light=100;
}追问

很不错的建议,我懂了,这样一来,渐渐变亮是可以的,可是,在Light=60时,变为Light=50就变不回去了,也就是说灯达到最大亮度的时候将其慢慢变暗只能达到一半的亮度,却不能将灯完全熄灭,请大神指点指点

追答

这个涉及到一个问题,你是要让按钮必须挨着按才有效还是跳跃式按也有效?

追问

什么叫挨着按和跳跃式按呀,我是菜鸟

追答

连续按,就是只能1234567,跳跃按就是1356427这样乱按,两种处理方式不同。

追问

只能连续按的,我刚才试过了你说的那个程序,编写上去,在Light<50的时候调节都是正常的,可是在按下P1.7按钮后就直接跳到Light=100了,这里的过度阶段不知道怎么写好些

追答

这样吧(8个太多,就写5个吧,按照这种写法,应该是你想要多少就能多少):

if(P1.0==0)Light=(Light>40)?60:0;
if(P1.1==0)Light=(Light>50)?70:10;
if(P1.2==0)Light=(Light>50)?80:20;
if(P1.3==0)Light=(Light>50)?90:30;
if(P1.4==0)Light=(Light>50)?95:40;
if(P1.5==0)Light=(Light>60)?100:50;

本回答被提问者采纳
第2个回答  2013-12-28
不用这样吧?用个带AD的单片机 接个滑动电位器,单片机机采集电压转换成百分比,然后用这个百分比控制PWM输出占空比就OK了,无级调亮度。或者不用电位器的话用编码开关也可以的。那就不用AD了。追问

只要能够告诉我那个键盘怎么才能按照顺序识别的就可以了,我就是不懂这个怎么编写

相似回答