本项目要实现6个特定功能的选择,由6个按键组成的独立式键盘按下对应按键来完成,这里主函数采用选择结构,功能模块分别由子函数once( )、lr( )、lfun( )、ary( )、cpl( )和inc( )组成。子函数及其功能和实现方法见表2.2。
表2.2 子函数及其功能表
单片机I/O口的控制信号与8LED的亮灭状态的关系,根据电路可知,只要从P2口线输出0,则相应的灯就会被点亮。以8LED依次点亮一次为例,其控制规律如表2.3所示。
表2.3 LED点亮规律
如此看来,只要分析出项目所要求的LED点亮规律,就可排列出P2口的控制顺序。
一、主函数的编写
独立按键的软件常采用查询式结构。即先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序,由于此处是6分支构成的选择结构,故选用switch语句。流程图如图2.4所示。
图2.4 主函数流程图
源程序如下:
二、各功能子函数
1.函数once( )
编程思路:函数采用顺序结构,直接给出输出码并顺序输出。
2.函数lr( )
编程思路:总结8LED依次点亮的规律可知,设定初始显示码,每次P2口输出后均将其移位后再输出,共需移位8次,则程序采用循环结构,点亮灯的时间控制由延时函数完成。程序流程图如图2.5所示。程序如下:
图2.5 左移点亮流程图
3.函数lfun( )(www.daowen.com)
编程思路:C语言中没有循环移位运算符,故循环移位需编写如lr( )的程序段完成。但C语言的函数库的头文件intrins.h中有函数_crol_( )和_cror_( ),可完成左右循环移位。lfun( )就用此方法。
unsigned char_crol_(unsigned char c,unsigned char b);//字符循环左移
unsigned char_cror_(unsigned char c,unsigned char b);//字符循环右移
调用形式:变量=_crol_(变量名,移动位数)
程序如下:
4.函数ary( )
编程思路:建立一字符数组,将8LED的显示数据作为数组元素,按规定的显示顺序一一列出,通过循环程序依次读出后送P2口。
程序如下:
5.函数cpl( )
编程思路:设定初始显示码,利用C语言逻辑运算中取反操作实现。
程序如下:
6.函数inc( )
编程思路:设二极管亮表示1,二极管灭表示0,计数初值为0。分析可知,用循环做加法运算完成。
程序如下:
知识链接:2.3相关知识→2.3.1存储器组织、2.3.3 C语言程序设计基础
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。