⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deng3.elc

📁 一个义隆单片机EM78P156做的调光灯程序
💻 ELC
📖 第 1 页 / 共 2 页
字号:
                            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 + -