www.pudn.com > LuQuNuDp.rar > LuQuNuDp.asm


; 字段式LED显示牌控制程序	1.11版	适用于LUQUEUND板 
;    作为窗口显示牌用       程序设计  Tingtao  2003.1.9		 
;******************** 内部RAM 区分配定义表 *********************** 
; 地址0~7为当前工作寄存器组,R0~R7  
REGIST00	EQU	0 
 
MINSCUNT	EQU	9 
SECOND		EQU	10 
MINUTE		EQU	11 
HOUR_REG	EQU	12 
DAYREGIST	EQU	13 
MONTHREG	EQU	14 
YEAR_REG	EQU	15 
DELAYREG	EQU	16 
 
WINDNUMB	EQU	17 
SERVTYPE	EQU	18	; 
CRNPOINT	EQU	19	; 当前字符指针,1Byte  
STMSPOINT	EQU	20 
LDMSPOINT	EQU	21 
BEEPMODE	EQU	22 
DISPBUFF	EQU	25	; 5字节 
 
STATUREG	EQU	20H	 
SENDFLAG	BIT	0 
RECVFLAG	BIT	1 
ENDISPFLG	BIT	2 
CALLFLAG	BIT	3 
PAUSEFLG	BIT	4	进入暂停状态标志 
HIZEROFLG	BIT	5	高位零标志 
ENMOVEFG	BIT	6	允许移动显示缓冲区标志 
 
RECVCUNT	EQU	21H	; 接收数据的计数器 
SENDCUNT	EQU	22H	; 发送数据的计数器 
COMMSTATU	EQU	23H	; 串行通讯状态寄存器 
RECVPOINT	EQU	24H	; 接收数据缓冲区的指针 
SENDPOINT	EQU	25H	; 发送数据的缓冲区指针 
CRN_TASK	EQU	26H	; 2Byte 
TEMPBUFF	EQU	28H	; 临时工作缓冲区, 8Byte 
 
WORKTICK	EQU	30H	; 窗口当前处理的票号,2Byte 
CRNSTATU	EQU	32H	; 窗口当前状态 
MESSTYPE	EQU	36H	 
MESSADDR	EQU	37H 
MESSBUFF	EQU	38H	; 通讯接收缓冲区, 48Byte 
 
STACK_00	EQU	68H	; 工作堆栈区, 24Byte 
;------------------------ 工作常数定义表 --------------------- 
;TIMER_00	EQU	-7680	; 主频18.432MH,定时器零的定时常数, 
TIMERLL	EQU	000H	; 其中断时间间隔为5ms 
TIMERHH	EQU	0E2H 
REPROMBAD	EQU	0 
;------------------- I/O信号定义表 ------------------------- 
RS485_IN	EQU	P3.0 
RS485OUT	EQU	P3.1 
DATASTART	EQU	P3.2 
TXENSELE	EQU	P3.3 
SCKEPROM	EQU	P3.4 
SDAEPROM	EQU	P3.5 
LED11DRV	EQU	P1.0 
LED22DRV	EQU	P1.1 
LED33DRV	EQU	P3.7 
LED44DRV	EQU	P1.2 
CLOCK164	EQU	P1.3 
CLEAR164	EQU	P1.4 
DATA_164	EQU	P1.7 
;------------------------------------------------------------- 
		ORG	0 
		LJMP	START 
		AJMP	START		; 3 
		AJMP	START 
		AJMP	START 
		AJMP	START 
		MOV	TL0,#TIMERLL	; ORG	0BH, 定时器零中断处理程序 
		MOV	TH0,#TIMERHH 
		AJMP	TIMEINTR 
GETLEDMP:	INC	A 
		MOVC	A,@A+PC 
		RET 
		DB	11110110B,10010000B,11100011B,11010011B 
		DB	10010101B,01010111B,01110111B,11010000B 
		DB	11110111B,11010111B,11110101B,00110111B 
		ORG	23H		; 串行通讯中断处理程序 
;--------------------------------------------------------- 
; 串行通讯中断处理程序, 通讯模式为一, 八位数据,校验位 
; 主频为18.432MH, 波特率定为16000, 分频系数为 3 
COMMUNIT:	PUSH	PSW 
		PUSH	ACC 
		PUSH	R0 
		JBC	RI,RECIVER 
		JBC	TI,SENDSUBR 
		SJMP	COMMUEND 
SENDSUBR:	MOV	A,SENDCUNT	; 发送处理子程序 
		JZ	SEND_END 
		MOV	R0,SENDPOINT 
		MOV	SBUF,@R0 
		INC	SENDPOINT 
		DEC	SENDCUNT 
		SJMP	COMMUEND 
SEND_END:	CLR	TXENSELE	;设置接收状态 
		SETB	SENDFLAG	;发送结束 
COMMUEND:	POP	R0 
		POP	ACC 
		POP	PSW 
		RETI 
; 接收串口数据子程序	将接收到的数据存到通讯缓冲区 
RECIVER:	MOV	R0,SBUF 
		PUSH	DPH 
		PUSH	DPL 
		MOV	A,COMMSTATU	; 通讯程序状态字 
		ANL	A,#7 
		RL	A 
		MOV	DPTR,#COMMUJMP; 通讯程序转移表首址 
		JMP	@A+DPTR 
 
COMMUJMP:	AJMP	ESC_RECV		; 起始符'1BH' 
		AJMP	TYPERECV		; 类型字 
		AJMP	ADDRRECV		; 地址 
		AJMP	MESSRECV		; 本机正文 
		AJMP	OTHERECV		; 非本机正文 
		AJMP	RECVEXIT		; 非法状态 
		AJMP	RECVEXIT		; 非法状态 
		AJMP	RECVEXIT		; 非法状态 
 
ESC_RECV:	CJNE	R0,#STARTCHR,RECV_END+2 
 
RECV_END:	INC	COMMSTATU 
		POP	DPL 
		POP	DPH 
		POP	R0 
		POP	ACC 
		POP	PSW 
		RETI 
;接收非本机消息内容不存储 
OTHERECV:	DJNZ	RECVCUNT,RECV_END+2 
 
RECVEXIT:	MOV	COMMSTATU,#ESC_STATU 
		SJMP	RECV_END+2 
;接收消息的类型字节,然后取出正文长度 
TYPERECV:	MOV	A,R0 
		MOV	MESSTYPE,A 
		ADD	A,#-200 
		JNC	RECVEXIT		; 类型字出错 
		ADD	A,#-MAX_TYPE 
		JC	RECVEXIT		; 类型字出错 
		MOV	A,R0 
		MOV	DPTR,#MESSLENG-200 
		MOVC	A,@A+DPTR		; 取正文长度 
		MOV	RECVCUNT,A 
		MOV	RECVPOINT,STMSPOINT 
		MOV	A,R0 
		ACALL	SAVEMESS 
		SJMP	RECV_END 
;接收消息的地址项 
ADDRRECV:	MOV	A,RECVCUNT 
		JZ	RECVEXIT 
		INC	COMMSTATU 
		MOV	A,R0 
		CJNE	A,WINDNUMB,RECV_END	; 非本机消息 
		MOV	DPTR,#WDMESSTB 
MESSCOMP:	CLR	A 
		MOVC	A,@A+DPTR 
		JZ	RECV_END		; 非本机消息 
		XRL	A,MESSTYPE 
		JZ	ADDRECV00 
		INC	DPTR 
		SJMP	MESSCOMP 
ADDRECV00:	MOV	A,R0 
		ACALL	SAVEMESS 
		SJMP	RECV_END+2 
;  
WDMESSTB:	DB	STATUACK,TASK_ACK,MS_CALL 
		DB	WDMESS00,WDMESS11,WDMESS22,0 
; 消息转存,(A)==>((R0)) 
SAVEMESS:	MOV	R0,RECVPOINT 
		MOV	@R0,A 
		INC	R0 
		CJNE	R0,#STACK_00,$+5 
		MOV	R0,#MESSBUFF 
		MOV	RECVPOINT,R0 
		RET 
;接收发给本机的消息并存储 
MESSRECV:	MOV	A,R0 
		ACALL	SAVEMESS 
		DJNZ	RECVCUNT,RECV_END+2 
		MOV	R0,#STARTCHR 
		MOV	A,STMSPOINT 
MSRECV00:	XCH	A,R0 
		XRL	A,@R0 
		INC	R0 
		XCH	A,R0 
		CJNE	A,#STACK_00,$+5 
		MOV	A,#MESSBUFF 
		CJNE	A,RECVPOINT,MSRECV00 
		MOV	A,R0 
		JNZ	RECVEXIT 
		MOV	STMSPOINT,RECVPOINT 
		SETB	RECVFLAG 
		AJMP	RECVEXIT 
;---------------------------------------------------------------- 
; 时钟中断处理程序, 提供软件定时并按规定的时间自动切换显示的字符 
; 共4个字, 每5ms中断一次, 中断后进行一次显示切换,即每个字符显示 
; 的时间也为5ms,则每行的显示频率为 1/(4*5ms):= 50H 
TIMEINTR:	PUSH	PSW 
		PUSH	ACC 
		PUSH	R1 
		PUSH	R0 
		SETB	LED11DRV 
		SETB	LED22DRV 
		SETB	LED33DRV 
		SETB	LED44DRV 
		CPL	P1.6 
		JNB	ENDISPFLG,TIMEIT11 
		MOV	R0,CRNPOINT 
		MOV	A,@R0 
		MOV	R1,#8 
TIMEIT00:	CLR	CLOCK164 
		RLC	A 
		MOV	DATA_164,C 
		SETB	CLOCK164 
		DJNZ	R1,TIMEIT00 
		INC	CRNPOINT 
		CJNE	R0,#DISPBUFF,DISPED00 
		CLR	LED11DRV 
		SJMP	TIMEIT11 
DISPED00:	CJNE	R0,#DISPBUFF+1,DISPED11 
		CLR	LED22DRV 
		SJMP	TIMEIT11 
DISPED11: 	CJNE	R0,#DISPBUFF+2,DISPED22 
		CLR	LED33DRV 
		SJMP	TIMEIT11 
DISPED22:	MOV	CRNPOINT,#DISPBUFF 
		CLR	LED44DRV 
 
TIMEIT11:	MOV	A,DELAYREG		; DELAYREG作外部程序定时器 
		JZ	$+4			; 定时单位为5ms 
		DEC	DELAYREG 
		CLR	A 
		MOV	R0,#MINSCUNT 
		INC	@R0			; MINSCUNT 
		CJNE	@R0,#200,TIMEIT22	; 200*5ms:= 1s 
		MOV	@R0,A 
		INC	R0 
		INC	@R0			; SECOND ++1 
		CJNE	@R0,#60,TIMEIT22 
		MOV	@R0,A 
		INC	R0 
		INC	@R0			; MINUTE ++1 
		CJNE	@R0,#60,TIMEIT22 
		MOV	@R0,A 
		INC	R0 
		INC	@R0			; HOUR_REG ++1 
		CJNE	@R0,#24,TIMEIT22 
		MOV	@R0,A 
TIMEIT22:	POP	R0 
		POP	R1 
		POP	ACC 
		POP	PSW 
		RETI 
 
WAIT5SEC:	ACALL	WAIT1SEC 
WAIT4SEC:	ACALL	WAIT1SEC 
WAIT3SEC:	ACALL	WAIT1SEC 
WAIT2SEC:	ACALL	WAIT1SEC 
WAIT1SEC:	ACALL	WAIT500MS 
WAIT500ms:	ACALL	WAIT250MS 
WAIT250ms:	MOV	DELAYREG,#50		; 50*5ms 
WAITLOOP:	;ACALL	MESSPROC 
		MOV	A,DELAYREG 
		JNZ	WAITLOOP 
		RET 
 
		INCLUDE	LUMESSTB.TXT 
		INCLUDE	LAT2401A.ASM 
;--------------------------------------------------------------- 
; 将窗口号变换成BCD码 
BCD_SUBR:	MOV	TEMPBUFF,#0		;目标数据:=TEMPBUFF 
		MOV	TEMPBUFF+1,#0 
		MOV	TEMPBUFF+2,#0		;清目标数据区 
BCDSUB00:	MOV	R1,#8 
BCD_C00:	RLC	A 
		MOV	R2,A 
		MOV	R3,#3 
		MOV	R0,#TEMPBUFF 
BCD_C11:	MOV	A,@R0 
		ADDC	A,@R0 
		DA	A 
		MOV	@R0,A 
		INC	R0 
		DJNZ	R3,BCD_C11 
		MOV	A,R2 
		DJNZ	R1,BCD_C00 
		RET 
 
DB_BCD:	MOV	A,@R0 
		SWAP	A 
		ACALL	DB_BCD00 
SIG_BCD:	MOV	A,@R0 
		DEC	R0 
DB_BCD00:	ANL	A,#0FH 
		JNZ	DB_BCD11 
		JB	HIZEROFLG,DB_BCD22 
DB_BCD11:	CLR	HIZEROFLG 
		ACALL	GETLEDMP 
DB_BCD22:	MOV	@R1,A 
		INC	R1 
		RET 
 
; 显示一个票号 
DISPTICK:	MOV	A,CRN_TASK		;票号_H 
		ACALL	BCD_SUBR 
		MOV	A,CRN_TASK+1		;票号_L 
		ACALL	BCDSUB00		;将票号变换成BCD码 
		SETB	HIZEROFLG 
		MOV	R0,#TEMPBUFF+1 
		MOV	R1,#DISPBUFF 
		ACALL	SIG_BCD 
		ACALL	DB_BCD 
		MOV	DISPBUFF+3,#0 
		MOV	R4,#16 
DISPTKLOP:	SETB	ENDISPFLG 
		ACALL	WAIT500MS 
		CLR	ENDISPFLG 
		ACALL	WAIT250MS 
		DJNZ	R4,DISPTKLOP 
		SETB	ENDISPFLG 
		RET 
; 显示窗口号 
DISPWDNB:	MOV	A,WINDNUMB 
		ACALL	BCD_SUBR		; 将窗口号变换成BCD码 
		SETB	HIZEROFLG 
		MOV	R0,#TEMPBUFF 
		MOV	R1,#DISPBUFF+1 
		ACALL	DB_BCD 
		CLR	A 
		MOV	DISPBUFF,A 
		MOV	DISPBUFF+2,A 
		SETB	ENDISPFLG 
		RET 
; 显示暂停服务 
DISPPAUS:	MOV	R0,#DISPBUFF 
		MOV	A,#80H 
		MOV	@R0,A 
		INC	R0 
		CJNE	R0,#DISPBUFF+4,$-2 
		SETB	PAUSEFLG 
		RET 
;---------------------------------------------------------- 
MESSPROC:	JB	RECVFLAG,$+4 
		RET 
		MOV	R0,LDMSPOINT 
MESSPC00:	MOV	A,@R0 
		INC	R0 
		CJNE	A,#STATUACK,$+5 
		AJMP	MESSPR00 
		CJNE	A,#TASK_ACK,$+5 
		AJMP	MESSPR11 
		CJNE	A,#MS_CALL,$+5 
		AJMP	MESSPR22 
		CJNE	A,#WDMESS00,$+5 
		AJMP	MESSPR33 
		CJNE	A,#WDMESS11,$+5 
		AJMP	MESSPR44 
		CJNE	A,#WDMESS22,$+5 
		AJMP	MESSPR55 
		MOV	R0,STMSPOINT 
MESSPEND:	MOV	A,R0 
		MOV	LDMSPOINT,A 
		XRL	A,STMSPOINT 
		JNZ	$+4		; MESSPC00 
		CLR	RECVFLAG 
		RET 
; 窗口状态信息(STATUACK) 
MESSPR00:	MOV	CRNSTATU,MESSBUFF 
		MOV	WORKTICK,MESSBUFF+1 
		MOV	WORKTICK+1,MESSBUFF+2 
		AJMP	MESSPEND 
; 任务分配确认消息(TASK_ACK) 
MESSPR11:	MOV	CRNSTATU,#BUSYSTAT 
; 呼叫消息(MS_CALL),处理过程与任务分配确认消息相同 
MESSPR22:	MOV	CRN_TASK,MESSBUFF		;票号_H 
		MOV	CRN_TASK+1,MESSBUFF+1	;票号_L 
		SETB	CALLFLAG 
		AJMP	MESSPEND 
 
MESSPR33:	MOV	A,@R0 
		INC	DPL 
		MOV	WINDNUMB,A 
		MOVX	A,@DPTR 
		INC	DPL 
		MOV	SERVTYPE,A 
		ACALL	WRITPARA 
		AJMP	MESSPEND 
 
MESSPR44:	 
		AJMP	MESSPEND 
MESSPR55:	 
		AJMP	MESSPEND 
 
READPARA:	MOV	R0,#TEMPBUFF 
		MOV	R1,#0 
		ACALL	RDPGEPROM 
 
WRITPARA:	MOV	R0,#TEMPBUFF 
		MOV	A,#'L' 
		MOV	@R0,A 
		INC	R0 
		MOV	A,#'u' 
		MOV	@R0,A 
		INC	R0 
		MOV	A,WINDNUMB 
		MOV	@R0,A 
		INC	R0 
		MOV	A,SERVTYPE 
		MOV	@R0,A 
		INC	R0 
		MOV	R0,#TEMPBUFF 
		MOV	R1,#0 
		ACALL	WRPGEPROM 
;*************************以下是主控程序************************ 
START:		MOV	SP,#STACK_00 
		MOV	P1,#11111111B 
		MOV	P3,#11111111B 
		CLR	A 
		MOV	R0,#1 
		MOV	@R0,A			; 初始值 
		INC	R0 
		CJNE	R0,#STACK_00,$-2 
		MOV	CRNPOINT,#DISPBUFF 
		MOV	LDMSPOINT,#MESSBUFF 
		MOV	STMSPOINT,#MESSBUFF 
 
		MOV	TMOD,#00100001B	; Timer0 in mode1, Timer1 in mode 2 
		MOV	TH0,#TIMERHH 
		MOV	TL0,#TIMERLL		; 7680*12/18.432:=5ms 
		MOV	TH1,#BAUDCUNT 
		MOV	TL1,#BAUDCUNT 
		MOV	PCON,#0 
		MOV	IP,#10000B		; 通讯中断最优先,时钟中断零 
		MOV	SCON,#01110000B	; 方式1,允许接收,有停止位 
		MOV	TCON,#01010101B	; Setup TR1,TR0,IT1,IT0 
 
		MOV	IE,#10000010B		; 10010010 
		ACALL	TESTSB00 
		ACALL	TESTSB11 
 
		ACALL	READPARA 
		MOV	R0,#TEMPBUFF 
		MOV	A,@R0 
		INC	R0 
		CJNE	A,#'L',NOTLOGIN 
		MOV	A,@R0 
		INC	R0 
		CJNE	A,#'u',NOTLOGIN 
		MOV	A,@R0 
		INC	R0 
		MOV	WINDNUMB,A 
		MOV	A,@R0 
		INC	R0 
		MOV	SERVTYPE,A 
		SJMP	MAINPROC 
 
NOTLOGIN:	MOV	WINDNUMB,#2 
		MOV	SERVTYPE,#2 
 
MAINPROC:	MOV	IE,#10010010B 
		ACALL	WAIT250MS 
MAIN_00:	CLR	PAUSEFLG	; 等待状态 
		JB	CALLFLAG,MAIN_11 
		ACALL	DISPWDNB 
		ACALL	WAIT500MS 
		JB	CALLFLAG,MAIN_11 
		ACALL	MESSPROC 
		JNB	CALLFLAG,MAIN_22 
MAIN_11:	ACALL	DISPTICK	; 显示一个票号 
		CLR	CALLFLAG 
MAIN_22:	ACALL	MESSPROC 
		MOV	A,CRNSTATU 
		CJNE	A,#BUSYSTAT,$+5 
		AJMP	MAIN_33 
		CJNE	A,#BUSYBUSY,$+5 
		AJMP	MAIN_33 
		CJNE	A,#READYSTA,$+5 
		AJMP	MAIN_00 
		CJNE	A,#PAUSESTA,$+5 
		SJMP	$+5 
		CJNE	A,#INITISTA,MAIN_22 
		ACALL	DISPPAUS	; 暂停状态 
		AJMP	MAIN_22 
MAIN_33:	CLR	PAUSEFLG	; 忙状态 
		ACALL	DISPTICK	; 显示一个票号 
		JB	CALLFLAG,MAIN_11 
		MOV	CRN_TASK,WORKTICK 
		MOV	CRN_TASK+1,WORKTICK+1 
		AJMP	MAIN_22 
 
TESTSB00:	MOV	R1,#0 
		SETB	P3.7 
		ORL	P1,#111B 
		CLR	EA 
TEST0000:	MOV	A,R1 
		ACALL	GETLEDMP 
		MOV	R4,#8 
TEST0011:	CLR	CLOCK164 
		RLC	A 
		MOV	DATA_164,C 
		SETB	CLOCK164 
		DJNZ	R4,TEST0011 
		CLR	LED11DRV 
		ACALL	DELAYSUB 
		SETB	LED11DRV 
		CLR	LED22DRV 
		ACALL	DELAYSUB 
		SETB	LED22DRV 
		CLR	LED33DRV 
		ACALL	DELAYSUB 
		SETB	LED33DRV 
		CLR	LED44DRV 
		ACALL	DELAYSUB 
		SETB	LED44DRV 
		INC	R1 
		CJNE	R1,#12,TEST0000 
		SETB	EA 
		RET 
 
DELAYSUB:	MOV	R7,#250 
		MOV	R6,#250 
		MOV	R5,#46 
		DJNZ	R5,$ 
		DJNZ	R6,$-4 
		DJNZ	R7,$-8 
		RET 
 
TESTSB11:	MOV	R1,#0 
		SETB	ENDISPFLG 
TEST1100:	MOV	A,R1 
		ACALL	GETLEDMP 
		MOV	DISPBUFF,A 
		INC	R1 
		MOV	A,R1 
		ACALL	GETLEDMP 
		MOV	DISPBUFF+1,A 
		INC	R1 
		MOV	A,R1 
		ACALL	GETLEDMP 
		MOV	DISPBUFF+2,A 
		INC	R1 
		MOV	A,R1 
		ACALL	GETLEDMP 
		MOV	DISPBUFF+3,A 
		ACALL	WAIT5SEC 
		CJNE	R1,#12,TEST1100 
		;SJMP	TESTSB11 
 
TESTSB22:	CLR	A 
		MOV	CRN_TASK,A 
		MOV	CRN_TASK+1,A 
TEST2200:	INC	CRN_TASK+1 
		MOV	A,CRN_TASK+1 
		JNZ	$+4 
		INC	CRN_TASK 
		ACALL	DISPTICK 
		ACALL	WAIT3SEC 
		SJMP	TEST2200 
 
TESTSB33:	MOV	A,#1 
		SETB	P3.7 
		ORL	P1,#111B 
		CLR	ENDISPFLG 
TEST3300:	MOV	R1,A 
		MOV	R4,#8 
TEST3311:	CLR	CLOCK164 
		RLC	A 
		MOV	DATA_164,C 
		SETB	CLOCK164 
		DJNZ	R4,TEST3311 
		CLR	LED11DRV 
		ACALL	WAIT2SEC 
		SETB	LED11DRV 
		CLR	LED22DRV 
		ACALL	WAIT2SEC 
		SETB	LED22DRV 
		CLR	LED33DRV 
		ACALL	WAIT2SEC 
		SETB	LED33DRV 
		CLR	LED44DRV 
		ACALL	WAIT2SEC 
		SETB	LED44DRV 
		MOV	A,R1 
		RL	A 
		SJMP	TEST3300 
 
		END	00