📄 接收.asm
字号:
;* 主程序和中断程序入口 *
CS1 BIT P2.3
CS2 BIT P2.4
D_I BIT P3.6 ;4
R_W BIT P2.5 ;5
E BIT P2.6 ;6
DB0_DB7 EQU P0
X EQU 22H ;页地址
Y EQU 23H ;列地址
COM EQU 24H
DAT EQU 24H
COUNT EQU 25H ;代码倒计数单元
CODE0 EQU 26H ;表格起始地址,赋0值后与DPTR合成查表指针地址
MUL_ EQU 26H ;显示数字时,暂存单元(要显示的数是几就在里面存几)
ORG 0000H ;程序开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口
LJMP INTEX0 ;跳至INTEX0执行中断服务程序
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
;* 初始化程序 *
CLEARMEMIO:
ACALL INT
SETB CS1
SETB CS2
ACALL CLEAR
ACALL DELAY1
LCALL SY ;显示开机状态
ACALL DELAY1
SETB CS1
SETB CS2
ACALL CLEAR
MOV P2,#00H
CLR A ;
DEC A ;A为#0FFH
MOV P0,A ;P1-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
CLEARMEM: MOV IE,#00H ;关所有中断
SETB EX0 ;开外中断
SETB EA ;总中断允许
RET ;子程序返回
;* 主程序 *
START: LCALL CLEARMEMIO ;上电初始化
;
MAIN: JB P3.0,MAIN ;50HZ交流电未过零转MAIN
LCALL DLX ;过零点时调用延时子程序(延时可变)
CLR P2.7 ;发调光脉冲
LCALL DELAY ;持续512微秒
SETB P2.7 ;关调光脉冲
LJMP MAIN ;转MAIN循环
NOP ;PC值出错处理
NOP
LJMP START ;出错时重新初始化
; 遥控接收程序
;采用中断接收
INTEX0: CLR EX0 ;关外中断
JNB P3.1,READ1 ;P3.1口为低电平转READ1
READOUTT0: SETB EX0 ;P3.1口为高电平开中断(系干扰)
RETI ;退出中断
;
READ1: CLR A ;清A
MOV DPH,A ;清DPTR
MOV DPL,A ;
HARD1: JB P3.1,HARD11 ;P3.1变高电平转HARD11
INC DPTR ;用DPTR对低电平计数
NOP ;1微秒延时
NOP
AJMP HARD1 ;转HARD1循环(循环周期为8微秒)
HARD11: MOV A,DPH ;DPTR高8位放入A
JZ READOUTT0 ;为0(脉宽小于8*255=2毫秒)退出
CLR A ;不为0,说明是第一个宽脉冲(3毫秒)
READ11: INC A ;脉冲个数计1
READ12: JNB P3.1,READ12 ;低电平时等待
MOV R1,#06H ;高电平宽度判断定时值
READ13: JNB P3.1,READ11 ;变低电平时转READ11脉冲计数
LCALL DELAY ;延时(512微秒)
DJNZ R1,READ13 ;6次延时不到转READ13再延时
DEC A ;超过3毫秒判为结束,减1
DEC A ;减1
JZ FUN0 ;为0执行FUN0(2个脉冲)
DEC A ;减1
JZ FUN1 ;为0执行FUN1(3个脉冲)
DEC A ;
JZ FUN2 ;为0执行FUN2(4个脉冲)
DEC A ;
JZ FUN3 ;为0执行FUN3(5个脉冲)
DEC A ;
JZ FUN4 ;为0执行FUN4(6个脉冲)
DEC A ;
JZ FUN5 ;为0执行FUN5(7个脉冲)
DEC A ;
JZ FUN6 ;为0执行FUN6(8个脉冲)
DEC A ;
JZ FUN7 ;为0执行FUN7(9个脉冲)
DEC A ;
JZ FUN8 ;为0执行FUN8(10个脉冲)
DEC A ;
JZ FUN9 ;为0执行FUN9(11个脉冲)
DEC A ;
JZ FUN10 ;为0执行FUN10(12个脉冲)
DEC A ;
JZ FUN11 ;为0执行FUN11(13个脉冲)
DEC A ;
JZ FUN12 ;为0执行FUN12(14个脉冲)
DEC A ;
JZ FUN13 ;为0执行FUN13(15个脉冲)
DEC A ;
JZ FUN14 ;为0执行FUN14(16个脉冲)
DEC A ;
JZ FUN15 ;为0执行FUN15(17个脉冲)
NOP ;
NOP ;
LJMP READOUTT0 ;出错退出
;
FUN0: MOV MUL_,#00H ;P0口各端口开关输出控制
ACALL DSPP
LJMP READOUTT0 ;转中断退出
FUN1: MOV MUL_,#01H
ACALL DSPP
LJMP READOUTT0 ;
FUN2: MOV MUL_,#02H
ACALL DSPP
LJMP READOUTT0 ;
FUN3: MOV MUL_,#03H
ACALL DSPP
LJMP READOUTT0 ;
FUN4: MOV MUL_,#04H
ACALL DSPP
LJMP READOUTT0 ;
FUN5: MOV MUL_,#05H
ACALL DSPP
LJMP READOUTT0 ;
FUN6: MOV MUL_,#06H
ACALL DSPP
LJMP READOUTT0 ;
FUN7: MOV MUL_,#07H
ACALL DSPP
LJMP READOUTT0 ;
FUN8: MOV MUL_,#08H
ACALL DSPP
LJMP READOUTT0 ;
FUN9: MOV MUL_,#09H
ACALL DSPP
LJMP READOUTT0 ;
FUN10: MOV MUL_,#0AH
ACALL DSPP
LJMP READOUTT0 ;
FUN11: MOV MUL_,#0BH
ACALL DSPP
LJMP READOUTT0 ;
FUN12: MOV MUL_,#0CH
ACALL DSPP
LJMP READOUTT0 ;
FUN13: MOV MUL_,#0DH
ACALL DSPP
LJMP READOUTT0 ;
FUN14: MOV MUL_,#0EH
ACALL DSPP
LJMP READOUTT0 ;
FUN15: MOV MUL_,#0FH
ACALL DSPP
LJMP READOUTT0 ;转中断退出
DSPP: SETB CS2
CLR CS1
MOV X,#0BAH
MOV Y,#40H
MOV DPTR,#DDB
ACALL TU
ACALL DISP_
RET
;***********************设置CODE0查表指针初值*********************
TU: MOV B,#10H ;要显示的数是几就用几乘以16,得到基址起始地址
MOV A,MUL_
MUL AB
MOV CODE0,A
RET
;************************8位字宽显示子程序: (CODE0待设)**********************
DISP_: MOV 39H,#02H
MOV COUNT,#08H
LP_: MOV COM,X ;设置页地址
LCALL INST
MOV COM,Y ;设置列地址
LCALL INST
W_: MOV A,CODE0
MOVC A,@A+DPTR
MOV DAT,A
LCALL DATA_
INC CODE0
DJNZ COUNT,W_
DJNZ 39H,LP1_
RET
LP1_: INC X
MOV COUNT,#08H
AJMP LP_
;***************************16位字宽显示子程序**********************
DISP: MOV 39H,#02H
MOV CODE0,#00H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -