义隆单片机的守时器的运用,以EM78P153为例,操练了下TCC内部守时的运用。选了个现成的电路做调试来做操练。
详细电路如下:
源程序:
/*******************************************************
em78p153 TCC内部守时器的学习
DAT=P61 CLK=P60 KON=P62 K_UP K_DOWN LED1=P51 LED2=P52
*******************************************************/
;*********************寄存器及变量界说****************************
R0 EQU 0X00 ;直接地址寄存器
TCC EQU 0X01 ;计时,计数器
CONT EQU 0X01 ;操控寄存器
PC EQU 0X02 ;程序计数器
STATUS EQU 3 ;状况寄存器
Z_FLAG EQU 2 ;零标志位
C_FLAG EQU 0 ;进位标志位
;***************************************************************
IOC5 EQU 0X05
PORT5 EQU 0x05
;**************************************************************
IOC6 EQU 0X06
PORT6 EQU 0x06
;**************************************************************
IOCB EQU 0X0B ;下拉操控寄存器
IOCC EQU 0X0C ;开漏操控寄存器
IOCD EQU 0X0D ;上拉操控寄存器
IOCE EQU 0X0E ;WDT操控寄存器
RF EQU 0X0F ;中止屏蔽寄存器
IOCF EQU 0X0F
NUM==0X20
LP_CNT0==0X21
LP_CNT1==0X22
DA
SEND_BIT_NUM==0X24
LEDH==0X26
LEDL==0X25
TCC_Count EQU 0X2F
;************************************************************
BACC EQU 0X2D ;ACC备份寄存器
BSTATUS EQU 0X2E ;STATUS备份寄存器
;**********************************************************
ORG 00H
JMP START
ORG 0008H
JMP INT_TCC ;进入中止
TABLE:
ADD PC,A
RETL 0X11;0
RETL 0XDB;1
RETL 0X23;2
RETL 0X43;3
RETL 0XC9;4
RETL 0X45;5
RETL 0X05;6
RETL 0XD3;7
RETL 0X01;8
RETL 0X41;9
RETL 0X11;9
START:
CALL INITAITE ;程序开端前的初始化
BS PORT5,1
BS PORT5,2
MOV A,@0X00 ;give the first da
MOV LEDH ,A
MOV LEDL ,A
;;;;;;;;;;;;;;;;;;;;;
ST:
BS PORT5,1
BC PORT5,2
MOV A,LEDH
CALL TABLE
MOV DA
CALL SEND
CALL DELAYMS
BS PORT5,2
BC PORT5,1
MOV A,LEDL
CALL TABLE
MOV DA
CALL SEND
CALL DELAYMS
BC STATUS,C_FLAG ;进位清零
;;;;;judge TB_NUMDa
MOV A,LEDL
SUB A,@0x09
JBS STATUS,C_FLAG
JMP RESET
JMP ST
;;;;;;;;;;;;;;;
RESET:
MOV A,@0X00 ;give the first da
MOV LEDL ,A
INC LEDH
JMP ST
;;***********************************************
;;***********74hc164 send*************************
SEND: MOV A,@8 ;on
MOV SEND_BIT_NUM,A
SEND_LOOP:
RLC DA
JBC STATUS,0 ;DA
BS PORT6,1
JBS STATUS,0 ;DA
BC PORT6,1
BC PORT6,0 ;do Clock
NOP
BS PORT6,0
DJZ SEND_BIT_NUM ;for 8 loops
JMP SEND_LOOP
RET
;;*******************************************
INITAITE:
MOV A,@0B00000100 ;预分频器分给TCC,分频比为 1:8
CONTW ;上升沿触发,内部时钟源,中止屏蔽。
;P54当I/O口用时,TS_bit5有必要为0
MOV A,@0B11111000 ;P5口界说为输出,输进口: 1为输入 ,0为输出
IOW IOC5
MOV A,@0B00111100 ;P6口界说为输出口: 0为输出 ,1为高阻状况
IOW IOC6
MOV A,@0B11111111 ;设置P60口,为下拉: 0为下拉使能 1为下拉制止
IOW IOCB ;bit0_P50 bit1_P51 bit2_P52
;bit4_P60 bit5_P61 bit6_P62
MOV A,@0B00000000 ;开漏操控寄存器: 1为使能 ,0为制止
IOW IOCC
MOV A,@0B00110001 ;上拉操控寄存器: 0为使能 ,1为制止
IOW IOCD ;bit0=P60 ,bit1=P61 ,bit2=P62 ,bit3
;bit4=P64 ,bit5=P65 ,bit6=P66 ,bit7=P67
MOV A,@0B00000000 ;WDT操控寄存器
IOW IOCE ;WDTE_bit7 看门狗使能操控: 0为制止,1为使能
;EIS_bit6 P60引脚功用界说: 0表明为P60为双向IO口
; 1表明外部中止输入引脚,此刻引脚有必要设置为输入状况
MOV A,@0B00000001 ;中止屏蔽寄存器: 0制止中止,1答应中止
IOW IOCF
; EXIE_bit2=0 %&&&&&%IE_bit1=0 TCIE_bit0=1
;开守时器中止
MOV A,@6
MOV TCC,A
BC RF,0 ;清零守时器中止溢出标志位
ENI ;开中止
;DISI
RET
;**********************TCC中止处理**************************************
INT_TCC: DISI ;先封闭中止
MOV BACC,A ;维护ACC和STATUS
SWAPA STATUS
MOV BSTATUS,A
JBS RF,0 ;判别是否为计数器中止,如果是得话进入
JMP INTQUIT ;计数器中止服务程序,不是则退出
MOV A,@6
MOV TCC,A
BC RF,0 ;清中止标志位
INC TCC_Count
JBS STATUS,Z_FLAG
JMP INTQUIT
MOV A,@200
MOV TCC_Count,A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,@001000000B
XOR PORT6,A ;蜂鸣器取反
INC LEDL ;LED加1
INTQUIT: SWAPA BSTATUS ;康复寄存器
MOV STATUS,A
SWAP BACC
SWAPA BACC
RETI
;;******************************************
DELAYMS:
MOV A, @200
MOV LP_CNT0, A
NOP
P0_DLY:
NOP
MOV A, @20
MOV LP_CNT1, A
P0_LP:
NOP
NOP
NOP
DJZ LP_CNT1
JMP P0_LP
DJZ LP_CNT0
JMP P0_DLY
RET
END