📄 红处线摇空.asm
字号:
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
KEYB EQU 20H.0 ;按键标致(为1时有键按下)
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 KEYB ;清按键标致位
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 ;调用初始化子程序
;
BEGIN: ACALL KEY ;调用键盘扫描
JB KEYB,BEGIN_ ;判断是否有键按下
JMP BEGIN
BEGIN_: CLR KEYB
KEY0: CJNE R4,#00H,KEY1
ACALL KEYFUN00
KEY1: CJNE R4,#01H,KEY2
ACALL KEYFUN01
KEY2: CJNE R4,#02H,KEY3
ACALL KEYFUN02
KEY3: CJNE R4,#03H,KEY4
ACALL KEYFUN03
KEY4: CJNE R4,#04H,KEY5
ACALL KEYFUN04
KEY5: CJNE R4,#05H,KEY6
ACALL KEYFUN05
KEY6: CJNE R4,#06H,KEY7
ACALL KEYFUN06
KEY7: CJNE R4,#07H,KEY8
ACALL KEYFUN07
KEY8: CJNE R4,#08H,KEY9
ACALL KEYFUN08
KEY9: CJNE R4,#09H,KEY10
ACALL KEYFUN09
KEY10: CJNE R4,#0AH,KEY11
ACALL KEYFUN10
KEY11: CJNE R4,#0BH,KEY12
ACALL KEYFUN11
KEY12: CJNE R4,#0CH,KEY13
ACALL KEYFUN12
KEY13: CJNE R4,#0DH,KEY14
ACALL KEYFUN13
KEY14: CJNE R4,#0EH,KEY15
ACALL KEYFUN14
KEY15: CJNE R4,#0FH,KEYN
ACALL KEYFUN15
KEYN: AJMP BEGIN
NOP ;PC值出错处理
NOP
NOP
LJMP START ;重新初始化
;********键盘扫描********调用键盘扫描以后会返回一个键值存于R4中,和一个标致位KEYB
KEY: MOV A,#0FH ;查询是否有键按下
MOV P1,A
MOV A,P1
CJNE A,#0FH,KEYY
CLR KEYB
AJMP NEXT
KEYY: ACALL DEL ;去抖动
MOV A,P1
CJNE A,#0FH,GO
MOV R4,#10H ;若有抖动,则返回无效键值
CLR KEYB
AJMP NEXT
GO: SETB KEYB ;置按键标致位
MOV R2,A ;R2中存放着行信息
X1: CJNE R2,#0EH,X2 ;若为第一行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A ;R3中存放着列信息
Y0: CJNE R3,#0E0H,Y1 ;若为第一列
MOV R4,#00H ;R4中存放要返回的键值
AJMP NEXT
Y1: CJNE R3,#0D0H,Y2 ;若为第二列,Yn表示16个键对应的操作
MOV R4,#01H
AJMP NEXT
Y2: CJNE R3,#0B0H,Y3 ;若为第三列
MOV R4,#02H
AJMP NEXT
Y3: CJNE R3,#70H,X2 ;若为第四列
MOV R4,#03H
AJMP NEXT
X2: CJNE R2,#0DH,X3 ;若为第二行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A
Y4: CJNE R3,#0E0H,Y5 ;若为第一列
MOV R4,#04H
AJMP NEXT
Y5: CJNE R3,#0D0H,Y6 ;若为第二列
MOV R4,#05H
AJMP NEXT
Y6: CJNE R3,#0B0H,Y7
MOV R4,#06H
AJMP NEXT
Y7: CJNE R3,#70H,X3
MOV R4,#07H
AJMP NEXT
X3: CJNE R2,#0BH,X4 ;若为第三行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A
Y8: CJNE R3,#0E0H,Y9
MOV R4,#08H
AJMP NEXT
Y9: CJNE R3,#0D0H,Y10
MOV R4,#09H
AJMP NEXT
Y10: CJNE R3,#0B0H,Y11
MOV R4,#0AH
AJMP NEXT
Y11: CJNE R3,#70H,X4
MOV R4,#0BH
AJMP NEXT
X4: CJNE R2,#07H,NEXT ;若为第四行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A
Y12: CJNE R3,#0E0H,Y13
MOV R4,#0CH
AJMP NEXT
Y13: CJNE R3,#0D0H,Y14
MOV R4,#0DH
AJMP NEXT
Y14: CJNE R3,#0B0H,Y15
MOV R4,#0EH
AJMP NEXT
Y15: CJNE R3,#70H,NEXT
MOV R4,#0FH
NEXT: RET
;
;*************************************
;* *
;* T1中断服务程序 *
;* *
;*************************************
INTT1: CPL P3.5 ;40kHZ红外线遥控信号产生
RETI ;中断返回
;列号对应数据表
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
;* 编 码 发 射 程 序 *
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微秒延时程序
DELAY: MOV R2,#0FFH
DELAY1: DJNZ R2,DELAY1
RET
;10毫秒延时程序
DL10MS: MOV R3,#14H
DL10MS1: LCALL DELAY
DJNZ R3,DL10MS1
RET
DEL: MOV R7,#07H
DEL1_: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DEL1_
RET
;500毫秒延时程序
DL500MS: MOV R7,#32H
DL500MS1: LCALL DL10MS
DJNZ R7,DL500MS1
RET
;
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -