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