作者:未知 来源: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 ;程序结束