新闻  |   论坛  |   博客  |   在线研讨会
十五路遥控发送控制器
tvb2058 | 2007-09-10 14:07:59    阅读:1729   发布文章

;                 *************************************
;                 *        (SEND.ASM)               *
;                 *       十五路遥控发送控制器        *
;                 *              2001.7.18            *
;                 *************************************
;
;**********************************************************************
;*                                                                    *
;*           KEYX0  P1.0    1             40    VCC                   *
;*           KEYX1  P1.1    2             39    P0.0  KEYY0           *
;*           KEYX2  P1.2    3             38    P0.1  KEYY1           *
;*           KEYX3  P1.3    4             37    P0.2  KEYY2           *
;*                  P1.4    5             36    P0.3  KEYY3           *
;*                  P1.5    6             35    P0.4  KEYY4           *
;*                  P1.6    7             34    P0.5  KEYY5           *
;*                  P1.7    8             33    P0.6  KEYY6           *
;*                  RST     9             32    P0.7  KEYY7           *
;*                     P3.0    10   MCS-51   31    EA    VDD             *
;*                  P3.1    11            30    ALE                   *
;*                  P3.2    12            29    PSEN                  *
;*                  P3.3    13            28    P2.7                  *
;*                  P3.4    14            27    P2.6                  *
;*   REMOTEOUT T1   P3.5    15            26    P2.5                  *
;*                  P3.6    16            25    P2.4                  *
;*                  P3.7    17            24    P2.3                  *
;*                 XTAL2    18            23    P2.2                  *
;*                 XTAL1    19            22    P2.1                  *
;*                   VSS    20            21    P2.0                  *
;*                                                                    *
;*                                                                    *
;**********************************************************************
;
;
;
;伪定义
        KEYX0           EQU     P1.0    ;P1.0 -- P1.3位键盘行扫描
        KEYX1           EQU     P1.1    ;本系统采用4 * 8 键盘阵列
        KEYX2           EQU     P1.2
        KEYX3           EQU     P1.3
        KEYY            EQU     P0      ;P0 口键盘列扫描
;
;
;
;
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
                 ORG     0000H                       ;程序执行开始地址
                 AJMP    START                ;跳至START执行
                 ORG     0003H                       ;外中断0中断入口地址
          RETI                         ;中断返回(不开中断)
                 ORG     000BH               ;定时器T0中断入口地址
                 RETI                       ;中断返回(不开中断)
                ORG     0013H                           ;外中断1中断入口地址
          RETI                       ;中断返回(不开中断)
                 ORG     001BH               ;定时器T1中断入口地址
                 LJMP    INTT1              ;跳至INTT1中断服务程序
                 ORG     0023H               ;串行口中断入口地址
                 RETI                       ;中断返回(不开中断)
                 ORG     002BH               ;定时器T2中断入口地址
                 RETI                       ;中断返回(不开中断)
;
;*************************************
;*                                   *
;*       初 始 化 程 序              *
;*                                   *
;*************************************
CLEARMEMIO:     CLR        A                         ;A清0
                 DEC      A                         ;A为#0FFH
                 MOV     P0,A                        ;P0-P3口置1
                MOV     P1,A                   ;
                MOV     P2,A                   ;
                MOV     P3,A                   ;
                CLR     P3.5                   ;关遥控输出
CLEARMEM:       MOV     SP,#70H                ;设堆栈基址为70H
                MOV     IE,#00H                 ;关所有中断
                MOV     IP,#01H                        ;设优先级
                MOV     TMOD,#22H              ;8位自动重装初值模式
                MOV     TH1,#0F3H              ;定时为13微秒初值
                MOV     TL1,#0F3H              ;
                SETB    EA                    ;开总中断允许
                 RET                                ;返回
;
;
;
;
;*************************************
;*                                   *
;*              主  程  序                *
;*                                   *
;*************************************
START:          LCALL   CLEARMEMIO            ;调用初始化子程序
;
MAIN:           LCALL   KEYWORK                ;主体程序。调用查键子程序
                 LJMP     MAIN                               ;转MAIN循环
                 NOP                                                          ;PC值出错处理
                 NOP
                 NOP
                 LJMP     START                              ;重新初始化
;
;*************************************
;*                                   *
;*        T1中断服务程序             *
;*                                   *
;*************************************
INTT1:          CPL     P3.5                           ;40kHZ红外线遥控信号产生
                 RETI                                         ;中断返回
;
;
;*************************************
;*                                   *
;*       键盘工作子程序(4 * 8 阵列)       *
;*       出口为各键工作程序入口           *
;*************************************
KEYWORK:        MOV                 KEYY,#0FFH                         ;置列线输入状态
                 CLR              KEYX0                              ;行线(P1口)全置0
                 CLR              KEYX1
                 CLR              KEYX2
                 CLR              KEYX3
                 MOV              A,KEYY                   ;读入P0口值
                 MOV              B,A                 ;KEYY口值暂存B中
                 CJNE             A,#0FFH,KEYHIT  ;不等于#0FFH,转KEYHIT(有键按下)
KEYOUT:          RET                         ;没有键按下返回
;
KEYHIT:         LCALL   DL10MS              ;延时去抖动
                 MOV              A,KEYY              ;再读入P0口值至A
                 CJNE     A,B,KEYOUT                ;A不等于B(是干扰),子程序返回
                 SETB     KEYX1                     ;有键按下,找键号开始,查0行
                 SETB    KEYX2
                 SETB     KEYX3
                 MOV              A,KEYY              ;读入P0口值
                 CJNE     A,#0FFH,KEYVAL0     ;P0不等于#0FFH,按下键在第0行
                 SETB     KEYX0               ;不在第0行,开始查1行
                 CLR              KEYX1
                 MOV              A,KEYY              ;读入P0口值
                 CJNE     A,#0FFH,KEYVAL1     ;P0口不等于#0FFH,按下键在第1行
                 SETB     KEYX1               ;不在第1行,开始查2行
                 CLR              KEYX2
                 MOV              A,KEYY              ;读入P0口值
                 CJNE     A,#0FFH,KEYVAL2     ;P0口不等于#0FFH,按下键在第2行
                 SETB     KEYX2               ;不在第2行,开始查3行
                 CLR              KEYX3
                 MOV              A,KEYY              ;读入P0口值
                 CJNE     A,#0FFH,KEYVAL3     ;P0口不等于#0FFH,按下键在第3行
                 LJMP     KEYOUT              ;不在第3行,子程序返回
;
KEYVAL0: MOV              R2,#00H                            ;按下键在第0行,R2赋行号初值0
                LJMP    KEYVAL4                ;跳到KEYVAL4
;
KEYVAL1: MOV              R2,#08H                            ;按下键在第1行,R2赋行号初值8
                LJMP    KEYVAL4                         ;跳到KEYVAL4
;
KEYVAL2: MOV              R2,#10H                            ;按下键在第2行,R2赋行号初值16
                LJMP    KEYVAL4                ;跳到KEYVAL4
;
KEYVAL3:        MOV                 R2,#18H                            ;按下键在第3行,R2赋行号初值24
                 LJMP     KEYVAL4                    ;跳到KEYVAL4
;
KEYVAL4: MOV     DPTR,#KEYVALTAB   ; 键值翻译成连续数字
                MOV         B,A               ;P0口值暂存B内
                CLR     A                 ;清A
                MOV     R0,A              ;清R0
KEYVAL5:        MOV     A,R0              ;查列号开始,R0数据放入A
                SUBB    A,#08H            ;A中数减8
                JNC     KEYOUT            ;借位C为0,查表出错,返回
                MOV         A,R0              ;查表次数小于8,继续查,
                MOVC    A,@A+DPTR         ;查列号表
                INC     R0                ;R0加1
                CJNE                 A,B,KEYVAL5   ;查得值和P0口值不等,转KEYVAL5再查
                DEC     R0                ;查得值和P0口值相等,R0减1
                MOV     A,R0              ;放入A(R0中数值即为列号值)
                 ADD              A,R2                   ; 与行号初值相加成为键号值(0-31)
                 MOV              B,A               ;键号乘3处理用于JMP散转指令
                 RL               A                 ;键号乘3处理用于JMP散转指令
                 ADD              A,B               ;键号乘3处理用于JMP散转指令
                 MOV              DPTR,#KEYFUNTAB    ; 取散转功能程序(表)首址
                 JMP              @A+DPTR           ;散转至对应功能程序标号
KEYFUNTAB:       LJMP             KEYFUN00      ;跳到键号0对应功能程序标号
                 LJMP             KEYFUN01      ;跳到键号1对应功能程序标号
                 LJMP             KEYFUN02      ;跳到键号2对应功能程序标号
                 LJMP             KEYFUN03      ;跳到键号3对应功能程序标号
                 LJMP             KEYFUN04      ;跳到键号4对应功能程序标号
                 LJMP             KEYFUN05      ;跳到键号5对应功能程序标号
                 LJMP             KEYFUN06      ;跳到键号6对应功能程序标号
                 LJMP             KEYFUN07      ;跳到键号7对应功能程序标号
                 LJMP             KEYFUN08      ;跳到键号8对应功能程序标号
                 LJMP              KEYFUN09      ;跳到键号9对应功能程序标号
                 LJMP             KEYFUN10      ;跳到键号10对应功能程序标号
                 LJMP             KEYFUN11      ;跳到键号11对应功能程序标号
                 LJMP             KEYFUN12      ;跳到键号12对应功能程序标号
                 LJMP             KEYFUN13      ;跳到键号13对应功能程序标号
                 LJMP             KEYFUN14      ;跳到键号14对应功能程序标号
                 LJMP             KEYFUN15      ;跳到键号15对应功能程序标号
                 LJMP             KEYFUN16      ;跳到键号16对应功能程序标号
                 LJMP             KEYFUN17      ;跳到键号17对应功能程序标号
                 LJMP             KEYFUN18      ;跳到键号18对应功能程序标号
                 LJMP             KEYFUN19      ;跳到键号19对应功能程序标号
                 LJMP             KEYFUN20      ;跳到键号20对应功能程序标号
                 LJMP             KEYFUN21      ;跳到键号21对应功能程序标号
                 LJMP             KEYFUN22      ;跳到键号22对应功能程序标号
                 LJMP             KEYFUN23      ;跳到键号23对应功能程序标号
                 LJMP             KEYFUN24      ;跳到键号24对应功能程序标号
                 LJMP             KEYFUN25      ;跳到键号25对应功能程序标号
                 LJMP             KEYFUN26      ;跳到键号26对应功能程序标号
                 LJMP             KEYFUN27      ;跳到键号27对应功能程序标号
                 LJMP             KEYFUN28      ;跳到键号28对应功能程序标号
                 LJMP             KEYFUN29      ;跳到键号29对应功能程序标号
                 LJMP             KEYFUN30      ;跳到键号30对应功能程序标号
                 LJMP             KEYFUN31      ;跳到键号31对应功能程序标号
                 RET
;列号对应数据表
KEYVALTAB:       DB       0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
;对应列号:         0    1    2    3    4    5    6   7
                 RET
;
KEYFUN00:       MOV     A,#02H     ;发2个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN01:       MOV     A,#03H     ;发3个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN02:       MOV     A,#04H     ;发4个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN03:       MOV     A,#05H     ;发5个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN04:       MOV     A,#06H     ;发6个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN05:       MOV     A,#07H     ;发7个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN06:       MOV     A,#08H     ;发8个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN07:       MOV     A,#09H     ;发9个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
;
KEYFUN08:       MOV     A,#0AH     ;发10个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN09:       MOV     A,#0BH     ;发11个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN10:       MOV     A,#0CH     ;发12个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN11:       MOV     A,#0DH     ;发13个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN12:       MOV     A,#0EH     ;发14个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
KEYFUN13:       MOV     A,#0FH     ;发15个脉冲
                LJMP    REMOTE     ;转发送程序
                RET
;
 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客