以数码管显示程序为例讲讲单片机系统编程的一些方法和思想.doc

以数码管显示程序为例讲讲单片机系统编程的一些方法和思想.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
以数码管显示程序为例讲讲单片机系统编程的一些方法和思想

以数码管显示程序为例讲讲单片机系统编程的一些方法和思想 前后台程序结构,由主循环加中断构成,主循环程序称为“后台程序”或“背景程序”;各个中断程序称为“前台程序”,依靠中断内的前台程序来实现事件响应与信息收集。后台程序多个处理任务顺序依次执行,从宏观上看,这些任务将是同时执行的。前后台程序结构可以实现多任务同时执行,本质是快速地依次循环执行各个任务。编写前后台多任务程序最重要的原则是任何一个任务都不能阻塞CPU。每个函数都应尽可能快地执行完毕,将CPU让给后续的函数。 利用单片机数码管显示程序作为例子,使用RAM缓冲区。前台的定时中断扫描程序需要不断循环扫描刷新数码管,而后台任务可能随时需要改变显示内容。用一个数组作为显示缓冲,消除两种操作之间的时间关联性。 对于前台程序,在定时中断内只负责将显示缓冲中的内容依次显示到LED上,后台程序可以随时更改显示缓存数据,从而改变实际显示内容。显示缓冲在这里充当了前台程序与后台程序之间的数据传递渠道,消除了前后台之间的直接关联性。事实上,在这种结构下前台的刷新操作对于后台程序来说是不可见的,因此缓冲区也是一种很好的硬件隔离层。 我针对这个“前后台程序结构”的思想,再结合程序封装和程序分层的思想,参考了传统的数码管动态扫描程序,花了一天一夜写出了这个数码管显示模块子程序。这个子程序已经封装成一个函数,,提供4个参数输入,可以选择不同的工作模式。此函数要求8位数码管的段码数据线和位码数据线分时复用,共用单片机的某8位IO口,这里接P0口,所以需要上拉电阻。此程序对硬件的要求是:用两片地址/数据锁存器分别锁存数码管的段码和位码,共用单片机8位IO口,动态扫描方式。所以说这种方法占用的硬件资源很少,适合用于较大的单片机系统中。 程序的宏定义很简洁,只需要宏定义数据口,定义锁存器使能端,8位显示缓存区和段码表(段码表是共阳极的,只要在调用的时候取反就可以了)。用在不同的电路时,只需要改写数据端口的宏定义和锁存器使能端。这样的程序具有可移植性,封闭性,层次性,对以后的模块程序复用和系统程序构建有很大的益处。 封装好的函数为: LED_DisplayNumber(int Number,unsigned char Flat,unsigned char DecimalPoint,unsigned char SegBuffClear);。 以后在需要数码管显示功能的系统中,只要定义了相关端口,就可以在主程序循环中调用数码管显示函数了。只需要传入参数int Number,设置模式unsigned char Flat,设置小数点unsigned char DecimalPoint,设置清屏unsigned char SegBuffClear,就可以随意显示数据了。格式为(传入参数,【0为纯数字,1为温度值,2为按键输入】,1为有小数点,1为清屏)。 主程序中模拟了正负数、小数点、温度值、按键值和清屏的条件下的程序,并给出了运行的仿真效果图。数码管显示函数的内部结构已经全部呈现出来,并加上了详细的注释,帮助读者更方便地理解程序。本程序主要目的不是仅仅为了实现单片机的数码管动态显示功能,其最重要的意义在于对模块程序或功能函数封装和调用的编程思想,以及系统程序中“前后台程序结构”,“非阻塞型结构”和RAM缓冲区的编程方法。如果你是个初学者,或者你觉得这样的函数太复杂,没必要,可你接触了系统程序的编程时,你就会发现用教科书上的传统思想来编程会非常吃力不讨好。把程序封装成函数,把程序结构分出层次和“前后”,把程序写成“非阻塞型”,使用RAM缓冲区,这是系统程序中优良的编程方法,尤其在庞大的超低功耗的电路系统中。 终于写完了,包括程序和文章,感觉就是:“累并快乐着!”周末烦事多,天气不好,心情更不好。无心看书,更无意学习,于是就化郁闷为力量,一鼓作气写出了这些东西。不仅不开心的时间过得特别快,睡眠也好了,胃口也不错,当然心情也转好啦!^_^ 写程序的同时,大地震发生了,在这里向灾区的同胞们默默祝福,祈祷! #includereg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define SEG_PORT P0 sbit LATCH1=P3^6;//定义锁存使能端口 段锁存 sbit LATCH2=P3^7;// 位锁存 unsigned char DispBuff[8]; //显示数据缓存 unsigned char code LED_Tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x7f,0x9c,0xc6,0xbf}; // 显示段码值【0123456789 .

文档评论(0)

haocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档