📄 2051yaokong.asm
字号:
;遥控系统软件程序
;
;*****************************
;主程序和中断程序入口
;*****************************
;
org 0000H ;复位地址
ljmp start
org 0003h ;外中断0中断入口地址
reti
org 000BH ;定时器T0中断入口地址
reti
org 0013h ;外中断1中断入口地址
ljmp int1serve
org 001Bh ;定时器T1中断入口地址 ;
ljmp T1SERVE
org 0023h ;串行中断入口地址
reti
org 002Bh ;定时器T2中断入口地址
reti
;
;*****************************
;初始化程序
;*****************************
clear: MOV P1,#0FFH ;P1,P3口置位
MOV P3,#0FFH
CLR P3.5 ;关遥控输出
MOV SP,#70H ;设堆栈
MOV IE,#00H ;关总中断
MOV IP,#04H ;设优先级
MOV TMOD,#20H ;设定时器2自动重装模式
MOV TH1,#0F3H ;定时13μs
MOV TL1,#0F3H
SETB EX1 ;开外中断1
SETB IT1
SETB EA ;开总中断
RET
;
;*****************************
;主程序
;*****************************
START: LCALL CLEAR ;调试初始化程序
MAIN: LCALL KEYWORDK ;调键盘程序
ORL PCON,#01H ;进入低功耗待机状态
LJMP MAIN
NOP
NOP ;设置软件陷阱
NOP
LJMP START
;
;*****************************
;外部中断1服务程序
;*****************************
INT1SERVE: CLR IE1
ANL PCON,#00H ;触发待机状态苏醒
RETI
;
;*****************************
;定时/计数1溢出中断服务程序
;*****************************
T1SERVE: CPL P3.5 ;高频调制
RETI
NOP ;设置软件陷阱
NOP
NOP
LJMP START
;
;*****************************
;键盘程序
;*****************************
KEYWORDK: MOV P1,#0FFH ;置列线
CLR P3.7 ;清行线
MOV A,P1
MOV B,A
CJNE A,#0FFH,KEY1 ;有键按下则不转移
KEYWORDKOUT: NOP
NOP
RET ;键盘程序返回
KEY1: LCALL DELAY5MS ;延时消抖
MOV A,P1
CJNE A,B,KEYWORDKOUT ;确认键按下
MOV DPTR,#KEYWORDKTAB1
MOV B,A ;查列号
CLR A
MOV R0,A
KEY2: MOV A,R0
SUBB A,#80H
JNC KEYWORDKOUT
MOV A,R0
MOVC A,@A+DPTR
INC R0
CJNE A,B,KEY2
DEC R0
MOV A,R0 ;键号放入A
MOV B,A ;键号乘3处理LJMP散转指令
ADD A,B
ADD A,B
MOV DPTR,#KEYWORDKTAB2
JMP @A+DPTR
KEYWORDKTAB2: LJMP FUNCATION0
LJMP FUNCATION1
LJMP FUNCATION2
LJMP FUNCATION3
LJMP FUNCATION4
LJMP FUNCATION5
RET
KEYWORDKTAB1: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7EH
RET
;
;*************************
;发脉冲程序
;*************************
FUNCATION0: MOV A,#02H ;脉冲个数装载
LJMP SEND ;转发射程序
RET
FUNCATION1: MOV A,#03H
LJMP SEND
RET
FUNCATION2: MOV A,#04H
LJMP SEND
RET
FUNCATION3: MOV A,#05H
LJMP SEND
RET
FUNCATION4: MOV A,#06H
LJMP SEND
RET
FUNCATION5: MOV A,#07H
LJMP SEND
RET
NOP
NOP
NOP
LJMP START
;
;************************
;编码发射程序
;************************
SEND: MOV R1,A ;装入发射脉冲个数
SEND0: MOV R0,#0ffH ;第一个码250×0.012ms=3ms
AJMP SEND2
SEND1: MOV R0,#50H ;中间码83×0.012ms=1ms
SEND2: SETB ET1 ;开高频定时中断调制
SETB TR1
;setb p3.5
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,SEND2
MOV R0,#64H ;码距100×0.010ms=1ms
SENDOUT: CLR TR1 ;关高频定时调制
CLR ET1
CLR P3.5
NOP
NOP
NOP
NOP
NOP
DJNZ R0,SENDOUT
DJNZ R1,SEND1 ;脉冲数还有则再循环再发
CLR P3.0 ;开工作指示灯
LCALL DELAY500MS ;帧距
SETB P3.0 ;关工作指示灯
RET
NOP ;设置软件陷阱
NOP
NOP
LJMP START
;
;************************
;延时5ms程序
;************************
DELAY5MS: MOV R7,#45
DELAY5MS1: MOV R6,#554
DELAY5MS2: DJNZ R6,DELAY5MS2
DJNZ R7,DELAY5MS1
RET
NOP ;设置软件陷阱
NOP
NOP
LJMP START
;
;************************
;延时10ms程序
;************************
DELAY10MS: MOV R4,#90
DELAY10MS1: MOV R3,#54
DELAY10MS2: DJNZ R3,DELAY10MS2
DJNZ R4,DELAY10MS1
NOP
NOP
NOP
NOP
NOP
RET
NOP ;设置软件陷阱
NOP
NOP
LJMP START
;
;************************
;延时500ms程序
;************************
DELAY500MS: MOV R5,#50
DELAY500MS1: LCALL DELAY10MS
DJNZ R5,DELAY500MS1
RET
NOP ;设置软件陷阱
NOP
NOP
LJMP START
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -