義隆單片機學習筆記之(三) 應用例程


常用寄存器:


0x01 (R1) 計時器

0x02 (R2)程序計數器 PC

0x03 (R3)狀態寄存器

0x04 (R4)間址寄存器

0x05 (R5)IO PORT 5

0x06 (R6)IO PORT 6

----- (IOC5)P5的輸入輸出配置

----- (IOC6)P6的輸入輸出配置

0x0f (ISR,讀)中斷信號指示寄存器(第三位有效,分別對應於3個中斷源)

0x0f (IOCF,寫)中斷屏蔽標志

0x0E (IOCE)(IO60作為中斷輸入的配置與看門狗的開關在一個寄存器中)

(IOCB、IOCD、IOCC)上拉,下拉,高阻設置腳...


 

目錄

看門狗設置

IO相關

中斷設置

循環

3種中斷例程

延時程序

中斷實例

所有寄存器地址及初值

 

看門狗設置

(WDT 計時的使能或禁止可隨時由指令控制(IOCE 寄存器)

 相關的寄存器:

  

                圖(一)IOCE寄存器 (0x0E)

0:關閉
1:使能

1 ;關閉wd
2 MOV A, IOCE
3 AND A, @01111111B
4 MOV IOCE, A

 

IO相關

概述:

"BS","BC" 等指令是先 "讀" 再 "寫" ,

1 ;例如 
2 bc 0x06,3
3 ; 指令是將整個 Port 6 (8 pin) 讀進 CPU,執行位運算
4 ; 后再寫至 Port 6 上。

IO所讀入內容有兩個路徑來源,一是 I/O pin 上的內容,另一是輸出 Latch 上的內容.

當I/O pin 設計為輸入 pin 時(對應的 I/O 控制寄存器為"1"),讀 pin 上的內容。

若 I/O pin設計為輸出 pin 時(對應的 I/O 控制寄存器為"0"),讀 輸出 Latch 上的內容。

IO模式設置:

將每個 I/O 的設定寫入累加器(A)中,再將累加器的內容寫到 I/O 控制寄存器中,設定就算完成了!

 1 ;例 1:將 PORT6 設定為 OUTPUT PORT。 
 2 PORT6 == 6 
 3 MOV  A, @0X00
 4 IOW  PORT6 
 5 
 6 ;例 2:將 PORT6 的低四位設成 INPUT PORT;高四位設定為 OUTPUT PORT。
 7 PORT6 == 6 
 8 MOV  A, @0X0F
 9 IOW  PORT6
10 
11 ;設定A= 0X0F
12 ;高四位為OUTPUT PORT
13 ;低四位為INPUT PORT。

IOC5~IOC6(I/O 口控制寄存器)

1:輸入(高阻)

0:輸出

 

中斷功能引腳設置(P60)

              圖(二) 依然使用的IOCE寄存器     

0:雙向 I/0 口
1:外部中斷輸入腳.[此時 P60 必須設為輸入: IOC6.0=1]

1 ;P60設置為外部中斷輸入引腳
2 MOV A, IOCE
3 OR A, @01000000B
4 MOV IOCE, A
1 ;將P60腳設置為輸入引腳
2 IOR 0X6
3 OR A, @0X01
4 IOW 0X6

 

IO讀寫

IO輸入輸出寄存器R5、R6

EM78 將 I/O 映射為寄存器來操作,R6 為 8 位,R5 僅有低 4位有效。

 

循環

(利用一個寄存器為計數器,在程序執行前,先將計數寄存器設為 N,然后每執行一
次,計數器就減一,再調回原函數執行,直到計數器被減至零)

 

1 ;設計一個 FOR LOOP 循環,讓循環連續執行 10 次。 
2         MOV  A, @0X0A 
3         MOV  0X10, A 
4 LOOP: 
5         DJZ  0X10 
6         JMP  LOOP

 

查表程序

(利用“mov 0x2,a",或“add 0x2,a" 等等指令來改變 PC)

 1例:查表 
 2 table add 0x02,a ;將相對位置加入 PC 而改變了 PC 
 3 retl @0x19 ;傳回常數內容 19h 至 "A" 
 4 retl @0x74 ;傳回常數內容 74h 至 "A" 
 5 retl @0x2e ;傳回常數內容 2eh 至 "A" 
 6 retl @0x54 ;傳回常數內容 54h 至 "A" 
 7 retl @0x4b ;傳回常數內容 4bh 至 "A" 
 8 inc 0x18 
 9 mov a,0x18 ;欲查的內容的相對位置放在"A" 
10 call table ;查表 
11 mov 0x10,a ;查表得到的內容移至 R10 中 

 

 

中斷

1.系統相應中斷的時機:

在每條指令周期中,在最后的階段系統會檢測中斷標志位,如果發生了中斷請求,系統就會保護現場,然后跳轉到中斷程序中執行。

在程序中,每條指令周期的最后階段還是會去檢測中斷標志位,如果沒有禁止中斷,還是可能會進而響應另一個中斷。

相關寄存器:

;控制寄存器是用來控制 I/O 的工作狀態、中斷控制、看門狗控制等,
;其讀寫只能采用指令 I0R R 或 IOW R 來完成

1 CONT

                圖(三) CONT(控制寄存器)

使用“ENI”指令時所有中斷被開放,而使用“DISI”指令,則所有中斷被關閉。

2 RF

                圖 (四)RF( 中斷狀態寄存器)0x0f

1:有中斷     0:無中斷
Bit0: TCC 計數器 1 溢出中斷標志位; (當 TCC 計數器 1 溢出時置“1”,可由軟件清零。)
Bit1: IO口 6 輸入變化中斷標志位,     (當口 6 輸入變化時置“1”,可由軟件清零。 )
Bit2: 外部中斷標志位。         (當 INT 腳有下降沿觸發時置“1”,可用軟件清零。)

·RF 可用軟件清零,但不能被置“1”
·IOCF 為中斷屏蔽寄存器,通過指令讀取 RF 值,此時結果值為 RF 和 IOCF 相與的結果

3 IOCF

 

              圖(五) IOCF(中斷屏蔽寄存器)0x0f    (讀為RF,寫為IOCF?)

0:屏蔽
1:允許

Bit0:(TCC 溢出中斷)
Bit1:(P6 口輸入變化中斷)
Bit2:(外部中斷 P60/INT)

IOCF 相應的控制位置“1”、則相應的中斷允許。  (相當於中斷有兩個開關:ENI + IOCF

;程序初始化(關閉WD,設定地址)、計時器初始化、主循環等待溢出中斷
;中斷處理程序
 1 ;例1(計數器中斷):寫一個程序,將寄存器 0X20 當做計數器,每當 TCC 中斷產生,就自動加 1。 
 2 MOV  A, @0X0        ;A=0
 3 IOW  0X0E           ;關閉WatchDog
 4 ORG  6              ;設定接下來的程序位址
 5 CLR  0X20           ;清除寄存器0X20。
 6 JMP  TCC_PRO        ;跳轉到TCCPRO
 7 
 8 INT_PRO: 
 9 DISI 
10 CLR  0X0F 
11 INC  0X20 
12 RETI                 ;返回主程序,並使能中斷
13 
14 TCC_PRO: 
15 CLR  0X0F            ;清除中斷寄存器
16 MOV  A, @0X01        ;設定 A = 1
17 IOW  0X0F            ;使能TCC溢位中斷產生
18 MOV  A, @0X40         ;設定 A = 0X40 (0100 0000)
19 CONTW                ;將A的值寫入控制寄存器  【分頻器分配給TCC,分頻比1:2,上升沿觸發,使用內部指令周期】
20 ENI                  ;使能中斷
21 
22 TCC_WAIT: 
23 NOP 
24 NOP 
25 JMP  TCC_WAIT         ;等待TCC計數器計數溢位

TCC 中斷產生有幾個設計的重點:
1.  關閉看門狗計時器(Watch Dog Timer)。
2.  設定控制寄存器(包括預除器、TCC 信號來源、觸發時機…)。
3.  使能中斷(下 ENI 指令)。
4.  使能 TCC 中斷(設定中斷控制寄存器的 bit0 為 1)。
5.  中斷服務位址為 0X08。 【ORG 6 指令后面還有兩條指令】
6.  進入中斷服務程序首先要將中斷禁止,否則會產生重復中斷。
7.  中斷寄存器 0X0F,在進入中斷服務程序時可以提供用戶判斷為何種中斷,判斷完成之后用戶必須自行清除。
8.  由中斷服務程序返回主程序應使用指令 RETI。

 

 1 ;例2(P6引腳變化中斷): 寫一個程序,將寄存器 0X20 當做計數器,每當 PORT6 Change 中斷產生,
 2 ;就自動加 1。 
 3 PORT6 == 6      ;定義。
 4 DISI         ;中斷禁止。
 5 ORG 6         ;設定下一個位址為0X06。
 6 CLR 0X20       ;清除計數寄存器。
 7 JMP PORT6_CH     ;跳轉到主程序。
 8  9 
10 INT_PRO:      ;0X08為中斷服務程序起始。
11 NOP 
12 CLR 0X0F       ;清除中斷標志寄存器。
13 INC 0X20       ;計數器遞增。
14 MOV PORT6, PORT6   ;將PORT6的值存入正反器。
15 RETI          ;回主程序。
16 
17 PORT6_CH: 
18 CLR 0X0F       ;清除中斷標志寄存器。
19 MOV A, @0XFF      ;設定 A = 0XFF。
20 IOW PORT6       ;將PORT6設成輸入口。
21 MOV PORT6, PORT6   ;將PORT6的值存入正反器。
22 ENI           ;使能中斷
23 MOV A, @0X02      ;設定 A = 0X02。
24 IOW 0X0F        ;使能PORT6 Change中斷產生
25 
26 
27 WAIT_INT: 
28 WDTC          ;清除Watch Dog Timer
29 NOP 
30 NOP           ;等待PORT6 Change
31 JMP WAIT_INT      ;循環   

使用 PORT6 Change 中斷有下列幾個步驟。
1.  關閉看門狗計時器(Watch Dog Timer),若看門狗計時器未關閉,用戶要定時下 WDTC 的指令。
2.  清除中斷寄存器。
3.  設定 PORT6 為輸出口。
4.  將 PORT6 的值存入觸發器中(這很重要)。
5.  使能中斷(下 ENI 的指令)。
6.  使能 PORT6 Change 中斷(設定中斷控制寄存器的 bit1 為 1)。 (從bit0開始)
7.  中斷服務程序的啟始位址在 0X08。
8.  進入中斷服務程序首先要將中斷禁止,否則會產生嵌套中斷。
9.  中斷寄存器 0X0F,在進入中斷服務程序時可以提供用戶判斷為何種中斷,判斷完成之后用戶必須自行清除。
10. 由中斷服務程序返回主程序應使用指令 RETI。

 

 1 ;例3(外部中斷)寫一個程序,將寄存器 0X20 當做計數器,
 2 ;每當外部中斷產生,就自動加 1。
 3 ORG  6         ;設定啟始位址為0X06
 4 CLR  0X20     ;清除計數器
 5 JMP  EXT_PRO   ;跳轉到主程序
 6 
 7 INT_EXT: 
 8 DISI         ;中斷禁止
 9 CLR  0X0F      ;清除中斷標志
10 INC  0X20      ;遞增計數寄存器
11 RETI         ;返回主程序
12 
13 EXT_PRO: 
14 CLR  0X0F       ;清除中斷標志
15 MOV  A, @0X04     ;A = 0X04
16 IOW  0X0F        ;使能外部中斷信號產生。
17 MOV  A, @0X40     ;A = 0X40
18 IOW  0X0E        ;設定PORT6, BIT0為中斷輸入腳
19 ENI           ;設定PORT6, BIT0為中斷輸入腳
20 
21 EXT_WAIT: 
22 NOP 
23 NOP
24 JMP  EX_WAIT      ;等待外部中斷輸

總結:、
1.中斷服務程序中:關中斷、請flag、處理、開中斷
2.程序初始化,org處理好中斷處理處理程序的地址、清flag、設置中斷引腳、相關配置、開中斷->主循環

所謂的外部中斷就是利用 IC 外部引腳,針對單片機外部的信號做為信號源來產生中斷。EM78 系列的外部中斷引腳是第 4 腳,
是和 PORT6 位 0 合用,所以再使用前要先設定 PORT6 。

 外部中斷顯然比較容易了解。所需注意的有:
1.  禁止中斷。
2.  設定中斷服務程序的地址在 0X08。
3.  清除中斷標志寄存器。
4.  使能外部中斷信號產生(設定中斷控制寄存器為 0X04)。
5.  將 PORT6, BIT0 設定成外部中斷引腳(設定控制寄存器 0X0E, BIT6 為 1)。
6.  使能中斷信號(ENI)。
7.  用戶在進入中斷服務程序(0X08)時,首先要記得禁止中斷(DISI)。
8.  可以由中斷標志寄存器判斷中段的信號為何產生,判斷完之后應自行清除中斷標志。
9.  返回主程序時用指令 RETI。

 

 

指令延時

一個精確的控制延遲時間的程序,選擇使用石英振盪器,可以精確的算准延遲時間,時間
可以到 nanosecond(十億分之一秒),很神奇。

 1 LP_CNT0 == 0X20 ;定義
 2 LP_CNT1 == 0X21 
 3 MOV  A, @2 ;A = 2
 4 MOV  LP_CNT0, A ;設定延遲寄存器0(LP_CNT0)=2 
 5 CALL P0_DLY ;呼叫時間延遲子程序

6 P0_DLY: 7 NOP ;調節延遲時間 8 MOV A, @200 ;設定 A = 200 9 MOV LP_CNT1, A;設定寄存器LP_CNT1 = 200

10 P0_LP: 11 NOP ;調節延遲時間 12 NOP ;調節延遲時間 13 NOP ;調節延遲時間 14 DJZ LP_CNT1 ;遞減LP_CNT1,為0就跳過下一行 15 JMP P0_LP ;循環 16 DJZ LP_CNT0 ;遞減LP_CNT0,為0就跳過下一行 17 JMP P0_DLY ;循環 18 RET ;返回主程序

所采用的振盪器為石英振盪(4M Hz),並選擇指令執行周期為 1 Cycle, 2 Clock。
這時每執行一個指令的時間為 0.5 uS.
用戶可以看出在程序中用了兩個寄存器來計數(LP_CNT0、LPCNT1),另外也使用了兩個循環(P0_DLY、P0_LP),其中在 P0_LP 中
有 5 個指令,所以在 P0_LP 這個循環中,執行了有 1000 個指令。

在整個 P0_DLY 循環中就有 2012 個指令,每個指令的執行時間為 0.5 us。
2012 (instructions) x 0.5 (us/instruction) = 1.006 ms
所以用戶可以精確的計算出延遲的時間,用戶可以在 LP_CNT0 設定不同的值,如此可以有各種不同的延遲時間。

1 ;例:設計一個延遲時間為 2ms 的程序。 
2 ;只要在上述程序中在呼叫 P0_DEL 延遲子程序之前,將 LP_CNT0 設成 4 就可以了。 
3 MOV   A, @4 
4 MOV   LP_CNT0, A 
5 CALL  P0_DLY 
6 ;其余不變。 
7 ;1005 X 4 (LP_CNT0 = 4)= 4020。 
8 ;4020 + 1 + 1 = 4022。 
9 ;4022 (instructions) X 0.5 (us) = 2.011 ms 

 

 LED發光二極管中斷實例:

(基於EM78153S)(包含程序現場的保護和還原,A,R3,R4)

源程序:

 1 ;**********************************************************************
 2 ; 本程序以外部中斷舉例
 3 ;上電時P50輸出高,在INT引腳輸入下降沿時進外部中斷,P50輸出翻轉一次。
 4 ;**********************************************************************
 5 ;MCU: EM78P153S
 6 ;Oscillator: IRC 4MHz
 7 ;Clock: 2
 8 ;WDT: Disable
 9 ;編譯軟件: WicePulse version  2.6081015
10 
11     INCLUDE "EM78P153S.INC"
12         A_buffer  ==    0x1C    ;保存A寄存器
13         R4_buffer ==    0x1D    ;保存R4寄存器
14         R3_buffer ==    0x1E    ;保存R3寄存器
15        
16         ORG        0X00
17         JMP        INITIAL
18         ORG      0X08
19 EX_INT:
20         MOV        A_buffer,A         ;保存 A  (累加器狀態)
21         SWAPA      R3   
22         MOV        R3_buffer,A        ;保存 R3 (狀態寄存器,進位,為零,頁等)
23         MOV        A,R4                 
24         MOV        R4_buffer,A        ;保存 R4 (間址寄存器)
25                 
26         JBS        EXIF             ;查詢有沒有外部中斷標志
27         JMP        INT_RET          ;如果沒有外部中斷標志退出中斷程序
28         MOV        A,ISR            ;(先讀出中斷標志,然后將bit2置零)
29         AND        A,@0XFB
30         MOV        ISR,A            ;清除外部中斷標志
31         JBS        PORT5,0          ;P50取反(如果P50 =1(燈滅)就置零(亮燈))
32         JMP        $+3              ;(如果P50 = 0(燈亮) 就置一(燈滅))
33         BC         PORT5,0
34         JMP        INT_RET
35         BS         PORT5,0
36 INT_RET:        
37         MOV        A,R4_buffer       ;返回 R4    (還原程序現場)
38         MOV        R4,A
39         SWAPA      R3_buffer         ;返回 R3
40         MOV        R3,A
41         SWAP       A_buffer          ;返回 A
42         SWAPA      A_buffer        
43         RETI 
44 
45         ORG        0X50                
46 INITIAL:
47         MOV        A,@0             
48         CLR        PORT5            ;PORT5初始狀態為低電位
49         IOW        IOC5             ;PORT5設為輸出,控制LED   
50         MOV        A,@0XFF
51         IOW        IOCD
52         MOV        A,@01000000B
53         IOW        IOCE               ;P60作為/INT中斷輸入引腳
54         CLR        ISR                ;清除中斷標志位
55         MOV        A,@00000100B
56         IOW        IMR                ;使能外部中斷   
57         BS         PORT5,0            ;點亮LED
58         ENI                           ;使能總中斷
59 MAIN:
60         NOP
61         NOP
62         JMP        MAIN
63         

頭文件EM78P153S.INC:(寄存器地址定義)

  1 ;******************************************************;
  2 ;  Title:       EM78P153S include file                 ;
  3 ;  Description: The Definition of EM78P153S Registers  ;
  4 ;  Company:     ELAN MICROELECTRONICS (SZ) LTD.        ;
  5 ;  Date:    2008/04/16                   ;                   ;
  6 ;******************************************************;
  7 ;
  8 ;======================================================;
  9 ; Operational Registers Define   R PAGE                ;
 10 ; Registers R0~R2F                                     ;
 11 ;======================================================;
 12 ;
 13 ; R0/IAR: Indirect Address Register
 14 ;
 15 R0        == 0X00:rpage 0
 16 IAR       == 0X00:rpage 0
 17 ; 
 18 ;R1/TCC: Time Clock/Counter
 19 ;
 20 R1        == 0X01:rpage 0         
 21 TCC       == 0X01:rpage 0 
 22 ;
 23 ; R2/PC: Program Counter & Stack
 24 ;
 25 R2        == 0x02:rpage 0
 26 PC        == 0x02:rpage 0
 27 ;
 28 ;R3/STATUS:Status Register
 29 ;
 30 R3       == 0X03:rpage 0
 31 STATUS   == 0X03:rpage 0
 32         ;{
 33            RST      == STATUS.7          ; Bit for reset type
 34                                           ; Set to 1 if wake-up from sleep mode on pin change
 35                                             ; Set to 0 if wake-up from other reset types
 36            GP1      == STATUS.6         ; General purpose read/write bits
 37            GP0      == STATUS.5
 38            T        == STATUS.4          ;Time out bit
 39            P        == STATUS.3          ;Power down bit
 40            Z        == STATUS.2          ;Zero flag
 41            DC       == STATUS.1          ;Auxiliary carry flag
 42            C        == STATUS.0          ;Carry flag
 43          ;}
 44 ;
 45 ;R4/RSR:RAM Select Register
 46 ;
 47 R4       == 0X04:rpage 0
 48 RSR      == 0X04:rpage 0
 49     ; Bits 5~0 are used to select registers(address: 00~06,0F~2F)in the indirect addressing mode
 50         ; Bits 7~6 are general-purpose read/write bits
 51 ;
 52 ;R5/PORT5:I/O Register
 53 ;
 54 R5       == 0X05:rpage 0
 55 PORT5    == 0X05:rpage 0
 56 ;
 57 ;R6/PORT6:I/O Register
 58 ;
 59 R6       == 0X06:rpage 0
 60 PORT6    == 0X06:rpage 0
 61 ;
 62 ;R7~RE:Reserved
 63 ;
 64 ;RF/ISR:Interrupt status register
 65 ;
 66 ISR    ==     0X0F:rpage 0
 67       ;{
 68                            ;Bits 7 ~ 3 Not used.
 69                            ;"1" means interrupt request
 70                            ;"0" means no interrupt occurs.
 71            EXIF   == ISR.2           ;External interrupt flag
 72            ICIF   == ISR.1           ;Port6 input status change interrupt flag
 73            TCIF   == ISR.0           ;TCC overflow interrupt flag
 74       ;}
 75 ;
 76 ;======================================================;
 77 ; Operational Registers Define   IOPAGE                ;
 78 ; Registers R0~RF                                      ;
 79 ;======================================================;
 80 ;
 81 ; A: Accumulator
 82 ; It can't be addressed.
 83 ;
 84 ; CONT: Control Register
 85 ;
 86      ;{
 87                        ; BIT7 not used
 88          INTE    == 6    ; Interrupt enable flag
 89                            ; "0" : Masked by DISI or hardware interrupt
 90                            ; "1" : Enabled by ENI/RETI instructions
 91          TS      == 5    ; TCC signal source
 92                            ; "0" : Internal instruction cycle clock,P62 is a bi-directional I/O pin
 93                            ; "1" : Transition on TCC pin
 94          TE      == 4    ; TCC signal edge
 95                            ; "0" : Increment if the transition from low to high takes place on TCC pin
 96                            ; "1" : Increment if the transition from high to low takes place on TCC pin
 97          PAB     == 3    ;escaler assignment bit
 98                            ; "1" : TCC
 99                            ; "0" : WDT
100          PSR2    == 2    ;
101          PSR1    == 1    ;
102          PSR0    == 0    ; (PSR0~PSR2): TCC/WDT prescaler Select bits
103                                 ; |------|------|------|----------|----------|
104                                 ; | PSR2 | PSR1 | PSR0 | TCC Rate | WDT Rate |
105                                 ; |------|------|------|----------|----------|
106                                 ; |   0  |   0  |   0  |   1:2    |   1:1    |
107                                 ; |   0  |   0  |   1  |   1:4    |   1:2    |
108                                 ; |   0  |   1  |   0  |   1:8    |   1:4    |
109                                 ; |   0  |   1  |   1  |   1:16   |   1:8    |
110                                 ; |   1  |   0  |   0  |   1:32   |   1:16   |
111                                 ; |   1  |   0  |   1  |   1:64   |   1:32   |
112                                 ; |   1  |   1  |   0  |   1:128  |   1:64   |
113                                 ; |   1  |   1  |   1  |   1:256  |   1:128  |
114                                 ; | -----|------|------|----------|----------|
115      ;}
116 ;
117 ; PORT 5 I/O Port Control Register
118 ;
119  IOC5    ==    0x05:iopage 0    ; 
120  P5CR    ==    0x05:iopage 0    ;
121 ;
122 ; PORT 6 I/O Port Control Register
123 ;
124  IOC6    ==    0x06:iopage 0    ; 
125  P6CR    ==    0x06:iopage 0    ; 
126 ;
127 ; IOCB/PDCR: Port 5 and P6 Pull-down Control Register
128 ;
129  IOCB    ==    0x0B:iopage 0    ; 
130  PDCR    ==    0x0B:iopage 0    ; 
131 ;
132      ;{                       ; "0": Enable internal pull-down
133                               ; "1": Disable internal pull-dowm 
134                               ; Bit 7 not used 
135          PD6B    == 6    ; Control bit is used to enable the pull-down of P62 pin
136          PD5B    == 5    ; Control bit is used to enable the pull-down of P61 pin
137          PD4B    == 4    ; Control bit is used to enable the pull-down of P60 pin
138                          ; Bit 3 not used 
139          PD2B    == 2    ; Control bit is used to enable the pull-down of P52 pin
140          PD1B    == 1    ; Control bit is used to enable the pull-down of P51 pin
141          PD0B    == 0    ; Control bit is used to enable the pull-down of P50 pin
142      ;}
143 ;
144 ; IOCC/ODCR:  Open-drain Control Register
145 ;
146  IOCC    ==    0x0C:iopage 0
147  ODCR    ==    0x0C:iopage 0
148 ;
149      ;{                       ; "0": Disable internal open-drain
150                               ; "1": Enable internal open-drain  
151                               ;
152         OD7    ==  7    ; Control bit is used to enable the open-drain of P67 pin                   
153         OD6    ==  6    ; Control bit is used to enable the open-drain of P66 pin
154         OD5    ==  5    ; Control bit is used to enable the open-drain of P65 pin
155         OD4    ==  4    ; Control bit is used to enable the open-drain of P64 pin
156                         ; Bit 3 not used  
157         OD2    ==  2    ; Control bit is used to enable the open-drain of P62 pin
158         OD1    ==  1    ; Control bit is used to enable the open-drain of P61 pin
159         OD0    ==  0    ; Control bit is used to enable the open-drain of P60 pin
160      ;}
161 ;
162 ;IOCD/PHCR:Pull-high Control Register
163 ;
164 ;
165  IOCD    ==    0x0D:iopage 0
166  PHCR     ==    0X0D:iopage 0
167      ;{                       ; "0": Enable internal  pull-HIGH
168                               ; "1": Disable internal pull-HIGH 
169          PH7B     == 7    ; Control bit is used to enable the pull-HIGH of P67 pin
170          PH6B    == 6    ; Control bit is used to enable the pull-HIGH of P66 pin
171          PH5B    == 5    ; Control bit is used to enable the pull-HIGH of P65 pin
172          PH4B    == 4    ; Control bit is used to enable the pull-HIGH of P64 pin
173                          ; Bit 3 not used                         
174          PH2B    == 2    ; Control bit is used to enable the pull-HIGH of P62 pin
175          PH1B    == 1    ; Control bit is used to enable the pull-HIGH of P61 pin
176          PH0B    == 0    ; Control bit is used to enable the pull-HIGH of P60 pin
177      ;}
178 ;
179 ; IOCE/WDTCR: WDT Control Register
180 ;
181  IOCE     ==    0x0E:iopage 0
182  WDTCR    ==    0x0E:iopage 0
183 ;
184      ;{
185          WDTE   ==  7    ; Control bit is used to enable Watchdog timer
186                          ; "0" : Disable WDT
187                          ; "1" : Enable WDT
188          EIS    ==  6    ; Control bit is used to difine the function of P60(/INT)pin
189                                ; "0" : P60,biderectional I/O pin
190                                ; "1" : /INT,external interrupt pin  
191                                ;
192                                ; Bits 5~0 not used                              
193         ;}
194 ;
195 ; IOCF/IMR: Interrupt Mask Register
196 ;
197  IOCF    ==    0x0F:iopage 0
198  IMR     ==    0x0F:iopage 0
199 ;
200      ;{
201                                ; Bits 7~3 not used 
202                                ;        
203          EXIE    ==  2     ; External interrupt enable bit (P60)
204                            ; "0" : Disable
205                            ; "1" : Enable
206          ICIE    ==  1     ; Port6 input status change interrupt enable bit
207                            ; "0" : Disable
208                            ; "1" : Enable
209          TCIE    ==  0     ; TCC overflow interrupt enable bit
210                                ; "0" : Disable
211                                ; "1" : Enable
212      ;}
213 ;
214 ;********************************************************;
215 ;CLEAR EM78P153S GENERAL REGISTER MACRO PROGRAM           ;
216 ;                                                        ;
217 ;********************************************************;
218 ;
219  M153SCLRRAMBANK  MACRO 
220 ;
221 ;        
222         MOV     A,@0X10
223         MOV     RSR,A
224 $_ClrLoop:
225         CLR     R0
226         INC     RSR
227         JBC     RSR,5
228         JBS     RSR,4
229         JMP     $_ClrLoop
230         ENDM                                                                             

 

 

 

 

所有寄存器地址及初值

(IOC5、IOC6需要使用IOR,IOW進行讀寫)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM