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

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

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

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

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

#include <stdio.h>

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,等待进入下一行</span>

	}
}

int main(void)
{
	test_low_to_high_bit() ;
	putchar('\n');
	test_high_to_low_bit() ;

	return 0 ;
}

运行结果:

运行结果很明显,第一个是从第一位移位到第八位,移动了8次,移动了十行。

第二个是反着来的。

如果,现在有个需求改了,那个表中,我要指定的LED亮,其它的不亮,然后实现流水灯的效果,那要如何去写这个程序?

这种问题的分析就要复杂很多啦,所以,一个流水灯,简单可以简单到不用两分钟你可以写出来,复杂可以复杂到可能你想一天都想不出来,所以,无论遇到什么问题,做一下总结,下次遇到问题的时候就可以熟能生巧。没有写不出的能实现程序,没有实现不了的软件需求。只有头脑简单的程序员。加油吧,各位!

嵌入式C实战项目开发技巧:如果对一个有规律的数组表进行位移操作的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. AngularJS进阶(三十六)AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记)

    AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记) 前言 在"AngularJS项目开发技巧之图片预加载" ...

  3. AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID

    AngularJS项目开发技巧之获取模态对话框中的组件ID 需求 出于项目开发需求,需要实现的业务逻辑是:药店端点击查看"已发货""已收货"订单详情时,模块弹出 ...

  4. AngularJS进阶(三十)AngularJS项目开发技巧之图片预加载

    AngularJS项目开发技巧之图片预加载 绪 项目(移动端采用Ionic 框架)开发完毕,测试阶段发现移动APP首页的广告图片(图片由服务器端返回相应url地址)很难加载,主要原因还是网速.如下图左 ...

  5. AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储

    AngularJS项目开发技巧之localStorage存储       注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...

  6. Vue 实战项目开发流程

    一 基础配备 ## 一.环境搭建 #### 1.安装node - 去[官网](https://nodejs.org/zh-cn/)下载node安装包 - 傻瓜式安装 - 万一安装后终端没有node环境 ...

  7. Android快乐贪吃蛇游戏实战项目开发教程-02虚拟方向键(一)自定义控件概述

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.自定义控件简介 在本项目中,无论是游戏主区域还是虚拟方向键都是通过自定义控件 ...

  8. 实战项目开发细节:C语言分离一个16进制数取出相应的位1或0

    最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题. 其中,甄别好坏的方法是通过比如按键,或者其它的操作然 ...

  9. react实战项目开发(2) react几个重要概念以及JSX语法

    前言 前面我们已经学习了利用官方脚手架搭建一套可以应用在生产环境下的React开发环境.那么今天这篇文章主要先了解几个react重要的概念,以及讲解本文的重要知识JSX语法 React重要概念 [思想 ...

随机推荐

  1. JAVA对象及属性的内存堆栈管理(通过小程序简单说明)

    JAVA在执行过程中会划分4个内存区域(heap.stack.data segment.code segment)代码区(codesegment):java开始执行会把代码加载到code segmen ...

  2. Spark分布式计算和RDD模型研究

    1背景介绍 现今分布式计算框架像MapReduce和Dryad都提供了高层次的原语,使用户不用操心任务分发和错误容忍,非常容易地编写出并行计算程序.然而这些框架都缺乏对分布式内存的抽象和支持,使其在某 ...

  3. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  4. 【OpenGL】详解第一个OpenGL程序

    写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下. ...

  5. Dynamics CRM 2013 SP1 客户表单界面上联系人subgrid上的添加现有联系人功能缺失

    CRM2013打了SP1的同学会发现一个问题,客户关联联系人的1:N关系,在表单subgrid中添加联系人时,只能新建而无法添加现有联系人,而这个现象在之前的版本中是没有的. 我们通过工具ribbon ...

  6. Docker教程:dokcer machine的概念和安装

    http://blog.csdn.net/pipisorry/article/details/50920982 Docker machine介绍 做为Docker容器集群管理三剑客之一的Docker ...

  7. Hessian源码分析--HessianServlet

    Hessian可以通过Servlet来对外暴露服务,HessianServlet继承于HttpServlet,但这仅仅是一个外壳,使用web服务器来提供对外的Http请求,在web.xml中我们会进行 ...

  8. 求解n皇后

    要求:在国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法 思路:很直观的想法就是在棋盘上一个一个皇后的摆,如果冲突,则摆放在另一个位置,直至 ...

  9. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  10. 手机广告投放(phone advertising)唯一标识

    手机标示,为了识别用户,方面advertising. 使用设备id,相当于暴露用户隐私.慢慢已不允许使用.. (长时间跟踪用户无异于暴露用户隐私,虽然大量数据适合兴趣建模,广告个性化推荐.但复杂多样会 ...