51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
十五路遥控发送控制(汇编)
发布时间:2009/6/4  阅读次数:513  字体大小: 【】 【】【

作者:未知       来源:89s52.cn

;*************************************
;*               (SEND.ASM)                             *
;*             十五路遥控发送控制器               *             *
;************************************
;**********************************************************************
;*                                                                                                                                       *
;*                     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
;
KEYFUN14:             MOV         A,#10H         ;发16个脉冲
                               LJMP       REMOTE         ;转发送程序
                               RET
;
KEYFUN15:             MOV         A,#11H         ;发17个脉冲
                               LJMP       REMOTE         ;转发送程序
                               RET
KEYFUN16:             RET            ;备用功能
KEYFUN17:             RET            ;备用功能
KEYFUN18:             RET            ;备用功能
KEYFUN19:             RET            ;备用功能
KEYFUN20:             RET            ;备用功能
KEYFUN21:             RET            ;备用功能
KEYFUN22:             RET
KEYFUN23:             RET
KEYFUN24:             RET
KEYFUN25:             RET
KEYFUN26:             RET
KEYFUN27:             RET
KEYFUN28:             RET
KEYFUN29:             RET
KEYFUN30:             RET
KEYFUN31:             RET            ;备用功能
;
;
;*************************************
;*                                                                     *
;*                 编 码 发 射 程 序                 *
;*                                                                     *
;*************************************
;
REMOTE:                 MOV         R1,A       ;装入发射脉冲个数
                               LJMP       OUT3       ;转第一个码发射处理
OUT:                       MOV         R0,#55H           ;1MS宽低电平发射控制数据
OUT1:                     SETB       ET1           ;开T1中断
                               SETB       TR1            ;开启定时器T1
                               NOP                ;延时
                               NOP
                               NOP
                               NOP
                               NOP
                               DJNZ       R0,OUT1           ;时间不到转OUT1再循环
                               MOV         R0,#32H           ;1MS高电平间隙控制数据
OUT2:                     CLR         TR1                ;关定时器T1
                               CLR         ET1                ;关T1中断
                               CLR         P3.5          ;关脉冲输出
                               NOP                     ;空操作延时
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               NOP
                               DJNZ       R0,OUT2        ;时间不到转OUT2再循环
                               DJNZ       R1,OUT        ;脉冲未发完,转OUT再循环发射
                               LCALL     DL500MS        ;
                               RET              ;
OUT3:                     MOV         R0,#0FFH   ;装发谢3MS宽控制数据
                               LJMP       OUT1          ;转OUT1
;
;*************************************
;*                                                                     *
;*                   延时513 us                           *
;*                                                                     *
;*************************************
;
;513微秒延时程序
DELAY:                   MOV         R2,#0FFH
DELAY1:                 DJNZ       R2,DELAY1
        RET
;
;
;
;*************************************
;*                                                                     *
;*                         延时10ms                         *
;*                                                                     *
;*************************************
;
;10毫秒延时程序
DL10MS:                 MOV         R3,#14H
DL10MS1:               LCALL     DELAY
                               DJNZ       R3,DL10MS1
                   RET
;500毫秒延时程序
DL500MS:               MOV         R4,#32H
DL500MS1:             LCALL     DL10MS
                               DJNZ       R4,DL500MS1
                               RET
;
                   END               ;程序结束

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号