我理解的所谓数据驱动程序的方法,简单而言:将数据与程序分析,将代码逻辑的组织转换成数字规律的统计。即将数据作为一个要处理的脚本(当做数据库),然后程序作为解释器,将脚本的内容用代码逻辑解释出来,实现编程功能。

这就要求我们将代码逻辑分解出其内在数据关系,这样我们就可以写出与数据无关的函数,这样的函数通用性很大,利于复用,耦合性也比较低,利于修改,且修改后不易出错。

这样的方法也有坏处,就是可读性变差,解决的办法就是多写点关于逻辑的注释。

下面举个例子:(来自书籍--单片机编程魔法师之高级裸编程思想,挺好的一本书,可以看看,可以去下载下载链接处,待有缘人! )

(1)要实现如下波形:

(2)我们 一般的实现方法:将上面分成16段(依据是波形存在不一样的时候作为分界点),每段单独分析。代码如下(使用51单片机实现)。

#include <reg51.h>sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;void delay(unsigned char d, unsigned int t)
{unsigned int i;P1 = P1 & 0xF0 | d;for(i=0; i<t; i++);
}main(void)
{while(1){delay(0x00, 749);     // 阶段1delay(0x01, 251);     // 阶段2delay(0x00, 749);     // 阶段3delay(0x03, 251);     // 阶段4delay(0x00, 749);     // 阶段5delay(0x01, 251);     // 阶段6delay(0x00, 749);     // 阶段7delay(0x07, 251);     // 阶段8delay(0x00, 749);     // 阶段9delay(0x01, 251);     // 阶段10delay(0x00, 749);        // 論僇11delay(0x03, 251);        // 論僇12delay(0x00, 749);        // 阶段13delay(0x01, 251);        // 阶段14delay(0x00, 749);        // 阶段15delay(0x0F, 251);        // 阶段16}
}

(3)而采用数据驱动程序的方法:将每个阶段分离出数据,然后用一个函数统一处理。本例中使用数组来存储代表各个阶段的逻辑的数据,接着用一段代码就可解决,来代码如下:

#include <reg51.h>sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;#define STAGES       16
unsigned char code P1_1234[] = {0, 1, 0, 3, 0, 1, 0, 7, 0, 1, 0, 3, 0, 1, 0, 15};
unsigned int code Dts[] = {749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251, 749, 251};void delay(unsigned char d, unsigned int t)
{unsigned int i;P1 = P1 & 0xF0 | d;for(i=0; i<t; i++);
}main(void)
{int i;while(1){for(i=0; i<STAGES; i++)delay(P1_1234[i], Dts[i]);}
}

(4)好处:似乎没有看出了,牺牲了易读性,有得必有失,我们会的得到什么?

再举几个例子:实现以下波形。对于这个波形,如果我们不采用数据驱动程序的方法,那么相当于重写(重新分阶段,不难但是繁琐),而使用这种高阶的方法后,解释器代码一个字母都不用改变。

数据驱动程序的代码如下:

#include <reg51.h>sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;#define STAGES       8
unsigned char code P1_1234[] = {0, 1, 3, 7, 15, 7, 3, 1};void delay(unsigned char d, unsigned int t)
{unsigned int i;P1 = P1 & 0xF0 | d;for(i=0; i<t; i++);
}main(void)
{int i;while(1){for(i=0; i<STAGES; i++)delay(P1_1234[i], 500);}
}

(5)总结:

虽然数据驱动代码这种高阶的方法不是万能,但是对于相似的编程要求,则给我们提供了一种可复用的方法,避免一些简单却繁琐的工作任务。

还有, 用这种方法记得写注释,不然不仅别人看不懂, 就连几天后的你再次回顾时,都不知道是怎么写出来的。

单片机高级裸机编程(一)-- 数据驱动程序相关推荐

  1. 好书推荐---单片机编程魔法师之高级裸编程思想

    <单片机编程魔法师之高级裸编程思想>以单片机裸环境为基础,为编程者定义了一个微操作系统(MOS)的编程环境,并面向应用中不断提高的需求对编程策略进行了深度剖析与研究,从而分离出数据驱动.并 ...

  2. 单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)

    单片机怎么实现模块化编程?思维+实例+系统教程(实用程度令人发指) \\\插播一条:文章末尾有惊喜哟~/// 在刚初始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得 ...

  3. BSP板机支持包、linux启动分析、ARM裸机编程

    文章目录 一.BSP 二.驱动 驱动的基本要素 三.启动分析 1.uboot 2.uboot的作用 3.uboot相关命令 关键的内容: 1)bootargs,启动参数 2)启动命令 3)修改启动延时 ...

  4. 应用编程与裸机编程、驱动编程的区别(Linux应用编程篇)

    用嵌入式Linux硬件平台下的软件开发来说,我们大可将编程分为三种,分别为裸机编程.Linux驱动编程以及 Linux应用编程. 裸机编程: 一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片 ...

  5. 03 - 程序设计框架:裸机编程中应用层、中间层、驱动层划分

    03-程序设计框架:裸机编程中应用层.中间层.驱动层划分 1.框架设计层次 <代码大全>第五章中,把程序设计分为四个层次: 软件系统,就是整个系统.整个程序 分解为子系统或包.比如我们可以 ...

  6. MCU裸机编程的状态机框架--第一部分

    MCU裸机编程的状态机框架--第一部分 1 状态机的概念 1.1 状态机的要素 1.2 状态迁移表 1.3 状态机思路实现一个时钟程序 1.4 状态机应用的注意事项 1.5 更复杂的状态机 2 单片机 ...

  7. avr-gcc与avr单片机c语言开发 pdf,AVR 单片机与GCC 编程使用方法

    原标题:AVR 单片机与GCC 编程使用方法 WIN 是一个ATMEL AVR 系列 的开发工具集,它包含GNU C 和C++编译器 . 1.1 一个简单的例子 为了先有一个感性的认识,我们首先看一下 ...

  8. 多比矢量图开发手册(六)-Web高级图元编程

    2019独角兽企业重金招聘Python工程师标准>>> 多比矢量图高级图元编程 自定义图元的可编辑属性 自定义数据对象是顶点或连线表示的后台数据.它可以是图形和形状相关的数据,也可以 ...

  9. 访问外部扩展C语言编程,单片机C语言编程(系统扩展IC)8.ppt

    单片机C语言编程(系统扩展IC)8 第8章 单片机系统扩展 第8章 单片机系统扩展 目 录 8.1 扩展并行三总线 8.2 扩展简单并行输入/输出口 8.3 扩展并行数据存储器 8.4 串行扩展总线接 ...

最新文章

  1. 【Ubuntu入门到精通系列讲解】常用 Linux 命令的基本使用
  2. asp.net添加电子地图
  3. 解决“无法找到运行搜索助理需要的一个文件”
  4. setInterval设置停止和循环
  5. java学习(51):上转型对象
  6. FileStream功能被禁用
  7. Linux中Docker的介绍、安装与卸载
  8. Cocos2d-x 发布 Android
  9. SVM算法及OpenCV源码分析
  10. asp 文本转时间_[译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目...
  11. 爬虫:Python爬虫学习笔记之Urllib库
  12. 小米11刷root记录
  13. 视频物体检测(VID) FGFA:Flow-Guided Feature Aggregation for Video Object Detection
  14. Qt多功能计算器(二)——三角函数
  15. 【办公实用网站收集】免费模板
  16. Vue 获取当前地理位置信息
  17. Deployer 部署项目
  18. 2019电大计算机考试题及答案,2019年最新电大《计算机应用基础》期末考前复习综合练习题(A、B、C)及参考答案资料小抄...
  19. 智能扫地机器人哪个品牌好?最受欢迎排行榜前十名
  20. C++ 对文件的最常用基操之对 ASCII 文件(文本文件、字符文件)的操作

热门文章

  1. Springboot mavne项目多模块打包,报错 找不到 base包,找不到common类等等
  2. 线圈平均半匝长matlab,电机同心式绕组、电机同心式绕组的绕线方法及电机与流程...
  3. 凝思Linux切换到root时出错
  4. 茆诗松《贝叶斯统计》第二版勘误
  5. 一点资讯拆VIE回国;拼多多做跨境海淘;复宏汉霖首款生物类似药获批...
  6. 社区电商平台运营新模式 社交零售电商私域流量新玩法
  7. java计算机毕业设计springboot+vue居民社区健康管理平台
  8. 60+精选网页UI设计作品PSD文件下载(上)
  9. Sqlmap 用户手册 使用教程
  10. 双目三维测距(python)