位7段LED数码管显示_第1页
位7段LED数码管显示_第2页
位7段LED数码管显示_第3页
位7段LED数码管显示_第4页
位7段LED数码管显示_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安建筑科技大学课程设计(论文)第-26-页共-27-页西安建筑科技大学课程设计(论文)设计目的与要求1.1设计目的1.了解6位7段LED数码管的工作原理。2.熟悉并进一步掌握定时器和时基信号的使用方法。3.掌握SPCE061A单片机控制LED数码管显示的方法。4.通过本次课程设计使学生对智能仪表与装置系统有更深一步的了解,培养学生将理论知识综合利用的能力,并与实践紧密结合。5.掌握各子系统设计方法、步骤,培养学生创新能力,总结报告的能力。1.2设计环境1.装有Windows系统和μ’nSP(TM)IDE仿真环境的PC机一台,μ’nSP(TM)十六位单片机实验箱一个。2.本实验用到的实验箱硬件模块为:SPCE061A核心及周边电路模块(包含32个I/O口),6位8段数码管电路模块。1.3设计要求1.编程要求:主程序利用C语言编写,中断服务程序利用汇编语言编写。2.实现功能:SPCE061A单片机控制6个LED数码管的显示。3.实验现象:运行开始点亮所有的数码管,6位LED数码管均显示0并持续1s。1s后,第一位数码管从0显示到9,刷新时间为0.5s,其他数码管全部显示0。当第一位数码管显示到9后,第一位数码管保持显示9,第二位数码管从0显示到9,刷新时间为0.5s,其他数码管显示0。依次直到第6位数码管显示9,即6位数码管全部显示9,6位数码管全部显示0,持续1s,如此循环。(1s的时间、0.5s的时间都使用2Hz的时基信号(IRQ5)提供)。6位数码管的显示状态见表1.表16位数码管显示状态注意:①表中序号为0和61的状态持续1s;其他状态刷新时间为0.5s。②表中需要类似“1~10”表示有十个状态。设计的方案与基本原理2.16位8段数码管工作原理实验箱的6位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。实验箱上的数码管共有两种,如图1。图1两种数码管图首先介绍两个基本概念:段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图4-1中a~g、dp组成的数据(a为最低位,dp为最高位)就是段码。比如1的段码“0x06”(b=1,c=1,其他都为0,即段码为00000110b),8的段码为“0x7f”;位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作,比如仅使能DIG4,那么6个LED只有LED4工作,而其它的五个都不工作。当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。比如当在第一个数码管上显示一个“6”时,如图2,先选中第一位数码管的位信号(实验箱上标号是“1”),即先给和“1”相连接的I/O口送1;再把段码设置为0x007d,即在a、c、d、e、f、g各段引出的端口检测到高电平,就可以显示一个“6”出来。图2数码管显示“6”2.2实验箱上SPCE061A控制6位8段数码管的显示实验箱在6位8段数码管的上面有16对排针,其中有7个“a\b\c\d\e\f\g\”是控制此6位8段数码管的段码选择的,另有6个“1\2\3\4\5\6”是控制6位8段数码管位选择的,“DD”控制“点”或“分隔符号”,“DP”控制小数点。把实验箱上JP4和JP5的引针用跳线全部短接。框图如图3。图3实验箱上SPCE061A和6位LED显示电路模块的连接按照上面数码管的显示原理,当要在第四个数码管上显示一个“E”时,先要通过IOB12端口给“4”端口送一个1,选中第四个数码管;由图4-1可以看出,显示“E”时,需要a、d、e、f、g段被点亮,所以给IOA0、IOA3、IOA4、IOA5、IOA6端口各送一个1,则在a、d、e、f、g端口各能检测到一个高电平,就可以点亮a、d、e、f、g段,显示一个“E”。2.3动态显示原理动态显示是数码管显示比较常用的方式,可以很好的解决端口资源紧张问题。下面以四位数码管为例说明动态显示的原理,如图4所示图44位*7段数码管动态显示原理图动态显示的过程:以显示“1234”为例说明,首先发送“1”的段码“0x06”至数码管,然后仅使能位信号DIG4,LED4就会显示“1”,其余的数码管都是不工作的;延时一定时间之后再发送“2”的段码“0x5b”至数码管,同时仅使能位信号DIG3,这时“2”就会在LED3上显示出来;延时之后再发送“3”的段码并使能位信号DIG2,LED2就会显示“3”;延时一定时间之后再发送“4”的段码并使能位信号DIG1,LED1就会显示“4”;延时之后再回过头来重新发送“1”的代码,并选中位信号DIG4,重复循环点亮数码管。由于相邻两次(第一次点亮LED4和第二次点亮LED4)的时间间隔很短(t<10ms),看起来仿佛LED4一直在显示“1”,4各数码管整体看起来就在显示“1234”。动态显示的延时很重要,延时太短,数码管发光时间过短,数码管的亮度不够;延时太长,回扫间隔过大(超过11ms),肉眼就会感觉到闪烁。该例程采用4KHz中断作为时间基准执行动态扫描,每来一次中断,显示自动移位,回扫时间t=0.25ms*6=1.5ms。通过对I/O口的控制,定时1s的时间和0.5s的时间都使用2Hz的时基信号(IRQ5)。按照基础实验中IRQ5中断的工作原理,响应一次IRQ5_2Hz中断需要0.5s的时间,而响应两次中断的时间刚好是1s。按照实验要求,当开IRQ5_2Hz中断时,6位数码管全部显示“0”后,响应两次IRQ5_2Hz中断,再从第一个数码管开始显示;而刷新时间刚好是响应一次IRQ5_2Hz中断的时间。2.4unSPIDE2.0.0简介1.为什么推出unSPIDE2.0.0D(R)为了提高μ’nSPIDE工具的兼容性,让μ’nSPIDE工具能支持更多的芯片,并且由于实验箱实验指导书的全面改版,IDE下的例程全面修改、更新,凌阳科技推出了μ’nSPIDE工具的最新版本——unSPIDE2.0.0(以下简称:IDE2.0.0)。IDE2.0.0作为μ’nSPIDE工具截止现在(2005-11-11)最新的一个版本,它不但继承以前版本IDE的特点,同时增加了一些新的功能,集纳了众多用户在使用μ’nSPIDE过程中提出的一些意见,并包含了一些新的例程。除增加了一些新的功能外,IDE2.0.0在编译优化、代码查错定位等方面都有了一定的进步,用户在使用本版IDE时,应该可以体会到,其对代码的严谨性有了更高的要求。而在新版IDE的各个方面,都有所加强,用户在使用过程当用会有所体会。新添加功能、加强原有功能等,都没有改变unSPIDE一惯的使用方法,所以用户可以参考unSPIDE184(R)的用户手册,以学习μ’nSPIDE的基本操作及相关知识,这在IDE2.0.0的使用当中是保持不变的。2.从IDE184到IDE2.0.0D的变化IDE1.8.4是用户用的最多的一版μ’nSPIDE工具,实际上在推出IDE1.8.4之后,μ’nSPIDE也在不断的升级,其间也出现了非常多的版本,比如已发布的就有IDE1.16.1和IDE1.18.1;但相比之下,IDE2.0.0的版本有更多细节的完善,更多新功能的添加,为用户的代码编辑、工程调试等提供了更人性化的辅助功能和更便利的工具。从较大的区别来看,IDE2.0.0工具由IDE1.8.4支持两颗芯片变为支持四颗芯片,增加了许多新的功能,并对一些旧的功能进行了改善,同时对IDE1.8.4下包含的例程进行了修改、更新和规范化,走过了很长的路程,是对前面μ’nSPIDE工具版本的升级。而IDE在安装后的文件结构发生了一些变化,为后期加入更多的新芯片提供了统一的平台,也更符合IDE版本维护的要求。从细节上看,IDE2.0.0在代码编译、优化以及错误、警告定位方面都作了改进,在调试时的增加变量提示、在Memery观察窗中数据变化以红色提示等等;为用户的软件编辑、调试提供了更加友好的界面。在网上提供的《IDEUserguide》(unSPIDE184用户手册)中详细地介绍了μ’nSPIDE工具的使用方法.2.5系统硬件连接硬件连接图如图3,IOA0~IOA7分别接数码管的7个段信号a~g和小数点信号dp,IOB15~IOB12连接数码管的位信号1~4,IOB2~IOB1连接数码管的位信号5~6,IOB0连接数码管的分隔符号信号DD,即把JP4和JP5的引针用跳线全部短接。硬件电路连接图程序设计本程序由主程序和中断服务程序组成。3.1主程序主程序流程图如图5。先进行系统初始化;开2Hz中断;进入数码管循环显示程序:判断位信号寄存器是否为0(位信号寄存器由读者自己定义,这个寄存器的内容在中断里会改变),如果为0,6位数码管显示“000000”;如果不为零,按照位信号和段码显示数据进行显示。图4-5主程序流程图主程序:#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延时unsignedintg_uiFlag; //用于控制数码管unsignedintg_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};//0, 1, 2, 3, 4, 5, 6, 7, 8, 9unsignedintg_uiSeg; //段码指针3.2中断服务程序由于显示数据的刷新时间为1s和0.5s,因此考虑采用2Hz(0.5s)时基中断。并且在中断内部完成段码数据更新。具体的流程如图6示:在中断服务程序中会用到三个重要的寄存器:中断计数寄存器、显示数据寄存器、位信号寄存器。其中中断计数寄存器用于记录第几次进入中断(前3次有效),显示数据寄存器的内容为当前被刷新显示数据的数值(0~9),位信号寄存器用于标识被刷新数据所在位。结合主程序分析中断程序:首先显示“000000”时需要延时1s,使用2Hz中断产生1s延时,需要连续响应两次中断,第二次响应中断延时满1s,设置显示数据寄存器和位信号寄存器,让第一位数码管显示1,其余各位仍为“0”,即显示“100000”;判断显示数据寄存器显示数据是否大于9,如果小于,显示数据寄存器数据加1;如果大于,判断位信号寄存器是否已经指向第六位数码管,否则位信号寄存器设置为指向下一位数码管,显示数据寄存器显示数据设置为0;如果已经指向第六位数码且显示数据寄存器为9,寄存器清零,清中断标志,中断返回。中断服务程序流程图:图6中断服务程序流程图中断服务程序:intmain(void){ unsignedintDis1[6]={0x003f,0x003f,0x003f,0x003f}; unsignedintuiIntStatus; uiIntStatus=*P_INT_Ctrl_New; //开2Hz中断 uiIntStatus|=C_IRQ5_2Hz; *P_INT_Ctrl=uiIntStatus; g_uiFlag=0x0000; //该变量在2Hz中断当中会被修改 g_uiSeg=0; //该变量在2Hz中断当中会被修改,以便及时刷新显示DIG_Init(); //显示初始化,同时会打开IRQ4的4KHz中断 while(1) { if(g_uiFlag==0x0000) { DIG_SetAll(Dis1); //设置数码管全部显示0 } if(g_uiFlag!=0x0000) { DIG_Set(g_uiFlag,g_Data[g_uiSeg]); //刷新6位数码管显示值 } *P_Watchdog_Clear=0x0001; }}4.调试4.1实验步骤1.新建一个工程ex1_Led_Show,新建一个C语言文件main.c,新建一个汇编语言文件isr.asm。(根据读者需要可以自己新建文件)2.拷贝头文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,这两个文件在IDE的安装路径\SPCE061A\include路径下可以找到。3.添加SPCE061A.h、SPCE061A.inc到工程的“HeadFiles”;添加后可以直接用这两个头文件中申明的变量或者地址单元。4.按照程序流程图编写程序。5.RebuildAll。6.按照硬件连接图连接电路,注意断开JP3和JP7的所有引针,以免影响输出显示数据。4.2调试结果调试结果如下图:运行开始时图7运行开始时运行到第1位9、第2位1时图8运行到第1位9、第2位1时运行到前两位都为9时图9运行到前两位都为9时运行到6位都为9时图10运行到6位都为9时5.总结在这为期两周的课程设计中,通过对6位7段LED数码管显示的设计与分析,我清楚地认识到了自己以前仅仅学到的书本上的知识的欠缺与经验的不足,所谓实践出真知,智能仪器本就是一种实践操作环节十分重要的课程,而这次的课设正好弥补了我操作方面的不足,进而更加巩固了这方面的知识。课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。尤其是硬件方面的知识,我们更为的稀少,以前的课程中学到的基本都是软件方面LabVIEW的使用等等,而硬件却是很少接触到,因此对于硬件我们是知之甚少。然而我们通过不断地查阅6位7段LED数码管和IDE的相关资料,对其有了进一步的认识,还有硬件设备与软件的连接,我们也都出现过问题,但最总都能认真的一一排除予以解决。最终,我们达到了任务书上的要求,完成了本次的智能仪器课程设计。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!最后感谢本次课程设计中老师与同学们的帮助与指导,使我获益匪浅!6.参考资料【1】朱麟章蒙建波主编.检测理论及应用.重庆大学出版社2007.8(2)【2】张国雄编著.测控电路天津大学出版社2005.1【3】费业泰编著.误差理论与数据处理.合肥工业出版社2005.1【4】王志刚编著.单片机应用技术及实训.北京:清华大学出版社2004.5附录设计程序汇总Main.c#include"SPCE061A.h"#include"Dig.h"#defineC_IRQ5_2Hz 0x0004unsignedintg_uiFirst=0x0000; //用于控制1s延时unsignedintg_uiFlag; //用于控制数码管unsignedintg_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f}; //0, 1, 2, 3, 4, 5, 6, 7, 8, 9unsignedintg_uiSeg; //段码指针//========================================================// 语法格式: intmain(void)// 实现功能: 数码管显示// 参数: 无// 返回值: 无//========================================================intmain(void){ unsignedintDis1[6]={0x003f,0x003f,0x003f,0x003f}; unsignedintuiIntStatus; uiIntStatus=*P_INT_Ctrl_New; //开2Hz中断 uiIntStatus|=C_IRQ5_2Hz; *P_INT_Ctrl=uiIntStatus; g_uiFlag=0x0000; //该变量在2Hz中断当中会被修改 g_uiSeg=0; //该变量在2Hz中断当中会被修改,以便及时刷新显示 DIG_Init(); //显示初始化,同时会打开IRQ4的4KHz中断 while(1) { if(g_uiFlag==0x0000) { DIG_SetAll(Dis1); //设置数码管全部显示0 } if(g_uiFlag!=0x0000) { DIG_Set(g_uiFlag,g_Data[g_uiSeg]); //刷新6位数码管显示值 } *P_Watchdog_Clear=0x0001; }}Isr.asm.INCLUDESPCE061A.inc.INCLUDEDig.inc.EXTERNAL_g_uiFirst.EXTERNAL_g_uiFlag.EXTERNAL_g_uiSeg.TEXT//========================================================// 汇编格式: _IRQ4// 实现功能: 1KHz中断调用F_DIG_Drive函数// 参数: 无// 返回值: 无//========================================================.PUBLIC_IRQ4_IRQ4: pushr1,r5to[sp] r1=C_IRQ4_1KHz testr1,[P_INT_Ctrl] jnz?L_IRQ4_1KHz r1=C_IRQ4_2KHz testr1,[P_INT_Ctrl] jnz?L_IRQ4_2KHz?L_IRQ4_4KHz: callF_DIG_Drive//F_DIG_Drive函数是数码管显示函数,定义在Dig.asm文件中 r1=C_IRQ4_4KHz [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ4_2KHz: [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ4_1KHz: callF_DIG_Drive [P_INT_Clear]=r1 popr1,r5from[sp] reti//========================================================// 汇编格式: _IRQ5// 实现功能: 2Hz中断进行显示处理// 参数: 无// 返回值: 无//========================================================.PUBLIC_IRQ5_IRQ5: pushr1,r5to[sp] r1=C_IRQ5_2Hz testr1,[P_INT_Ctrl] jnz?L_IRQ5_2Hz?L_IRQ5_4Hz: r1=C_IRQ5_4Hz [P_INT_Clear]=r1 popr1,r5from[sp] reti?L_IRQ5_2Hz: r1=[_g_uiFirst] cmpr1,0x0001 //第2次进入中断 ja?Start //时间〉=1s r1=[_g_uiFirst] //时间小于1s r1+=1 [_g_uiFirst]=r1 goto?Exit ?Start: r1=[_g_uiFirst] cmpr1,2 //1s jne?Next r1+=1 //初始化g_uiFlag、g_uiSeg显示"1000" [_g_uiFirst]=r1 r1=1 [_g_uiFlag]=r1 r1=2 [_g_uiSeg]=r1 goto?Exit?Next: r1=[_g_uiSeg] cmpr1,9 //更改段码指针,显示数值加1 ja?Next1 r1+=1 [_g_uiSeg]=r1 goto?Exit?Next1: r1=[_g_uiFlag] //更改被刷新数码管位 cmpr1,4 je?Last r1+=1 [_g_uiFlag]=r1 r1=2 [_g_uiSeg]=r1 goto?Exit?Last: r1=0x0000 //置标志,重新显示“000000” [_g_uiFirst]=r1 [_g_uiFlag]=r1 goto?Exit?Exit: r1=C_IRQ5_2Hz [P_INT_Clear]=r1 popr1,r5from[sp] RetiDig.asm.DEFINESEG_IO_Port 0 //若LED段选使用IOA口则采用该行定义//.DEFINESEG_IO_Port 1 //若LED段选使用IOB口则采用该行定义.DEFINESEG_IO_HighByte 0 //若LED段选使用IO口低8位则采用该行定义//.DEFINESEG_IO_HighByte 1 //若LED段选使用IO口高8位则采用该行定义//================================================// LED位控制端口设定//================================================//.DEFINEDIG_IO_Port 0 //若LED位选使用IOA口则采用该行定义.DEFINEDIG_IO_Port 1 //若LED位选使用IOB口则采用该行定义/////数码管的位数/////.DEFINEDIG_Count 4/////数码管每一位的控制脚设定/////.DATAPIN_DIG: .DW0x0004,0x0008,0x0010,0x0020; /////数码管所有位的控制脚设定,应等于PIN_DIG所有数之和/////.DEFINEPIN_DIG_ALL 0x003C//================================================// 不必修改下面的定义//================================================.IF SEG_IO_Port==0 .DEFINEP_SEG_Data 0x7000 .DEFINEP_SEG_Buf 0x7001 .DEFINEP_SEG_Dir 0x7002 .DEFINEP_SEG_Attrib 0x7003.ELSE .DEFINEP_SEG_Data 0x7005 .DEFINEP_SEG_Buf 0x7006 .DEFINEP_SEG_Dir 0x7007 .DEFINEP_SEG_Attrib 0x7008.ENDIF.IFSEG_IO_HighByte==0 .DEFINEPIN_SEG_ALL 0x00ff.ELSE .DEFINEPIN_SEG_ALL 0xff00.ENDIF.IF DIG_IO_Port==0 .DEFINEP_DIG_Data 0x7000 .DEFINEP_DIG_Buf 0x7001 .DEFINEP_DIG_Dir 0x7002 .DEFINEP_DIG_Attrib 0x7003.ELSE .DEFINEP_DIG_Data 0x7005 .DEFINEP_DIG_Buf 0x7006 .DEFINEP_DIG_Dir 0x7007 .DEFINEP_DIG_Attrib 0x7008.ENDIF//================================================// 中断常量定义//================================================.DEFINEP_INT_Mask 0x702d.DEFINEC_IRQ4_4KHz 0x0040//================================================// 变量定义//================================================.RAMR_DIG_Buf: .DW DIG_CountDUP(?) //数码管显示缓冲区.IRAMR_CurDIG: .DW 0xffff //当前显示的数码管位,0xffff表示不显示//================================================// 公有函数声明//================================================.PUBLICF_DIG_Init.PUBLIC_DIG_Init.PUBLICF_DIG_Set.PUBLIC_DIG_Set.PUBLICF_DIG_SetAll.PUBLIC_DIG_SetAll.PUBLICF_DIG_Get.PUBLIC_DIG_Get.PUBLICF_DIG_GetAll.PUBLIC_DIG_GetAll.PUBLICF_DIG_Drive.PUBLIC_DIG_Drive.PUBLICF_DIG_Off.PUBLIC_DIG_Off.PUBLICF_DIG_On.PUBLIC_DIG_On.code//======================================================//函数名称: DIG_Init//C调用: voidDIG_Init(void)//汇编调用: F_DIG_Init//实现功能:数码管显示初始化,该函数将开启IRQ4_4KHz中断//入口参数: 无//出口参数: 无//破坏寄存器: 无//======================================================_DIG_Init:F_DIG_Init: pushr1,bpto[sp] INTOff r1=DIG_Count r2=0x0000 bp=R_DIG_Buf?DIG_InitBuf: //清除显示缓冲区 [bp++]=r2 r1-=1 jnz?DIG_InitBuf [R_CurDIG]=r2 //当前显示的位设置为0 r1=[P_SEG_Attrib] //初始化段选IO r1|=PIN_SEG_ALL [P_SEG_Attrib]=r1 r1=[P_SEG_Buf] r1&=~PIN_SEG_ALL [P_SEG_Data]=r1 r1=[P_SEG_Dir] r1|=PIN_SEG_ALL [P_SEG_Dir]=r1 r1=[P_DIG_Attrib] //初始化位选IO r1|=PIN_DIG_ALL [P_DIG_Attrib]=r1 r1=[P_DIG_Buf] r1&=~PIN_DIG_ALL [P_DIG_Buf]=r1 r1=[P_DIG_Dir] r1|=PIN_DIG_ALL [P_DIG_Dir]=r1 r1=[P_INT_Mask] //开启IRQ4_4KHz中断 r1|=C_IRQ4_4KHz [P_INT_Mask]=r1 INTFIQ,IRQ popr1,bpfrom[sp]retf//======================================================//函数名称: DIG_Set//C调用: voidDIG_Set(unsignedDigPos,unsignedDigBuffer)//汇编调用: F_DIG_Set//实现功能:设置数码管某一位的显示内容//入口参数: DigPos(r1)-设置的数码管位(1~DIG_Count)// DigBuffer(r2)-数码管的显示内容//出口参数: 无//破坏寄存器: 无//======================================================_DIG_Set: pushr1,r2to[sp] r1=sp+5 r1=[r1] r2=sp+6 r2=[r2] callF_DIG_Set popr1,r2from[sp]retfF_DIG_Set: pushbpto[sp].IFSEG_IO_HighByte==1 r2=r2lsl4 r2=r2lsl4.ENDIF r1-=1 cmpr1,DIG_Count //如果"位"值超出范围则退出 ja?Exit bp=R_DIG_Buf //将R_DIG_Buf的相应元素修改为设定值 bp+=r1 [bp]=r2?Exit: popbpfrom[sp]retf//======================================================//函数名称: DIG_SetAll//C调用: voidDIG_SetAll(unsigned*DigBuffer)//汇编调用: F_DIG_SetAll//实现功能:设置所有数码管的显示内容//入口参数: DigBuffer(r1)-数码管显示内容的起始地址//出口参数: 无//破坏寄存器: 无//======================================================_DIG_SetAll: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_SetAll popbpfrom[sp]retfF_DIG_SetAll: pushr2,bpto[sp] bp=r1 r2=DIG_Count r3=R_DIG_Buf?DIG_Set_Loop: r1=[bp++] //将R_DIG_Buf修改为设定值.IFSEG_IO_HighByte==1 r1=r1lsl4 r1=r1lsl4.ENDIF [r3++]=r1 r2-=1 jnz?DIG_Set_Loop popr2,bpfrom[sp]retf//======================================================//函数名称: DIG_Get//C调用: unsignedDIG_Get(unsignedDigPos)//汇编调用: F_DIG_Get//实现功能:获取所有数码管的显示内容//入口参数: DigPos(r1)-要获取显示内容的位//出口参数: 该位数码管的显示内容//破坏寄存器: 无//======================================================_DIG_Get: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_Get popbpfrom[sp]retfF_DIG_Get: pushr2to[sp] r2=R_DIG_Buf r2+=r1 r1=[r2] popr2from[sp]retf//======================================================//函数名称: DIG_GetAll//C调用: unsigned*DIG_GetAll(unsigned*DigBuffer)//汇编调用: F_DIG_GetAll//实现功能:获取所有数码管的显示内容//入口参数: DigBuffer(r1)-保存数码管显示内容的起始地址//出口参数: 保存数码管显示内容的起始地址//破坏寄存器: 无//======================================================_DIG_GetAll: pushbpto[sp] bp=sp r1=[bp+4] callF_DIG_GetAll popbpfrom[sp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论