⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testled.asm

📁 红外遥控利率屏汇编源码。 MCU:普通51即可 时间芯片:DS1302 遥控器:用38K晶振的任意型号彩电遥控器
💻 ASM
📖 第 1 页 / 共 3 页
字号:
LED_STR		EQU	P1.0	;1
LED_CLK		EQU	P1.1	;2
LED_DATA	EQU	P1.2	;3
LED_OE		EQU	P1.3	;4
TIME_STR	EQU	P1.4	;
TIME_CLK	EQU	P1.5	;
TIME_DATA	EQU	P1.6	;
TIME_OE		EQU	P1.7	;
T_CLK		Bit	P3.5			;实时时钟时钟线引脚
T_IO		Bit	P3.4			;实时时钟数据线引脚
T_RST		Bit	P3.3			;实时时钟复位线引脚
YKIN		BIT	P3.2

DATA_BUFF	EQU	2EH
DATA_INDEX	EQU	2FH		;修改模式中当前正在编辑位的编号,第7位编辑标志位,为1表示正在编辑状态,第6位为编辑种类位,值是0为编辑利率,值是1为修改时间
NUM_START_L	EQU	30H
NUM_START_H	EQU	31H
NUM_COUNT	EQU	32H		;汇率LED的位数

TIME_COUNT	EQU	33H		;时间LED的位数
TIME_START_L	EQU	34H
TIME_START_H	EQU	35H

TIME_SECOND	EQU	36H
TIME_MINUTE	EQU	37H
TIME_HOUR	EQU	38H
TIME_DAY	EQU	39H
TIME_MONTH	EQU	3AH
TIME_WEEK	EQU	3BH
TIME_YEAR	EQU	3CH

HWTH		EQU	80H
;****************************************
	ORG	0000H
	JMP	START
	ORG	0003H		;INT0中断处理
	AJMP	INT_0

	ORG	0100H
;****************************************
;TEST_TIME:
;	MOV	TIME_SECOND,#20H
;	MOV	TIME_MINUTE,#30H
;	MOV	TIME_HOUR,#14H
;	MOV	TIME_DAY,#18H
;	MOV	TIME_MONTH,#04H
;	MOV	TIME_WEEK,#02H
;	MOV	TIME_YEAR,#06H
;	LCALL	WRITE_TIME_TO_1302
;	MOV	TIME_SECOND,#0FFH
;	MOV	TIME_MINUTE,#0FFH
;	MOV	TIME_HOUR,#0FFH
;	MOV	TIME_DAY,#0FFH
;	MOV	TIME_MONTH,#0FFH
;	MOV	TIME_WEEK,#0FFH
;	MOV	TIME_YEAR,#0FFH
;	RET
;****************************************
;初始化汇率屏幕数据基础信息
;使用资源:无
INIT:	SETB	IT0
	SETB	EX0
	SETB	EA
	MOV	NUM_START_L,#00H
	MOV	NUM_START_H,#20H
	MOV	NUM_COUNT,#40H
	MOV	TIME_START_L,#80H
	MOV	TIME_START_H,#20H
	MOV	TIME_COUNT,#0DH
	
	MOV	A,#10000000B
	ADD	A,NUM_COUNT
	DEC	A
	MOV	DATA_INDEX,A
	SETB	LED_OE
	SETB	LED_STR
	SETB	TIME_OE
	SETB	TIME_STR
	LCALL	Set1302
;	LCALL	TEST_EXT_MEM
	RET
;****************************************
;汇率显示清空
;使用资源:无
CLR_LED:
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	XCH	A,R1
	PUSH	ACC
	XCH	A,R1

	MOV	R0,NUM_COUNT
;	CLR	LED_OE
	CLR	LED_STR
 LOOP1:	MOV	R1,#08H
 LOOP2:	SETB	LED_DATA
	CLR	LED_CLK
	SETB	LED_CLK
	DJNZ	R1,LOOP2
	DJNZ	R0,LOOP1
	SETB	LED_STR	
;	SETB	LED_OE
	XCH	A,R1
	POP	ACC
	XCH	A,R1

	XCH	A,R0
	POP	ACC
	XCH	A,R0

	RET	
;****************************************
CLR_TIME:
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	XCH	A,R1
	PUSH	ACC
	XCH	A,R1

	MOV	R0,TIME_COUNT
;	CLR	TIME_OE
	CLR	TIME_STR
 LOOP5:	MOV	R1,#08H
 LOOP6:	SETB	TIME_DATA
	CLR	TIME_CLK
	SETB	TIME_CLK
	DJNZ	R1,LOOP6
	DJNZ	R0,LOOP5
	SETB	TIME_STR	
;	SETB	TIME_OE

	XCH	A,R1
	POP	ACC
	XCH	A,R1

	XCH	A,R0
	POP	ACC
	XCH	A,R0

	RET
;****************************************
;汇率显示全亮
;使用资源:无
FULL_LED:
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	XCH	A,R1
	PUSH	ACC
	XCH	A,R1

	MOV	R0,NUM_COUNT
;	CLR	LED_OE
	CLR	LED_STR
 LOOP3:	MOV	R1,#08H
 LOOP4:	CLR	LED_DATA
	CLR	LED_CLK
	SETB	LED_CLK
	DJNZ	R1,LOOP4
	DJNZ	R0,LOOP3
	SETB	LED_STR
;	SETB	LED_OE

	XCH	A,R1
	POP	ACC
	XCH	A,R1

	XCH	A,R0
	POP	ACC
	XCH	A,R0

	RET	
;****************************************
FULL_TIME:
	XCH	A,R0
	PUSH	ACC
	XCH	A,R0

	XCH	A,R1
	PUSH	ACC
	XCH	A,R1

	MOV	R0,TIME_COUNT
;	CLR	TIME_OE
 	CLR	TIME_STR
 LOOP7:	MOV	R1,#08H
 	MOV	A,#00H
 	ORL	A,#10000000B
 LOOP8:	RRC	A
	MOV	TIME_DATA,C
	CLR	TIME_CLK
	SETB	TIME_CLK
	DJNZ	R1,LOOP8
	DJNZ	R0,LOOP7
	SETB	TIME_STR
;	SETB	TIME_OE

	XCH	A,R1
	POP	ACC
	XCH	A,R1

	XCH	A,R0
	POP	ACC
	XCH	A,R0

	RET	
;****************************************
;显示全部的数字
DISPLAY_LED:
	SETB	RS1
	PUSH	DPH
	PUSH	DPL
	PUSH	ACC
	MOV	R0,NUM_COUNT
	MOV	DPL,NUM_START_L
	MOV	DPH,NUM_START_H
;	CLR	LED_OE
	CLR	LED_STR
 DISPLAY_LED_LOOP1:
	MOV	R1,#08H
	MOVX	A,@DPTR
 DISPLAY_LED_LOOP2:
	RRC	A
	MOV	LED_DATA,C
	CLR	LED_CLK
	SETB	LED_CLK
	DJNZ	R1,DISPLAY_LED_LOOP2
	INC	DPTR
	DJNZ	R0,DISPLAY_LED_LOOP1
	SETB	LED_STR
;	SETB	LED_OE
	POP	ACC
	POP	DPL
	POP	DPH
	CLR	RS1
	RET
;****************************************
;显示时间
DISPLAY_TIME:
	SETB	RS1
	PUSH	DPH
	PUSH	DPL
	PUSH	ACC
	
	LCALL	FIX_TIME
	MOV	R0,TIME_COUNT
	MOV	DPL,TIME_START_L
	MOV	DPH,TIME_START_H
;	CLR	TIME_OE
	CLR	TIME_STR
 DISPLAY_TIME_LOOP1:
	MOV	R1,#08H
	MOVX	A,@DPTR
;	ORL	A,#00000000B
  DISPLAY_TIME_LOOP2:
	RRC	A
	MOV	TIME_DATA,C
	CLR	TIME_CLK
	SETB	TIME_CLK
	DJNZ	R1,DISPLAY_TIME_LOOP2
	INC	DPTR
	DJNZ	R0,DISPLAY_TIME_LOOP1
	SETB	TIME_STR
;	SETB	TIME_OE
	POP	ACC
	POP	DPL
	POP	DPH
	CLR	RS1
	RET
;****************************************
;修正时间误差,每10分钟加1秒,相当于每天加144秒。
FIX_TIME:
	MOV	A,TIME_MINUTE
	ANL	A,#00001111B
	CJNE	A,#05H,FIX_TIME_EXIT		;分钟数不是5退出
	MOV	A,TIME_SECOND
	CJNE	A,#59H,FIX_TIME_EXIT	;秒数不是59退出
	MOV	A,TIME_MINUTE
	INC	A
	MOV	TIME_MINUTE,A
	MOV	TIME_SECOND,#00H
	LCALL	WRITE_TIME_TO_1302
 FIX_TIME_EXIT:
	RET
;****************************************
;在指定位置显示指定数
DISPLAY_NUM:
	JB	DATA_INDEX.7,DISPLAY_NUM_EXIT	;不是编辑状态的话退出
	PUSH	DPH
	PUSH	DPL
	XCH	A,B
	PUSH	ACC
	XCH	A,B

	PUSH	ACC			;A进栈
	MOV	A,DATA_BUFF
	MOV	C,ACC.7
	MOV	A,#0FFH
	MOV	ACC.7,C
	MOV	B,A			;有点B是7FH,没有点B是FFH
	LCALL	SET_DATA_DPTR_AUTO_SELECT	;设置DPTR
	POP	ACC			;GET_NUM_DATA需要将参数放在A中

	LCALL	GET_NUM_DATA		;读显示数的数据
	JB	DATA_INDEX.6,SKIP_DISPLAY_DOT;显示时间不需要点
	CJNE	A,#0FFH,DISPLAY_DOT1	;A不是#0FFH就保持/不显示显示点
	SJMP	SKIP_DISPLAY_DOT	;否则要跳过点的显示
 DISPLAY_DOT1:
	ANL	A,B
 SKIP_DISPLAY_DOT:
	MOV	DATA_BUFF,A
	MOVX	@DPTR,A			;写数据
	LCALL	REFRESH_AUTO_SELECT	;显示

	XCH	A,B
	POP	ACC
	XCH	A,B
	POP	DPL
	POP	DPH
DISPLAY_NUM_EXIT:
	RET
;****************************************
;在指定位置显示小数点
DISPLAY_DOT:
	JB	DATA_INDEX.7,DISPLAY_DOT_EXIT	;不是编辑状态的话退出
	PUSH	DPH
	PUSH	DPL
	LCALL	SET_DATA_DPTR_AUTO_SELECT	;设置DPTR
	ANL	DPL,#11111100B

	MOVX	A,@DPTR
	ORL	A,#10000000B
	MOVX	@DPTR,A

	INC	DPTR
	MOVX	A,@DPTR
	ORL	A,#10000000B
	MOVX	@DPTR,A

	INC	DPTR
	MOVX	A,@DPTR
	ORL	A,#10000000B
	MOVX	@DPTR,A

	INC	DPTR
	MOVX	A,@DPTR
	ORL	A,#10000000B
	MOVX	@DPTR,A

	LCALL	SET_DATA_DPTR_AUTO_SELECT	;设置DPTR
	MOV	A,DATA_BUFF
	CPL	ACC.7
	MOV	DATA_BUFF,A
	MOVX	@DPTR,A				;写数据
	LCALL	REFRESH_AUTO_SELECT		;显示
	POP	DPL
	POP	DPH
DISPLAY_DOT_EXIT:
	RET
;****************************************
;延时
;使用资源:R6,R7
DELAY:	MOV	R6,#0FFH
 DLPX4:	MOV	R7,#0FFH
 DLPX5:	NOP
 	NOP
 	NOP
 	NOP
	DJNZ	R7,DLPX5
	DJNZ	R6,DLPX4
	RET
;****************************************
;超长延时
;使用资源:无
DELAY_500MS:
	XCH	A,R5
	PUSH	ACC
	XCH	A,R5

	XCH	A,R6
	PUSH	ACC
	XCH	A,R6

	XCH	A,R7
	PUSH	ACC
	XCH	A,R7

	MOV	R5,#080H
 DLPX1:	MOV	R6,#080H
 DLPX2:	MOV	R7,#010H
 DLPX3:	NOP
	DJNZ	R7,DLPX3
	DJNZ	R6,DLPX2
	DJNZ	R5,DLPX1
	
	XCH	A,R7
	POP	ACC
	XCH	A,R7

	XCH	A,R6
	POP	ACC
	XCH	A,R6

	XCH	A,R5
	POP	ACC
	XCH	A,R5

	RET
;****************************************
;中断处理,识别红外遥控码,并进行相应处理
INT_0:
	CLR	EA		;关中断
	PUSH	PSW
	PUSH	DPH
	PUSH	DPL
	PUSH	ACC
	PUSH	0
	PUSH	1
	PUSH	2
	PUSH	3
	PUSH	4
	PUSH	5
	PUSH	6		;保存现场

	MOV	8,#0		;08H填0
	MOV	9,#0		;08H填0
	MOV	R1,#20H
 ILOOPS:
 	LCALL	TESTH		;调用程序读出红外编码
	LCALL	TESTL
	JC	OVER
	SJMP	ILOOPS

 OVER:	MOV	DPTR,#YKDATA
	MOV	R0,#30		;
 OVERL:	LCALL	FINDS		;判断键码
	JC	OV1		;找到后跳到OV1,R0为其键码在表中的编号
	DJNZ	R0,OVERL	;循环扫描22个键,找到编码后C置1
	SJMP	OV2		;22个都不是,不进行处理
 OV1:	LCALL	KEY_DOWN	;处理相应按键
	LCALL	DELAY
 OV2:	POP	6		;恢复现场,退出
	POP	5
	POP	4
	POP	3
	POP	2
	POP	1
	POP	0
	POP	ACC
	POP	DPL
	POP	DPH
	POP	PSW
	SETB	EA
	RETI
;*******************************************************
;检测红外数据
TESTH:	MOV	R3,#0		;初始化R3
 TESTL1:INC	R3		;遥控编码的宽度记数+1
	CALL	DLYT		;延时
	MOV	C,YKIN		;继续读取红外数据
	JC	TBR1		;红外信号端高电平,转到TBR1
	SJMP	TESTL1		;红外信号端低电平,R3继续记数
 TBR1:	CLR	C		;
	CALL	M89		;红外信号端高电平,二区R0,R1左移一位
	MOV	A,R3		;R3数据是红外信号端低电平的宽度,R3 X DLYT
	CLR	C
	MOV	B,#HWTH
	SUBB	A,B
	JC	TBR11		;R3大于HWTH跳转到TBR11
	CLR	C
	CALL	M89		;R3小于或等于HWTH则要
 TBR11:	MOV	A,R3
	MOV	@R1,A
	CJNE	R1,#2DH,T001
	RET
 T001:	INC	R1
	RET
;*******************************************************
;检测红外数据
TESTL:	MOV	R3,#0
L2:	INC	R3
	CALL	DLYT
	MOV	C,YKIN
	JC	TBR2
	SETB	C
	CALL	M89
	MOV	A,R3
	CLR	C
	MOV	B,#HWTH
	SUBB	A,B
	JC	TBR21
	SETB	C
	CALL	M89
TBR21:	MOV	A,R3
	MOV	@R1,A
	CJNE	R1,#2DH,T002
	CLR	C
	RET
T002:	INC	R1
	CLR	C
	RET
TBR2:	CJNE	R3,#0FFH,L2
	SETB	C
	RET		
;*******************************************************
;08H 09H C左移
M89:	MOV	A,9
	RLC	A
	MOV	9,A
	MOV	A,8
	RLC	A
	MOV	8,A
	RET
;*******************************************************
DLYT:	MOV	R4,#03H		;22.1184用03H
DLTL:	DJNZ	R4,DLTL
	RET	
;****************************************
;查表找键,DPTR已经预置为YKDATA
FINDS:	CLR	C
	MOV	A,#0
	MOVC	A,@A+DPTR	;读DPTR数据
	CJNE	A,8,FBR1	;2区R0不一样就继续下个
	MOV	A,#1
	MOVC	A,@A+DPTR	;继续读DPTR数据
	CJNE	A,9,FBR1	;与2区R1不一样就继续下个
	SETB	C		;两字节全符合,C置后1返回
	RET
FBR1:	INC	DPTR
	INC	DPTR
	CLR	C		;不符合,C置0后返回
	RET
;*******************************************************
KEY_DOWN:
	MOV	A,#1EH
	CLR	C
	SUBB	A,R0
	RLC	A
	MOV	DPTR,#KEYMAP
	JMP	@A+DPTR
KEYMAP:	AJMP	K_AAD2	;01	开关
	AJMP	K_55A6	;02	静音
	AJMP	K_ACAA	;03	节目+
	AJMP	K_5956	;04	节目-
	AJMP	K_599A	;05	微调+
	AJMP	K_ACD2	;06	微调-
	AJMP	K_AB2A	;07	音量+
	AJMP	K_5656	;08	音量-
	AJMP	K_AAAA	;09	0
	AJMP	K_5556	;10	1
	AJMP	K_AAAC	;11	2
	AJMP	K_555A	;12	3
	AJMP	K_AAB2	;13	4
	AJMP	K_5566	;14	5
	AJMP	K_AAB4	;15	6
	AJMP	K_556A	;16	7
	AJMP	K_AACA	;17	8
	AJMP	K_5596	;18	9
	AJMP	K_AB54	;19	调谐	空数字
	AJMP	K_AACC	;20	单/双	小数点
	AJMP	K_55AA	;21	招回
	AJMP	K_5996	;22	存储
	AJMP	K_AB52	;23	对比+
	AJMP	K_56A6	;24	对比-
	AJMP	K_AB32	;25	色彩+
	AJMP	K_5666	;26	色彩-
	AJMP	K_AB2C	;27	亮度+
	AJMP	K_565A	;28	亮度-
	AJMP	K_AD4A	;29	录象
	AJMP	K_5AAA	;30	电视
K_AAD2:	LCALL	SET_EDIT_NUM_MODE	;开关	进入/退出利率修改模式
	RET
K_55A6:	LCALL	SET_EDIT_TIME_MODE	;静音	进入/退出时间修改模式
	RET
K_ACAA:	LCALL	CURSOR_INC	;节目+	向左移动一位,如果是首位则移动到上个利率牌的末位,到头则无反映
	RET
K_5956:	LCALL	CURSOR_DEC	;节目-	向右移动一位,如果是末尾则移动到下个利率牌的首位,到尾则无反映
	RET
K_599A:	LCALL	CURSOR_NUM_INC	;微调+	光标所在的位数值+1,到9后再按则返回到0
	RET
K_ACD2:	LCALL	CURSOR_NUM_DEC	;微调-	光标所在的位数值-1,到0后再按则返回到9
	RET
K_AB2A:	LCALL	CURSOR_INC_EX	;音量+	移动到上一个利率块
	RET
K_5656:	LCALL	CURSOR_DEC_EX	;音量-	移动到下一个利率块
	RET
K_AAAA:	MOV	A,#00H		;0
	LCALL	DISPLAY_NUM
	RET
K_5556:	MOV	A,#01H		;1
	LCALL	DISPLAY_NUM
	RET
K_AAAC:	MOV	A,#02H		;2
	LCALL	DISPLAY_NUM
	RET
K_555A:	MOV	A,#03H		;3
	LCALL	DISPLAY_NUM
	RET
K_AAB2:	MOV	A,#04H		;4
	LCALL	DISPLAY_NUM
	RET
K_5566:	MOV	A,#05H		;5
	LCALL	DISPLAY_NUM
	RET
K_AAB4:	MOV	A,#06H		;6
	LCALL	DISPLAY_NUM
	RET
K_556A:	MOV	A,#07H		;7
	LCALL	DISPLAY_NUM
	RET
K_AACA:	MOV	A,#08H		;8
	LCALL	DISPLAY_NUM
	RET
K_5596:	MOV	A,#09H		;9
	LCALL	DISPLAY_NUM
	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -