📄 hearter.dt
字号:
;*******************************************************************************
; FILENAME :NAIL.DT FOR EM78P153E
; AUTHOR : ELEN
; PURPOSE : CONTROL FOR MOTOR
;
; REVISION : 11/15/2006 V1.0
;*******************************************************************************
;* (c) Copyright 2005, ELEN TEC CO., LTD.
;*******************************************************************************
;*******************************************************************************
;SYSTEM REG DEFINE
;******************************************************************************* sk_07A
r0 equ 0x00 ;说明间接地址寄存器地址
r1 equ 0x01 ;说明定时寄存器地址
r2 equ 0x02 ;说明程序计数器地址
r3 equ 0x03 ;说明状态寄存器地址
r4 equ 0x04 ;说明数据存储器选择寄存器地址
r5 equ 0x05 ;说明P5寄存器地址
r6 equ 0x06 ;说明P6寄存器地址
rf equ 0x0f ;说明中断状态寄存器地址
ioc5 equ 0x05 ;用符号代表地址
ioc6 equ 0x06 ;用符号代表地址
iocb equ 0x0b ;用符号代表地址
iocc equ 0x0c ;用符号代表地址
iocd equ 0x0d ;用符号代表地址
ioce equ 0x0e ;用符号代表地址
iocf equ 0x0f ;用符号代表地址
;***********************************************************************************
;USER RAM
;***********************************************************************************
key_flag equ 0x2f
;bit0 is key release flag 开关键是否按住标志位
;bit1 is key ok flag 开关键是否松开标志位
;bit2 is key1 release flag 菜单键是否按住标志位
;bit3 is key1 ok flag 菜单键是否松开标志位
;bit4 is
;bit5 is
;bit6 is
;bit7 is
timer equ 0x2e ;
;bit0 is time 1s flag 定时一秒标志位
;bit1 is
;bit2 is
;bit3 is
;bit4 is
;bit5 is
;bit6 is
;bit7 is
mode_flag0 equ 0x2d ;
;bit0 is on/off mode flag 启动停止标志位
;bit1 is duty on/off flag 轮流使用标志位
;bit2 is
;bit3 is
;bit4 is
;bit5 is
;bit6 is
;bit7 is
del equ 0x2c ;延时寄存器
main_mode equ 0x2b ;档位控制寄存器
acc_buf equ 0x10 ;累加器内容保护寄存器
psw_buf equ 0x11 ;状态保护寄存器
key_cnt0 equ 0x12 ;开关键的抖动控制寄存器
key_cnt1 equ 0x13 ;菜单键的抖动控制寄存器
duty_cnt equ 0x1a ;时间控制寄存器
time_1s_cnt equ 0x1d ;一秒控制寄存器
;标志位就是用来联系两个事物的纽带
;*******************************************************************************
; code
;*******************************************************************************
org 0000h ;程序代码储存开始位置
jmp reset
org 0008h ;中断入口地址
jmp int_sever
org 0010h
;*******************************************************************************
; reset program
;*******************************************************************************
reset:
wdtc ;clr watch dog
clr iocf ;disable interrupt
mov a,@10h ;初始通用寄存器10H-2FH地址空间
mov r4,a
clr_ram:
wdtc
clr r0 ;clr ram
inc r4
mov a,r4
sub a,@0xef
jbs r3,2 ;check zero flag
jmp clr_ram
clr r0 ;
init_system:
mov a,@0x00 ;tc0 init 500us int
mov r1,a ;给定时器赋初值
mov a,@0x00
mov r5,a ;给P5口寄存器赋初值
mov a,@0xff
mov r6,a ;给P6口寄存器赋初值
mov a,@0x47 ;time 1:256 设置总中断标志和选择分频
contw ;control register
mov a,@00h
iow ioc5 ;p5 as output mode 设置P5口为0即为输出
mov a,@10000001B
iow ioc6 ;p6.7 p6.0 as input mode 设置P6.0 P6.7为1即为输入
mov a,@11111111B ;设置内部下拉禁止
iow iocb ;disable all pull down function
mov a,@00000000B ;设置漏极开路输出禁止
iow iocc ;disable open_drain function
mov a,@00000000B ;设置内部上拉使能
iow iocd ;enable pull up function
mov a,@00000000B ;设置看门狗禁止,设置P6.0为I/O状态
iow ioce ;disable watchdog
mov a,@00000001B ;设置定时器中断使能
iow iocf ;enable tc0 and int interrupt
clr rf ;中断屏蔽寄存器初始化
eni ;启动定时器工作
wdtc
mov a,@15 ;设置中断次数,实现一秒定时
mov time_1s_cnt,a ;
bs mode_flag0,0 ;开关键状态判断位 0:按下 1:未按
;************************************************************************************
; main program
;************************************************************************************
main:
call key_scan ;调用按键状态子程序
call key_control ;调用按键控制子程序
call heat_control ;调用档位控制子程序
jmp main
;*****************************************************************************************
;*****************************************************************************************
int_sever: ;中断服务子程序:定时服务
mov acc_buf,a ;65ms int
mov a,r3 ;save psw reg
mov psw_buf,a ;保护断点地址 压栈
jbs rf,0 ;check tc0 int flag
jmp exit_int
time_int:
bc rf,0 ;clr tc0 int flag 中断后清中断标志
djz time_1s_cnt ;判断15次是否结束即一秒是否完成
jmp exit_int
bs timer,0
mov a,@15
mov time_1s_cnt,a
exit_int: ;取出断点地址 出栈
mov a,psw_buf
mov r3,a
mov a,acc_buf
reti
;*********************************************************************************************
key_scan:
wdtc
jbc r6,0 ;check power key 检查开关键是否按下
jmp key_000 ;按下开关键则r6,0为低电平,即输出0
jbc key_flag,0 ;check key release flag 判断开关按住位是否按住
ret
call key_delay ;调用延时子程序
jz key_cnt0 ;判断是否抖动造成 用256次来判断 大约
jmp key_meo ;
bs key_flag,0 ;set key release flag 实际按下则将开关标志位置1
bs key_flag,1 ;set key ok flag 实际按下则将开关标志位置1
ret ;开关键判断后将开关键标志位置1
key_000:
bc key_flag,0 ;reset key release flag
bc key_flag,1 ;reset key1 ok flag
clr key_cnt0
key_meo:
jbc r6,7
jmp key_001
jbc key_flag,2 ;meo key release flag
ret
call key_delay
jz key_cnt1 ;确认按下溢出为0,跳转到下一条指令
ret
bs key_flag,2 ;meo key release flag 菜单键按下后给标志位置1
bs key_flag,3 ;meo key ok flag 菜单键按下后给标志位置1
ret
key_001:
bc key_flag,2 ;meo key release flag
bc key_flag,3 ;meo key1 ok flag
clr key_cnt1
ret
;*************************************************************************************
key_control:
wdtc
jbc key_flag,1 ;check key ok flag 开关键按下得OK位为1
jmp power_key_control
jbc key_flag,3 ;菜单键按下得OK位为1 (两个按键进行两次判断)
jmp meo_key_control ;每个按键置两个标志位,一个为排除抖动用,一个按下
ret
power_key_control:
bc key_flag,1 ;clr key ok flag 标志位完成任务后需清0
mov a,@0x01 ;偶次按下时标志位为1进行复位
xor mode_flag0,a ;on/off mode flag 得出标志位的状态作为下面的判断依据
;同则0,异1,在这标志位为0,因为前面已经设置操作
mov a,@0x00
mov main_mode,a ;作为开关键第一次按下后进入第0档的设置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -