点击看原图
其中地址为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范围的地址空间内自由跳
转。

4 采用分区指令冗余技术提高软件抗干扰性
为了确保程序稳定可靠运行,有时必须采用软硬件抗干扰设计。在某些场台,大量的干扰源虽然不会造成单片机硬件系统的破坏,却常常会破坏数字信号的时序,更改单片机寄存器内容,导致程序的“跑飞”或进入死循环。因此在提高硬件可靠性的基础上,还需要在程序设计中采取软件抗干扰,从而提高软件的可靠性,减少软件错误的发生或者在发生错误的情况下仍能使系
统恢复正常运行。
针对EM78系列单片机,笔者采用了分区指令冗余技术来防止程序的跑飞。即对程序中没有使用的程序空间用“NOP_NOP_JMP”指令将其填满。当程序跑飞到单指令的“NOF”上时,不会发生将操作数当作指令来执行的错误,同时后面增加“JMP”指令使程序跳转到程序跑飞处理程序上。图4给出图例。

图4中,针对EM78系列单片机ROM的结构特点,分别在4个页里存放一个单独的跑飞处理程序Error(),程序的功能可以是“踢狗”(外置“狗”)。这样做的原因如下:如果只编写一个跑飞处理程序,假设放在PageO里,如果程序在Page2跑飞后,它不会跳到PageO的跑飞处理程序,反而会跳到Page2中,这样程序仍然处于一种跑飞的状态。所以在每个Page里添加Error()程序,这样无论程序在哪个Page里跑飞,都会跳到Error()处理程序中。笔者实际中采用了这种方法取得了很好的效果。
5 其它常见问题分析
在使用EM78系列芯片进行开发时,除了上面要注意的几点,还会遇见一些其它小问题。下面就提出这些问题及解决方法,希望读者编程时有所注意。
(1)切记堆栈的深度
汇编语言编程中

