义隆单片机学习笔记之(三) 应用例程

常用寄存器:



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进行读写)

义隆单片机学习笔记之(三) 应用例程,布布扣,bubuko.com

时间: 2024-10-06 22:46:49

义隆单片机学习笔记之(三) 应用例程的相关文章

义隆单片机学习笔记之(四) 编程及烧录

工具说明: 1.UIDE,编程环境 2.UWriter:烧录软件 下载地址: (见官网) 一 UIDE  1.1 创建工程: 1.2 选择型号: 1.3 编程及编译 二 UWriter 2.1 安装 (Serial number在购买烧录器的时候,从代理经销商处获得!) 2.2 选择目标芯片  2.3 配置选择 (注:由于是OTP,很多功能都是在配置的时候指定,所以这里非常重要.晶振.时钟的选择,延时程序要与之对应: 是否需要保护等,根据自己的需要而定) 编译之后生成的.map文件,详细的描述了

义隆单片机学习笔记之(二) 指令系统

指令系统 EM78156 & EM78P156 单片机共有的 58 条指令,其宽度为 13 位.(操作码+操作数) 指令周期 :取指令.分析指令.取操作数.执行 EM78 系列八位微控制器除一个指令需两个周期之外,其他的指令只需一个指令周期,除了对 PC (Program Counter)做 "写"的指令,需二个指令周期,如 (MOV PC, A). EMC 汇编语言指令集 符号解说: 1.符号'R':代表寄存器中的一个. 2.符号'B':代表寄存器的某一位. 3.符号'K':

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

[51单片机学习笔记TWO]----蜂鸣器

蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来驱动振动膜发声的.因此需要一定的电流才能驱动它,而单片机I/O引脚输出的电压较小.单片机输出的TTLK电平基本驱动不了蜂鸣器,因需要增加一个放大电路.这里用三极管作为放大电路.下面是原理图: 我这里的J8端是跟芯片的P1^5端口相连,当P1^5输出高电平时,三极管截止,蜂鸣器不发声,反之,输出低电平

《CSS网站布局实录》学习笔记(三)

第三章 CSS网页布局与定位 3.1 div 几乎XHTML中的任何标签都可以用于浮动与定位,而div首当其冲.对于其他标签而言,往往有它自身存在的目的,而div元素存在的目的就是为了浮动与定位. 3.1.1 div是什么 div是XHTML中制定的.专门用于布局设计的容器对象.在传统表格式布局中,之所以能够进行页面的排版布局设计,完全依赖于表格对象table.如今,接触另一种布局方式--CSS布局.div正是这种布局方式的核心对象.仅从div的使用上说,做一个简单的布局只需要依赖两样东西:di

《iOS应用逆向工程》学习笔记(三)iOS文件权限

一个组可以包含多个用户,一个用户可以属于多个组. iOS中的每个文件都有一个属主用户和属主组.每个文件都具有一系列的权限. 在iOS中用3bit表示文件的使用权,从高位到低位分别是r(read), w(write), x(execute)权限. 文件和用户的关系存在三种可能性:(1)此用户是属主用户:(2)此用户不是属主用户,但在属主组里:(3)此用户既不是属主用户,也不在属主组里. 例如: 111101101代表rwxr-xr-x,其8进制为755,它表示该文件的属主用户拥有r, w, x权限

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

内部类学习笔记(三)匿名内部类

这篇不转载了,自己来写,因为匿名内部类是内部类系列里我认为最难理解的. A.继承式的匿名内部类. 引用转载代码: 结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象. 建立匿名内部类的关键点是重写父类的一个或多个方法.再强调一下,是重写父类的方法,而不是创建新的方法.因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的.简言之,参考多态. 这里可能大家看的比较迷糊,尤其是 Car car = new Car(){ pub

C++Primer第5版学习笔记(三)

C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并.   第四章是和表达式有关的知识,表达式是C++的基础设施,本章由三部分组成:         1.表达式概念基础,包括表达式的基本概念,左值和右值的概念,优先级结合律,求值顺序.  2.各种运算符,主要包括算数\关系\逻辑\赋值\递增递减\成员访问\条件\位运算\sizeof\逗号运算符 这10种运算符.  3.类型转换,包括隐式和显式两种转换的规则