📄 deng3.elc
字号:
is_key=1
jmp _is_key_jmp
case k2_J2
KEYCODE=J2
is_key=1
jmp _is_key_jmp
case k3_KPOWER
KEYCODE=KPOWER
is_key=1
jmp _is_key_jmp
case k4_J3
KEYCODE=J3
is_key=1
jmp _is_key_jmp
case k5_KDOWN
KEYCODE=KDOWN
is_key=1
jmp _is_key_jmp
case k6_J1
KEYCODE=J1
is_key=1
jmp _is_key_jmp
default
jmp _ir_key_jmp
ends
_ir_key_jmp:
endif
;-----------------------------
;****************************键处理***************************
jmp main
_is_key_jmp:
ir_key=0
;//按键处理(开水及无故障时,才有效)
SWITCH KEYCODE
;PWM下降键
CASE KDOWN
if POWER_S==1
if DD>1 ;开灯时才能调光
DD--
endif
endif
JMP UNSTRUCK
;PWM上升键
CASE KUP
if POWER_S==1
if DD<=3 ;开灯时才能调光
DD++
endif
endif
JMP UNSTRUCK
;J1
CASE J1
if J1_S==0
J1_S=1
else
J1_S=0
endif
JMP UNSTRUCK
;J2
CASE J2
if J2_S==0
J2_S=1
else
J2_S=0
endif
JMP UNSTRUCK
;J3
CASE J3
if J3_S==0
J3_S=1
else
J3_S=0
endif
JMP UNSTRUCK
;KPOWER
CASE KPOWER
if POWER_S==0
POWER_S=1
else
POWER_S=0
endif
JMP UNSTRUCK
DEFAULT
jmp errjmp
ENDS
UNSTRUCK:
;判断键是否抬起
DO
wdtc
WHILE IS_KEY==1
errjmp:
;*************************************
IS_KEY=0
;*************
JMP MAIN
;*******************中断处理程序************************;
TIMER:
_zstep00:
;SCANKEY() ;读键
;-----------------------------------------------------------
_zstep01:
;******************继电器控制输出*******************
if POWER_S==1
P5.1=0
else
P5.1=1
endif
if J1_S==1
P5.0=0
else
P5.0=1
endif
IF J2_S==1
P6.7=0
ELSE
P6.7=1
ENDIF
IF J3_S==1
P6.6=0
ELSE
P6.6=1
ENDIF
;***************************************************
;*******************//中断返回**********************
BACK:
if DD==4
if PWM>=245
jmp _fool
endif
endif
P6.5=0 ;关闭可控硅
_fool:
wdtc
SWAPA SPSW2 ;restore PSW
MOV PSW,A
SWAP SACC2 ;restore A
SWAPA SACC2
RETI
;---------------------------------------------------
;----------------------------------------------------------
;//寄存器初始化
INIT()
;bank0[0x10~0x3f]清零
PSR=0x10
DO
R0=0
WHILE ++PSR<0x3f
ret
;-----------------------------------------------------------
;//特殊寄存器初始化
INITRST()
!OPTION=7 ;TCC预分频为4
!IOCB=0XFF ;无下拉
!IOCC=0XFF ;禁止漏极开路
!IOCD=0X0e ;p6上拉
!IOCE=0XC0 ;使用WDT及P50(EIS=1表示为INT,且只能为输入)
;!IOCE=0X40 ;P50(EIS=1表示为INT,且只能为输入)
;!IOCE=0X00 ;P50(EIS=1表示为INT,且只能为输入)
;!IOCF=5 ;启动EX\TCC中断(中断使能位)
!IOCF=4 ;启动EX\TCC中断(中断使能位)
!C5=0x00 ;P5口结构定义
!C6=0X1F ;P6口结构定义
TCC=0 ;TCC置初值
RF=0
ret
;-----------延时92us处理--------------------------------
delay()
delaycnt=72
do
nop
while --delaycnt>0
ret
;---------------------------------------------------
;-------------红外接收--------------------------------------------------------------
read() ;----------------------该子程序的访问周期是92us----------------------------
b1_s=b0_s
b0_s=P6.4
if b1_s!=b0_s
if b0_s==0 ;判断下降沿
;----------------------------------------------------
if cnt1>3 ;判断是否接收到1个以上的高电平
;===============2
if cnt1<25 ;判断是否为<=2300us的合法信号脉冲(包括开始2200,1,0)
;=============1
if cnt1>=18 ;判断是否start信号2200
is_rec=1 ;置开始接收数据标志is_rec
cnt8=0
jmp _endrec
endif
;----------------------------------------------------
if is_rec==1 ;开始信号过后,is_rec=1,标志下面是接收数据的过程
if cnt8<32
cnt8++
if cnt1>=8 ;判断800-1000us,说明是信号1
temp4=1
jmp _e2jmp
;endif
else ;判断200-400us,说明是信号0
temp4=0
endif
_e2jmp: ;------送接收到的信号数据流1、0------
if temp4==1
cc=1
else
cc=0
endif
rrc rec33
rrc rec22
rrc rec11
rrc rec00
if cnt8==32
cnt8=0
is_rec=0
;-----红外遥控解码---------------------
if rec00==ADDR1
if rec11==ADDR0
COM rec33
if rec22==rec33
IRDATA=rec22
ir_key=1
endif
endif
endif
;--------------------------------------
endif
else
cnt8=0
is_rec=0
endif
endif
;----------------------------------------------------
_endrec:
endif
endif
cnt1=0
;----------------------------------------------------
endif
endif
if b0_s==1 ;在信号为高电平期间cnt1一直累加,直到下降沿就送累加结果
if cnt1<250 ;累加上限是23000us
cnt1++
else
cnt8=0
is_rec=0
endif
endif
;***************************************************
ret
;***************************************************
;**********************读键程序******************************
SCANKEY()
;*******程序跳转表1*********每隔10ms处理1次
if sstep==1
sstep=0
else
sstep=1
jmp _k2
endif
;-----判断行列-------------------------------------
;----------------------|p52=1,p53=0|p52=0,p53=1|---
;ktemp==(kp5 0,kp6 0)==(p63p62p61 0,p63p62p61 0)---
;--------------------------------------------------
_k1:
kp6=P6 & 0x0e ;读继电器键
SWAP kp6
P5.2=0
P5.3=1
jmp _pass_chk_key
_k2:
kp5=P6 & 0x0e
P5.2=1 ;变换扫描线
P5.3=0 ;准备读加减键
_k3:
ktemp=kp5 | kp6
_if ktemp==0x00
jmp _nokey
KEYBUF=ktemp ;250us*200=50ms
IF KEYBUF==OLDKEY
IF ++KEYCNT>=1
KEYCODE=OLDKEY
KEYCNT=0
OLDKEY=0
IS_KEY=1
ENDIF
ELSE
OLDKEY=KEYBUF
KEYCNT=0
ENDIF
jmp _pass_chk_key
_nokey:
OLDKEY=0
KEYCNT=0
IS_KEY=0
_pass_chk_key:
ret
;**************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -