嵌入式C实战项目开发技巧:对一个有规律的数组表进行位移操作的方法-创新互联

在嵌入式项目开发中,LED灯的操作是一定要会的,也是基础中的基础,比如用51单片机写个跑马灯,这不简单嘛,定义一个数组把那8个跑马灯存起来,然后搞个for循环不就可以了嘛,但是,实际工作开发中写一个跑马灯可不像学校和书本上那么简单噢,往往最简单的东西,有可能也是最复杂的。现在我的需求是这样的,我要求实现以下形式的流水灯:

公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出密云免费做网站回馈大家。

跑马灯在这个表格中是一位一位进行存储的,如果要一行全亮,那么写0xff,灯就全亮了,写0x00,灯就全灭了。

嵌入式C实战项目开发技巧:对一个有规律的数组表进行位移操作的方法

要求从led1流水到led100这个灯,也就是实现100个灯的跑马灯操作。那如何实现呢?有人肯定会说定义十个数组就行啦,用填表的方法。然后搞十个for循环来实现,那么可取不?可取,但是太麻烦啦,因为这是用空间来换时间,虽然能达到效果,但是就太浪费内存空间了,效率也是很低的。

那么如何快速处理这个问题呢?

答案就是位运算与循环的结合,首先思考一下,led是从第1个开始一直流到第100个,一共有十行,每行有十个,那么我们就可以定义一个for循环来循环相应的行数,设定led灯的初始位置,然后用移位算法,移动8位就换下一行,一个led相当于1bit,这样的话,两个for循环就可以搞定了,接下来我们用C语言来模拟这个过程。

#include 
void delay()
{
 int i , j ; 
 for(i = 0 ; i < 1000 ; i++)
 for(j = 0 ; j < 8000 ;j++);
}
//跑马灯从高位到低位流
void test_low_to_high_bit()
{
 int i , j ; 
 int tick ;
 static int ledbuf[10] ;
 for(i = 0 ; i < 10 ; i++)
 {
 ledbuf[i] = 0x01 ; //设定每次开始的位置,从0x01开始
 for(j = 0 ; j < 8 ; j++)
 {
  printf("%p ",ledbuf[i]);
  ledbuf[i] <<= 1 ; //每次左移一位,左移八次
  delay() ;
 }
 putchar('\n');
 ledbuf[i] = 0 ; //将数组清0,等待进入下一行
 }
}
//跑马灯从低位到高位流
void test_high_to_low_bit()
{
 int i , j ; 
 int tick ;
 static int ledbuf[10] ;
 for(i = 0 ; i < 10 ; i++)
 {
 ledbuf[i] = 0x80 ; //设定从高位的第一个LED灯的位置
 for(j = 0 ; j < 8 ; j++)
 {
  printf("%p ",ledbuf[i]);
  ledbuf[i] >>= 1 ; //将数组的第一个元素右移一位,一共右移八位
  delay() ;
 }
 putchar('\n');
 ledbuf[i] = 0 ;//将数组清0,等待进入下一行
 }
}
int main(void)
{
 test_low_to_high_bit() ;
 putchar('\n');
 test_high_to_low_bit() ;
 return 0 ;
}

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享题目:嵌入式C实战项目开发技巧:对一个有规律的数组表进行位移操作的方法-创新互联
当前链接:http://azwzsj.com/article/dijeji.html