📄 rx.asm
字号:
;***************************************
;* 接收控制系统软件程序(RX.ASM)
;***************************************
;
;*************************************************
LAMPBLAK EQU P1.4 ;背光灯控制,=0时开,=1时关.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行数据输入口
SCLK EQU P1.7 ;液晶串行操作时钟口
;***************************************
; 主程序和中断程序入口
; ***************************************
ORG 0000H ; 复位地址
LJMP START
ORG 0003H ; 外中断0中断入口地址
RETI
ORG 000BH ; 定时器T0中断入口地址
RETI
ORG 0013H ; 外中断1中断入口地址
RETI
ORG 001BH ; 定时器T1中断入口地址
RETI
ORG 0023H ; 串行口中断入口地址
RETI
ORG 002BH ; 定时器T2中断入口地址
RETI
;
;***************************************
; 主程序
; ***************************************
START: MOV SP,#60H ;设堆栈
CLR CS ;液晶操
LCALL SETUP ;LCD初始化
LCALL LOGON ;开机显示画面
NOP
MAIN: JNB P3.7,RX ;
AJMP MAIN
NOP
NOP
LJMP START ;设置软件陷阱
;
;***************************************
; 红外线遥控信号接收程序
; ***************************************
RX: JNB P3.7,INT0SERVE1;确认中断
RXOUT : LJMP MAIN
INT0SERVE1: CLR A
MOV DPH,A ;清DPTR
MOV DPL,A
INT0SERVE2: JB P3.7,INT0SERVE3;用DPTR对第一个低电平计时 2
INC DPTR ; 2
NOP ; 1
NOP ; 1
AJMP INT0SERVE2 ;循环周期是8US 2
INT0SERVE3: MOV A,DPH ;DPTR的高8位放入A中
JZ RXOUT ;不为0,说明DPL有进位则8*255=2MS,即是第一个脉冲。为0,说明小于2MS是一干扰。
CLR A
INT0SERVE4: INC A ;脉冲个数加1
INT0SERVE5: JNB P3.7,INT0SERVE5;等待低电平
MOV R1,#06H ;帧间高电平宽度判断定时值,即一帧结束的判断
INT0SERVE6: JNB P3.7,INT0SERVE4;低电平时转脉冲个数加1
LCALL DELAY513US ;延时513US
DJNZ R1,INT0SERVE6
DEC A ;超过3MS判定为一帧结束
DEC A
JZ FUNCTION0 ;为0则转功能0
DEC A
JZ FUNCTION1 ;为0则转功能1
DEC A
JZ FUNCTION2 ;为0则转功能2
DEC A
JZ FUNCTION3 ;为0则转功能3
DEC A
JZ FUNCTION4 ;为0则转功能4
DEC A
JZ FUNCTION5 ;为0则转功能5
NOP
NOP
LJMP RXOUT ;返回
FUNCTION0: CPL P0.2
LJMP RXOUT ;返回
FUNCTION1: CPL P3.3
LJMP RXOUT ;返回
FUNCTION2: CPL P3.4
LJMP RXOUT ;返回
FUNCTION3: CPL P0.2
LJMP RXOUT ;返回
FUNCTION4: CPL P3.3
LJMP RXOUT ;返回
FUNCTION5: CPL P3.4
LJMP RXOUT
;
;***************************************
; 延时513US程序
; ***************************************
DELAY513US: MOV R5,#254
DELAY513US1: DJNZ R4,DELAY513US1
RET
;**********以下液晶开机显示程序**************
;
;***************开机显示画面***********************
LOGON: MOV A,#80H ;第一行左第一个字开始
LCALL WRITE_COM
MOV DPTR,#CHINESE ;WORD 16*16点阵TEST
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一个字开始
LCALL WRITE_COM
MOV DPTR,#CHINESE1 ;WORD 16*16点阵TEST
LCALL WRITE_HZ
CLR LAMPBLAK ;开背光灯
LCALL DELAY5S ;显示5秒
SETB LAMPBLAK ;关背光灯
RET
;**********初始化程序*************
SETUP:
MOV A,#01H ;CLEAR DISPLAY
LCALL WRITE_COM
MOV A,#00110000B ;FUNCTION SETTING
LCALL WRITE_COM
MOV A,#00000010B ;DDRAM SET TO '00H'
LCALL WRITE_COM
MOV A,#00000100B ;
LCALL WRITE_COM
MOV A,#00001100B ;DISPLAY ON
LCALL WRITE_COM
MOV A,#00000001B ;CLEARING SCREEN
LCALL WRITE_COM
MOV A,#10000000B ;SET DDRAM ADDRESS
LCALL WRITE_COM
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
;************串行命令写入子程序****************
;写入命令字在A中
WRITE_COM:
LCALL DELAY1 ;
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111000B
COMM1:
CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
COMM2: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
COMM3: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,COMM3
CLR CS
RET
;
;***********串行数据写入子程序****************
;写入数据字在A中
WRITE_DAT:
LCALL DELAY1
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111010B
DATA1: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
DATA2: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
DATA3: CLR C
RLC A
MOV SID,C
CLR SCLK
SETB SCLK
DJNZ R0,DATA3
CLR CS
RET
;
;**************延时子程序**********************
;0.544ms
DELAY1:
MOV R7,#010H
D11: MOV R6,#010H
DJNZ R6,$
DJNZ R7,D11
RET
;0.13s
DELAY:
MOV R1,#00H
D2: MOV R2,#00H
DJNZ R2,$
DJNZ R1,D2
RET
;5.2s
DELAY5S:MOV R3,#28H
DE5S: LCALL DELAY
DJNZ R3,DE5S
RET
;
;************16*8点阵字写入子程序共16个******************
WRITE_ASCII:
MOV R4,#16
DDDD: CLR A
MOVC A,@A+DPTR
LCALL WRITE_DAT
INC DPTR
DJNZ R4,DDDD
RET
;************16*8点阵字写入子程序共7个******************
WRITE_ASCII7:
MOV R4,#7
DDDD7: MOV A,@R0
LCALL WRITE_DAT
INC R0
DJNZ R4,DDDD7
RET
;************16*16点阵汉字写入子程序共7个***********
WRITE_HZ: ;WRITE 7 CHINESE TO LCD
MOV R4,#7
DD: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD
RET
;************16*16点阵汉字写入子程序共2个***********
WRITE_HZ2: ;WRITE 8 CHINESE TO LCD
MOV R4,#2
DD4: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD4
RET
;
;*****************************16*8点阵的字符代码表**********************************
TABLE1: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H
; 0 1 2 3 4 5 6 7 8 9 : ; < = > "不显"
;**********************************自造字符地址表***********************************
;
;******************"这里是16*16点阵的汉字代码表"************************************
CHINESE: DW 0DBA0H,0D5E3H,0BDADH,0BAA3H,0D1F3H,0D1A7H,0D4BAH,0DBA0H;—浙江海洋学院—
CHINESE1: DB "遥控接收器---- ";单片机实验—
;;;;;;;;;;;;;;;;;;;;;;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -