EM78系列单片机程序设计
扫描二维码
随时随地手机看文章
EM78 系列八位微控器是利用 (1)“call",(2) 改变PC (或“tbl"),(3)“retl k" 三个步骤来查表的。其中“retl k" 是将常数 k 的值传至工作寄存器 "A" 中。
步骤 (2) 中若利用“mov 0x2,a",或“add 0x2,a" 等等指令来改变PC,则因为此等指令会將 PC (R2) 的位 8、9 清除 (在 EM78056 只清除位 8),所以查表的内容只能放在程序每个 PAGE 的較低的 256 个位址。步骤 (2) 中若利用“tbl" 指令来改变PC,则因为此指令不会將PC (R2) 的位 8、9 清除,而保留“tbl" 所在位址的位 8、9,所以查表的内容可以放在程序每个 PAGE 中的任何位址。
例:查表
table add 0x02,a ;將相对位置加入 PC 而改变了PC
retl @0x19 ;传回常数内容 19h 至 "A"
retl @0x74 ;传回常数内容 74h 至 "A"
retl @0x2e ;传回常数内容 2eh 至 "A"
retl @0x54 ;传回常数内容 54h 至 "A"
retl @0x4b ;传回常数内容 4bh 至 "A"
inc 0x18
mov a,0x18 ;欲查的内容的相对位置放在"A"
call table ;查表
mov 0x10,a ;查表得到的内容移至 R10 中
5.1.2.分 PAGE 的用法1. 程序跳 PAGE 的用法:
EM78 系列八位微控器將其 Program Memory (ROM) 分成数个 PAGE,每个 PAGE 的长度是 1K (EM78056 除外)。R3 寄存器的位 5 (6) 是 "PAGE 选择位",当执行 "jmp" 或 "call" 指令时,"PAGE 选择位" 会被载入 Program Counter 的位 10 (11),因此当程序超过 1K (EM78056 为 0.5K)时,执行 "jmp" 或"call" 指令时,"PAGE 选择位" 正确的设定是非常重要的。下面将以 EM78256 为例来说明跳 PAGE 的方法。
例
例:从PAGE 1 跳转到PAGE 0
; PAGE 0, begin at 000h
049 add 0x11,a
050 mov a,@0x55
051 mov 0x05,a ;port5<-- 0x55
052 bs 0x03,5 ;select PAGE 1
053 jmp lab1 ;PAGE jump
054
; PAGE 1, begin at 400h
447
448 mov a,@0x3f
449 xor 0x12,a
450 Lab1 bc 0x06,3
451 mov a,0x05
说明:
052: 将 R3 寄存器的位 5 设为 "1" (选择 PAGE 1)。
053: Lab1 会被编译 为 "50",程序跳转至 PAGE 1 中 "Lab1" (450) 的位址。
注意:
此例中 "052" 和 "053" 是用来跳 PAGE 的,假如沒有 "052" 这行指令,则程序将跳转至"050" 的位址 (在 PAGE 0中),如此將沒有达到預期的目的。
2. 不同 PAGE 子程序呼叫的方法:
如第 1 项所述,当程序超过 1K 時,执行 "call" 指令时,"PAGE 选择位" 的设定就必须加以考虑。下面將以 EM78256 为例来说明呼叫不同 PAGE 子程序的方法。
例: 从PAGE 0调用PAGE 1中的子程序
; PAGE 0, begin at 000h
049 add 0x11,a
050 mov a,@0x55
051 mov 0x05,a ;port5<-- 0x55
052 bs 0x03,5 ;select PAGE 1
053 call Lab2 ;PAGE jump
054 bc 0x03,5 ;restore
055 jbs 0x15,2
056
; PAGE 1, begin at 400h
417
418 mov a,@0x3f
419 xor 0x12,a
450 Lab2 bc 0x06,3
451 mov a,0x05
45f ret
說明:
052: 將 R3 寄存器的位 5設为 "1" (选择 PAGE 1)。
053: Lab2 將会被編译为 "50",呼叫 PAGE 1 中 "Lab2" 子程序。
054: 將 R3 寄存器的位5 还原为 "0"。
注意:
此例中 "052" 和 "053" 是用来呼叫 PAGE 1 中 "Lab2" 的子程序,假如果沒有 "052" 這行指令,則程序將呼叫 "050" 的位址 (在 PAGE 0中),而非 "450" 的位址 (在 PAGE 1中),如此將发生錯誤。
5.1.3."BS","BC" 等指令对 I/O Port 的作用:"BS","BC" 等指令会先有 "读" 再 "写" 的动作,例如 "bc 0x06,3" 指令是將整个 Port 6 (8PIN) 读進 CPU,执行位运算后再写至 Port 6 上。假如 Port 6 有一些 pin 是双向 I/O pin (如 P65) 時,假設当执行 "bc 0x06,3" 時P65 是输入 pin,則 P65 pin 上的内容会被读入再写至 Latch 上,覆蓋原先 Latch 上的内容。因此只要 P65 一直是输入 pin 將不会有問題,一旦 P65 切換为输出,則 Latch 上的内容將是不可預知的。
5.1.4.I/O Port读取的路径:若仔細研究EM78系列八位微控器的I/O Port构造,就可发現在做"读"I/O Port的动作時(如"mov a,0x06"),所读入内容有两个路径来源,一是I/O pin上的内容,另一是输出Latch上的内容,而由I/O控制寄存器決定此读入的路径。
例如I/O pin设计为输入pin時(对应的I/O控制寄存器为"1"),对I/O Port做"读"的动作時,是读到pin上的内容。若I/O pin设计为输出pin時(对应的I/O控制寄存器为"0"),对I/O Port做"读"的动作時,是读到输出Latch上的内容。
5.1.5.WDT (Watchdog Timer)的使用:WDT是微控器內部RC自振的计時器,其超時溢位(Time-out)的基本周期約18ms,WDT有与TCC共用的倍除器,使得超時溢位(Time-out)的最大周期可至約2.2sec。WDT计時的使能或禁止是可隨時由指令控制的(控制位在IOCE寄存器)。当WDT使能時,其超時溢位將使微控器发生RESET(或喚醒),"wdtc"指令是用来清除WDT,令WDT再从头计時,因此适当的使用"wdtc"指令,可使WDT不会发生RESET。当WDT被禁止時,WDT不会使微控器RESET或喚醒。要特別注意的是,Power-on之後WDT是使能的,如果該应用中並沒有使用WDT,必須在程序的前头用指令將WDT计時禁止。EM78156/256/456就是依上述所設计。
在EM78247/447/248/448/056/P156除了上述的設计外,另有一Code Option決定使能或禁止WDT,其功能如下:
1. 假如应用中有使用WDT,WDT必須以Code Option使能,則在程序中隨時可以用指令使能或禁止WDT计時。注意:Power-on之後WDT是使能的。
2. 假如应用中並沒有使用WDT,WDT可以以Code Option禁止,則WDT是永遠被禁止的,如此可省去須在程序的前头用指令將WDT计時禁止的麻煩。
5.2.基本设计规则5.2.1.设定I/O口的模式:用户可以单独设定任一支I/O脚为输出模式(Output Mode),或是输入模式(Input Mode)。只要將每个I/O的设定写入累加器(A)中,再將累加器的内容写到I/O控制寄存器中,设定就算完成了。
例1:將PORT6设定为OUTPUT PORT。