2014-10-31 123 views
-4

我想在第一次完成时反转代码。例如,针脚1针脚2针脚3针脚4(它是完整的)现在它应该作为针脚4针脚3针脚2针脚运行。我想按相反顺序闪烁LED

我写了这段代码,但它不是按相反的顺序工作的。请用这种方式指导我。

#include<htc.h> 
__CONFIG(1,OSCSDIS & HSPLL); 
__CONFIG(2,BORDIS & PWRTDIS &WDTDIS); 
__CONFIG(3,CCP2RC1); 
__CONFIG(4,LVPDIS & STVREN); 
__CONFIG(5,UNPROTECT); 
__CONFIG(6,WRTEN); 
__CONFIG(7,TRU); 

define _XTAL_FREQ 40000000 

void delay_sec(unsigned char seconds) // This function provides delay in terms of seconds 
{ 
    unsigned char i,j; 
    for(i=0;i<seconds;i++) 
     for(j=0;j<100;j++) 
      __delay_ms(10); 
} 

void led_display(char a) 
{ 
    switch(a) 
    { 
     case 0: PORTB=0x01;PORTD=0x08; break; 
     case 1: PORTB=0x02;PORTD=0x04; break; 
     case 2: PORTB=0x04;PORTD=0x02; break; 
     case 3: PORTB=0x08;PORTD=0x01; break; 
    } 
} 

void main() 
{ 
    TRISB=0x00; TRISD=0x00; char a,b; 
    while(1) { 
     led_display(a); 
     a++; 
     delay_sec(1); 
     if(a==4) { 
      a--; 
     } 
    } 
} 
+5

请缩进您的代码,使其可读。 – RedX 2014-10-31 07:10:49

+1

@RedX我怀疑它不会编译:'define _XTAL_FREQ 40000000' – tangrs 2014-10-31 07:16:20

+0

我知道这是一个不同的问题,但为什么你使用两个循环和一个10毫秒的延迟睡眠一秒?在Linux上调用睡眠(3C)还是在Windows上睡眠不是更好吗? – AnotherSmellyGeek 2014-10-31 07:24:13

回答

0

做这件事,你要记住在命令你正在运行(逆转与否)。所以你将有一个变量指示订单是否反向,并在到达柜台的末端时进行更改(0和3)

而且您可以使用1和-1优化代码它会记住顺序并将其添加到a。

您的代码将看起来像这样在你的主:

int reverse = 1, 
char a = 0; 

while(1) 
{ 
led_display(a); 
delay_sec(1); 

if(a==3) 
    { 
    reverse=-1; 
    } 
if(a==0) 
    { 
    reverse=1; 
    } 

    a+=reverse; 
} 

问候。

+0

现在我想打开一个序列中的led,即 现在我该怎么办? – user3768479 2014-10-31 16:46:07

+0

没有逻辑方法可以做到这一点......您所要做的最好的事情是通过更改a和活动LED之间的对应关系来创建一种查找表。例如,通过交换案例2和案例3的行为,可以在“开关案例”中更改该案例。 – cyrille 2014-10-31 19:50:37