EM78P153定时器的应用
具体电路如下:
本文引用地址:https://www.eepw.com.cn/article/201611/316076.htm源程序:
/*******************************************************
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 ICIE_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
评论