有趣的流水灯写法。

来源:互联网 发布:易语言窗口同步器源码 编辑:程序博客网 时间:2024/05/29 09:23

偶然间看到了这段代码,是freescale的示例代码,先看看这段代码。

void main(void) {  const char flags[] = {1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7};  char c;  EnableInterrupts;  asm_main(); /* call an assembly function (for demo purpose) */  srand(PARTIDH); /* just some 'random' start value as seed */    DDRB = 0xff; PORTB = 0;  for(;;) {    for(c=0;c<=6;c++) {      delay();      Random();      PORTB = ~flags[c];     }    for(c=7;c>=1;c--) {      delay();      Random();
      PORTB = ~flags[c];
} }/* wait forever */ /* please make sure that you never leave this function */}
自然地,如果是嵌入式设计的话,不可避免地要写流水灯。不过,这段代码,我觉得很简单,很容易懂。至少比我原来的写法

const char flags[]={0xFE,0xFD,0xFB,0xF7,0x7F,0xBF,0XDF,0xEF};

因为不是很喜欢用移位的方法,所以自然选择了那个方法。移位应该就是这样子了:

for(i=0;i<8;i++){    delay();    PORTB=PORTB<<1;}

自然地这是简练多了,可能表示的时候不是很方便,比如要让特定的LED亮,不过也是可以的。

PORTB=0x01<<i;

当然,移位方法也是多种多样的。但是,这不像一个 pythonic的作法。

const char flags[] = {1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7};

这段代码比0xFE,0b00001111什么的优雅多了。

而且,可以优雅的指定让某个led亮。

PORTB = ~flags[c];

	
				
		
原创粉丝点击