微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > EH78系列单片机的编程技巧

EH78系列单片机的编程技巧

时间:09-02 来源:互联网 点击:
1 RAM数据的读取方法

EM78系列的RAM既可以认为是普通单片机中的RAM,也可以认为是寄存器(通用和专用寄存器)。以EM78P447为例,RAM共148×8位,其结构如图1所示。



其中地址为20H一3EH,共有124(31×4)个,分布在4个RAM“体”(Bank)上。4个体分别标记为“BankO(体O)”、“Bankl(体1)”、“Bank2(体2)”、“Bank3(体3)”。当程序中用到的变量不多或者数据量不是很大时,这种RAM结构对程序不会有什么影响,即程序变量能够分配在一个Bank中;但是当变量较多时,操作起来将会有些麻烦,同时有可能因为程序中Bank选择不当导致程序出错。笔者觉得当数据量较大时,只要是对数据操作,就要先进行Bank的选择。特别是对子程序而言,一进入子程序就要进行Bank的选择,从而控制所操作数据的范围,时刻要清楚自己操作的数据在哪个Bank内。通过改变“体选码”,即RSR寄存器的最高2位,来选择所要访问的数据Bank。下面给出一个程序来说明。


如上面程序所示,在调用LCD_ CLEAR之前访问了Bank2数据区,接着调用LCD-CLEAR子程序。此时在子程序内,若没有注意数据的Bank问题,即没有设置选择BankO,则原本要对BankO的数据操作则会发生在Bank2的相应数据地址上,从而程序发生错误。所以进入子程序后,马上选择要使用数据的Bank,从而防止发生误操作EM78系列单片机的开发语言为汇编语言,所以当编写汇编程序时,一定要养成一个良好的编程习惯,这非常有利于程序的开发和维护。笔者建议程序中对变量按如下操作。

①定义变量表。在程序开始的地方定义好变量表,为每一个变量取名,分配地址空间。

②相关变量最好定义在同一Bank内,这样当对这些相关变量操作时就可以免去选择Bank的麻烦。

③以变量名进行操作。不要对变量的地址直接操作,最好以变量名进行操作,这样当变量需要改变名字或者需要更改分配地址时,直接更改变量表即可,而不用更改具体的程序。这点对于较大的程序非常有利,不但可以增加程序的可读性,更重要的是提高程序的编写便利性和维护性。

以上几点对于编写较高质量的代码都非常重要,应在具体实践中仔细体会。

2 程序跨页跳转和跨页调用技巧

首先需要介绍一下EM 78系列单片机的程序存储器ROM结构。EM78系列的程序存储器ROM容量为4K×13位,采用Page(“页”)分配原则,就是将4K的程序空间分为4页,每个页容量为1K。其结构如图2所示,其中Page0(000H~3FFH)、Pagel(400H~7FFH)、Page2(800H~BFFH)、Page3(COOH~FFFH)。指令系统中的两条长距离跳转指令JMP和CALL,所携带的地址码仅仅有lO位,210=lK地址空间,即只能在1K的空间内跳转。当使用JMP指令时,装入目标地址到PC程序指针的低10位;使用CALL指令时,装入目标地址至PC程序指针的低10位,且PC+l压栈,调用同1K页面内的任何程序。PC程序指针(寄存器R2)和堆栈的位数是12位,即寻址空间分别为4K,一个程序页面为lK。页面选择通过设定状态寄存器R3的Bit6(PS1)、Bit5(PSO)来完成。



在EM447中,当需要跳转或调用不同页面的子程序时,则需在调用前修改R3的PSl、PS0,这样当执行IMP指令或CALL指令时会将状态寄存器R3的PSl、PS0载入PC的A11、A10,所以PC程序指针可以在4K范围的地址空间内自由跳转。

当编写的程序代码量较大(超过1K)时,程序跨页跳转和跨页调用是避免不了的。在使用JMP指令时,一定要知道将要跳到哪个Page;使用CALL指令时,一定要知道要调用的子程序位于哪个Page中。这样在使用JMP指令和CALL指令之前必须要设置PSl和PS0位来选择将要跳转或调用程序的存储空间。例程如下:

例程中首先设置PS相应位来选择Page3,然后调用INIT_CLEAR和SYS_INIT,之后选择Pagel,跳到Pagel中的SYS BEGIN主程序中。对于较大的程序,这种调用和跳转是经常出现的,所以要求编写程序前必须熟悉程序地址空间的分配。

3 ROM模块化编程原则

因为义隆提供的调试环境只支持汇编语言,而用汇编语言编写的程序,结构条理性劣于用C语言编写的程序,所以编写程序时应尽可能的将子程序功能模块化,即以完成某个功能来编写子程序,这样结构清晰、调用方便。

笔者在编写程序时,针对EM78系列单片机ROM的Page结构,将子程序按区分功能原则分别存放到不同的Page内,如图3所示为笔者项目中程序的存储空间分配。

图3中,PageO存放的主要是比较常用的子程序,如系统初始化程序、键盘扫描、液晶显示等;Pagel存放的是一些数据处理程序,如不同Bank的数据拷贝,十六进制转为二进制压缩BCD码等程序;Page2存放的加密算法程序,这是笔者项目开发中最重要的部分,所以单独的放在一个Page内;Page3主要是对IC存储器24LC02的一些读写操作子程序。这样将功能相近的子程序放在一个Page内,从而根据单片机的结构特点结合项目开发的实际来划分程序存储空间。在这样调试时,很容易发现问题出现在哪个区域,使得程序结构清晰明了,调用方便,易于调试和维护。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top