📄 m03.asm
字号:
;00H: 等待按键有效/空
;01H: 按键20ms等待
;02H: 20ms计时到
;03H: 串口0发送标志
;04H:串口0收到起始字节
;05H:串口0收到物理PID1
;06H:串口0收到命令
;07H:串口0收到物理PID2
;08H:串口0收到参数长度
;09H:串口0收到参数
;0AH:串口0累加和正确,数据串接收完毕
;0BH:串口0错误标志
;0CH:串口0回答标志
;0DH:管理存储器满
;0EH:串口0发送结束标志
;0FH:串口0验证标志
;10H: SEND_M的M04标志
;11H:1秒计时到
;12H:管理程序等待标志
;13H:板卡查询等待标志
;14H:显示时间和状态标志
;15H:收到过秒脉冲标志
;16H:串口1收到起始字节
;17H:串口1收到数据
;18H:串口1累加和正确,数据串接收完毕
;19H:显示粗字标志
;1AH:显示器上参数已被改动
;1BH:M03时区设置的+/-输入值
;1CH: 三位十进制数放入字节单双标志
;1DH: 比较大小结果
;1EH: IIC的ACK位
;1FH: EEPROM初次使用
;20H: 时间设置标志
;0页
;R0: 通用指针
;R1: 通用指针
;1页
;R0: 串口0接收数据指针
;R1: 串口0发送数据指针
;2页
;R0:串口1接收数据指针
;R1:
;3页
;R0:IIC读数据指针
;R1:IIC写数据指针
BIN1 EQU 02H
BIN2 EQU 03H
BIN3 EQU 04H
BIN4 EQU 05H
C1 EQU 06H
C2 EQU 07H
BCD1 EQU 0AH
BCD2 EQU 0BH
BCD3 EQU 0CH
BCD4 EQU 0DH
BCD5 EQU 0EH
C3 EQU 0FH
YEARL EQU 12H
MONTH EQU 13H
DATE EQU 14H
HOUR EQU 15H
MINUTE EQU 16H
SECOND EQU 17H
STAU1 EQU 1AH
STAU2 EQU 1BH
STAU_GPS EQU 1CH
C4 EQU 1DH
ADDH_IIC EQU 2BH
ADDL_IIC EQU 2CH
LONG_IIC EQU 2DH
ULIMIT EQU 2EH
VALUE EQU 2FH
DIS_DL EQU 30H
DIS_DH EQU 31H
DIS_COM EQU 32H
ADDS_PL EQU 33H
ADDS_PH EQU 34H
CGP EQU 35H
COUNT EQU 36H
COUNT1 EQU 37H
COLUMN EQU 38H
KEY_VALUE EQU 39H
PID1_TX0 EQU 3AH
COM_TX0 EQU 3BH
PID2_TX0 EQU 3CH
CHECK_TX0 EQU 3DH
COUNT_TX0 EQU 3EH
PID1_RX0 EQU 3FH
COM_RX0 EQU 40H
PID2_RX0 EQU 41H
CHECK_RX0 EQU 42H
CHECK1_RX0 EQU 43H
COUNT_RX0 EQU 44H
PHASE EQU 45H
P_LONG EQU 46H
PID0 EQU 47H
PID1 EQU 48H
GIF_PT EQU 49H
HOME_ADDH EQU 4AH
HOME_ADDL EQU 4BH
ZONE EQU 4CH
TEMP1 EQU 4DH
TEMP2 EQU 4EH
TEMP3 EQU 4FH
PID2 EQU 50H
FLAG_SEND EQU 51H
PID3 EQU 52H
PID4 EQU 53H
TCOUNT1 EQU 54H
TCOUNT2 EQU 55H
TCOUNT3 EQU 56H
TEMP_DPL EQU 57H
TEMP_DPH EQU 58H
UDR0 EQU 59H
STEP_DISP EQU 5AH
UDR1 EQU 5BH
CHECK_RX1 EQU 5CH
COUNT_RX1 EQU 5DH
PAME_PT EQU 5EH
;COUNT2 EQU 5FH
;80H~9FH:串口0发送缓冲区
;A0H~BFH:串口0接收缓冲区
;C0H~CFH:串口1接收缓冲区
;D0H~EFH:键盘输入缓冲区
;F0H~FFH:EEPROM读写缓冲区
SCL EQU 0B4H ;P3.4口为SCL
SDA EQU 0B5H ;P3.5口为SDA
WP EQU 0B3H ;P3.3口为写保护
;*****************************************
ORG 0000H
LJMP INITIAL
ORG 000BH
LJMP T0_OVR
ORG 0023H
LJMP SER0_IRQ
ORG 002BH
LJMP TIMER2_IRQ
ORG 003BH
LJMP SER1_IRQ
ORG 0043H
LJMP EXT_INT2
;*****************************************
;上电初始化
;*****************************************
ORG 0080H
INITIAL:
SETB P3.3 ;EEPROM写保护
MOV PMR,#41H ;4 CLOCKS PER MACHINE CYCLE, ENABLE THE ON-CHIP MOVX SRAM
CLR EWT
MOV SP,#5FH ;堆栈设置
INITIAL_IO:
MOV P0,#11111111B
MOV P1,#00010100B
MOV P2,#00011110B
MOV P3,#00101011B
INITAL_BIT:
MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
INITAL_TIMER:
MOV TMOD,#00100001B ;T0:MODE1 16位计数;T1:MODE2波特率发生器
MOV CKCON,#00010000B ;T0:OSC/12 T1:OSC/4 T2:OSC/12
MOV TH0,#0E2H ;10ms计时
MOV TL0,#00H
SETB TR0 ;开T0
SETB ET0 ;开T0中断
MOV TL1,#0F1H
MOV TH1,#0F1H
SETB TR1 ;开T1
MOV T2CON,#00000001B ;MODE:捕获 timer 外部不允许
MOV T2MOD,#00010000B ;INT2 auto clear enable
INITAL_UART:
MOV PCON,#80H ;SMOD0:1/16
MOV SCON,#01000000B ;串口0 MODE1 关接收
SETB 0DFH ;SMOD1:1/16
MOV SCON1,#01010000B ;串口1 MODE1 开接收
SETB ES1 ;开串口1中断
SETB EX2 ;开INT2
SETB EA ;开总中断
INITAL_MODUE: ;清SRAM
MOV DPS,#00H
MOV DPTR,#0000H
MOV A,#00H
MOV COUNT,#04H
MOV COUNT1,#00H
INITAL_RAM:
MOVX @DPTR,A
INC DPTR
DJNZ COUNT1,INITAL_RAM
DJNZ COUNT,INITAL_RAM
MOV TCOUNT1,#00H
MOV TCOUNT3,#00H
LCALL INI_LCD ;初始化LCD
INITAL_1161:
MOV ADDH_IIC,#04H
MOV ADDL_IIC,#00H
MOV LONG_IIC,#08H
SETB RS0
SETB RS1
MOV R0,#0F0H
LCALL IIC_RD
CLR RS0
CLR RS1
MOV R0,#0F0H
CJNE @R0,#0AAH,INITAL_1162
INC R0
CJNE @R0,#55H,INITAL_1162
INC R0
CJNE @R0,#05H,INITAL_1162
INC R0
CJNE @R0,#06H,INITAL_1162
INC R0
CJNE @R0,#07H,INITAL_1162
INC R0
CJNE @R0,#18H,INITAL_1162
INC R0
CJNE @R0,#29H,INITAL_1162
INC R0
CJNE @R0,#0CFH,INITAL_1162
SJMP MAIN
INITAL_1162:
SETB RS0
SETB RS1
MOV R0,#0F0H
MOV COUNT,#10H
INITAL_1163:
MOV @R0,#00H
INC R0
DJNZ COUNT,INITAL_1163
MOV ADDH_IIC,#00H
MOV ADDL_IIC,#00H
INITAL_1164:
MOV LONG_IIC,#10H
MOV R1,#0F0H
LCALL IIC_WR
MOV A,ADDL_IIC
ADD A,#10H
MOV ADDL_IIC,A
MOV A,ADDH_IIC
ADDC A,#00H
MOV ADDH_IIC,A
JNB ACC.2,INITAL_1164
MOV R0,#0F0H
MOV @R0,#0AAH
INC R0
MOV @R0,#55H
INC R0
MOV @R0,#05H
INC R0
MOV @R0,#06H
INC R0
MOV @R0,#07H
INC R0
MOV @R0,#18H
INC R0
MOV @R0,#29H
INC R0
MOV @R0,#0CFH
MOV LONG_IIC,#08H
MOV R1,#0F0H
LCALL IIC_WR
MAIN:
MOV ADDH_IIC,#00H
MOV ADDL_IIC,#00H
MOV LONG_IIC,#01H
SETB RS0
SETB RS1
MOV R0,#0F0H
LCALL IIC_RD
MOV R0,#0F0H
MOV ZONE,@R0
LCALL LOOK_M
MOV PHASE,#00H
MOV PID0,#00H
MOV PID3,#00H
; CLR 12H
; CLR 13H
; CLR 11H
MOV STEP_DISP,#00H
LCALL DISP_GA
MAIN1:
CPL SDA
LCALL MANAG
LCALL DO_RX1
LCALL DISP
LCALL READ_KEY
LCALL DO_KEY
SJMP MAIN1
; LCALL READ_KEY
; NOP
; NOP
; NOP
;*****************************************
;中断处理程序
;*****************************************
EXT_INT2:
SETB 14H
SETB 15H
MOV TCOUNT1,#00H
RETI
;*****************************************
T0_OVR:
PUSH PSW
PUSH A
MOV TH0,#0E2H ;10ms计时
INC TCOUNT2
INC TCOUNT3
MOV A,TCOUNT3
XRL A,#64H
JNZ T0_OVR1
MOV TCOUNT3,#00H
SETB 11H
T0_OVR1:
INC TCOUNT1
MOV A,TCOUNT1
XRL A,#70H
JNZ T0_OVR2
MOV TCOUNT1,#00H
SETB 14H
T0_OVR2:
POP A
POP PSW
RETI
;**************************************
TIMER2_IRQ:
CLR TF2
CLR TR2
CLR ET2
SETB 02H
RETI
;**************************************
SER0_IRQ:
PUSH PSW
PUSH A
JB RI,SER0_RX
JB TI,SER0_TXJ
LJMP SER0_END
SER0_TXJ:
LJMP SER0_TX
SER0_RX:
CLR RI
MOV UDR0,SBUF
JNB 04H,RX0_HOME
JNB 05H,RX0_PID1
JNB 06H,RX0_COM
JNB 07H,RX0_PID2
JNB 08H,RX0_LONG
JNB 09H,RX0_DATAJ
JNB 0AH,RX0_CHECKJ
RX0_ERRJ:
LJMP RX0_ERR
RX0_DATAJ:
LJMP RX0_DATA
RX0_CHECKJ:
LJMP RX0_CHECK
RX0_HOME:
MOV A,UDR0
CJNE A,#6CH,RX0_HOME1
SETB 0CH
SETB 04H
LJMP SER0_END
RX0_HOME1:
CJNE A,#5CH,RX0_HOME2
SETB 04H
LJMP SER0_END
RX0_HOME2:
CJNE A,#5EH,RX0_ERRJ
SETB 0FH
SETB 04H
LJMP SER0_END
RX0_PID1:
MOV A,UDR0
MOV CHECK_RX0,A
MOV PID1_RX0,A
SETB 05H
LJMP SER0_END
RX0_COM:
MOV A,CHECK_RX0
ADD A,UDR0
MOV CHECK_RX0,A
JB 0FH,RX0_CHECK1
MOV COM_RX0,UDR0
SETB 06H
LJMP SER0_END
RX0_CHECK1:
MOV CHECK1_RX0,UDR0
SETB 06H
SETB 07H
SETB 08H
SETB 09H
LJMP SER0_END
RX0_PID2:
MOV A,CHECK_RX0
ADD A,UDR0
MOV CHECK_RX0,A
MOV PID2_RX0,UDR0
SETB 07H
JB 0CH,RX0_6C
LJMP SER0_END
RX0_6C:
SETB 08H
SETB 09H
LJMP SER0_END
RX0_LONG:
MOV A,CHECK_RX0
ADD A,UDR0
MOV CHECK_RX0,A
MOV COUNT_RX0,UDR0
MOV A,UDR0
JZ RX0_LONG2
CJNE A,#20H,RX0_LONG1
RX0_LONG1:
JNC RX0_ERR
SETB RS0
CLR RS1
MOV R0,#0A0H
SETB 08H
LJMP SER0_END
RX0_LONG2:
SETB 08H
SETB 09H
LJMP SER0_END
RX0_DATA:
MOV A,CHECK_RX0
ADD A,UDR0
MOV CHECK_RX0,A
SETB RS0
CLR RS1
MOV @R0,UDR0
INC R0
DJNZ COUNT_RX0,SER0_END
SETB 09H
LJMP SER0_END
RX0_CHECK:
MOV A,CHECK_RX0
CJNE A,UDR0,RX0_ERR
SETB 0AH
CLR REN ;关RS0接收
LJMP SER0_END
RX0_ERR:
CLR 04H
CLR 05H
CLR 06H
CLR 07H
CLR 08H
CLR 09H
CLR 0AH
CLR 0CH
CLR 0FH
SETB 0BH
LJMP SER0_END
;-------------------------------
SER0_TX:
CLR TI
JNB 03H,SER0_END1
SETB RS0
CLR RS1
MOV SBUF,@R1
INC R1
DJNZ COUNT_TX0,SER0_END
CLR 03H
SER0_END:
POP A
POP PSW
RETI
SER0_END1:
CLR 0EH
SJMP SER0_END
;==========================================
SER1_IRQ:
PUSH PSW
PUSH A
JB RI1,SER1_RX
JB TI1,SER1_TX
SJMP SER1_END
SER1_RX:
CLR RI1
MOV UDR1,SBUF1
JNB 16H,RX1_HOME
JNB 17H,RX1_DATA
JNB 18H,RX1_CHECK
SJMP RX1_ERR
RX1_HOME:
MOV A,UDR1
CJNE A,#5CH,SER1_END
SETB 16H
MOV CHECK_RX1,#00H
CLR RS0
SETB RS1
MOV R0,#0C0H
SJMP SER1_END
RX1_DATA:
MOV A,CHECK_RX1
ADD A,UDR1
MOV CHECK_RX1,A
CLR RS0
SETB RS1
MOV @R0,UDR1
INC R0
MOV A,R0
CJNE A,#0C9H,SER1_END
SETB 17H
SJMP SER1_END
RX1_CHECK:
MOV A,CHECK_RX1
CJNE A,UDR1,RX1_ERR
SETB 18H
CLR REN_1 ;关RS1接收
CLR ES1 ;关RS1中断
SJMP SER1_END
RX1_ERR:
CLR 16H
CLR 17H
CLR 18H
SJMP SER1_END
;-------------------------------
SER1_TX:
CLR TI1
SER1_END:
POP A
POP PSW
RETI
;******************************************
;时间数据处理
;******************************************
DO_RX1:
JNB 18H,DO_RX11
CLR 16H
CLR 17H
CLR 18H
CLR RS0
CLR RS1
MOV R0,#0C0H
MOV STAU1,@R0
INC R0
MOV STAU2,@R0
INC R0
MOV STAU_GPS,@R0
INC R0
MOV YEARL,@R0
INC R0
MOV MONTH,@R0
INC R0
MOV DATE,@R0
INC R0
MOV HOUR,@R0
INC R0
MOV MINUTE,@R0
INC R0
MOV SECOND,@R0
SETB REN_1 ;开RS1接收
SETB ES1 ;开RS1中断
ACALL CHGB_UB
DO_RX11:
RET
;=======================================
CHGB_UB:
MOV A,ZONE
JB ACC.4,SUB_HOUR
ADD_HOUR:
ANL A,#0FH
ADD A,HOUR
MOV HOUR,A
CLR C
SUBB A,#24
JNC INC_DATE
RET
INC_DATE:
MOV HOUR,A
INC DATE
ACALL GET_DATE
MOV A,DATE
CLR C
SUBB A,B
JNC INC_MONTH
RET
INC_MONTH:
MOV DATE,#01H
INC MONTH
MOV A,MONTH
CLR C
SUBB A,#13
JNC INC_YEARL
RET
INC_YEARL:
MOV MONTH,#01H
INC YEARL
MOV A,YEARL
CLR C
SUBB A,#100
JC INC_YEARL1
MOV YEARL,#00H
INC_YEARL1:
RET
SUB_HOUR:
ANL A,#0FH
XCH A,HOUR
CLR C
SUBB A,HOUR
MOV HOUR,A
JC DEC_DATE
RET
DEC_DATE:
CLR C
SUBB A,#232
MOV HOUR,A
DEC DATE
MOV A,DATE
JZ DEC_MONTH
RET
DEC_MONTH:
DEC MONTH
MOV A,MONTH
JZ DEC_YEARL
DEC_MONTH1:
ACALL GET_DATE
DEC B
MOV DATE,B
RET
DEC_YEARL:
MOV MONTH,#12
MOV A,YEARL
CLR C
SUBB A,#01H
MOV YEARL,A
JNC DEC_MONTH1
MOV YEARL,#99
SJMP DEC_MONTH1
;================================
GET_DATE:
MOV A,MONTH
CJNE A,#2,GET_DATE2
MOV A,YEARL
ANL A,#03H
JZ GET_DATE1
MOV B,#29
RET
GET_DATE1:
MOV B,#30
RET
GET_DATE2:
JB ACC.3,GET_DATE3
MOV B,#31
JNB ACC.0,GET_DATE21
MOV B,#32
GET_DATE21:
RET
GET_DATE3:
MOV B,#31
JB ACC.0,GET_DATE31
MOV B,#32
GET_DATE31:
RET
;******************************************
;键盘扫描程序
;******************************************
READ_KEY:
MOV KEY_VALUE,#00H
JB 01H,READ_KEY2
CLR P1.6
CLR P1.7
CLR P3.2
CLR P3.6
CLR P3.7
SETB P1.0
SETB P1.1
SETB P1.3
SETB P1.5
MOV COLUMN,#00H
JNB P1.0,READ_KEY1
MOV COLUMN,#01H
JNB P1.1,READ_KEY1
MOV COLUMN,#02H
JNB P1.3,READ_KEY1
MOV COLUMN,#03H
JNB P1.5,READ_KEY1
JB 00H,READ_KEY11
RET
READ_KEY1:
JNB 00H,READ_KEY11
RET
READ_KEY11:
MOV TH2,#0C4H ;启动20ms计时
MOV TL2,#00H
CLR 02H ;清20ms计时到标志
SETB TR2 ;开TIMER2
SETB ET2 ;开timer2中断
SETB EA ;开总中断
SETB 01H ;置等待20ms计时标志
RET
READ_KEY2:
JB 02H,READ_KEY21
RET
READ_KEY21:
CLR 02H
CLR 01H
JB 00H,READ_KEY3
SETB P1.6
SETB P1.7
SETB P3.2
SETB P3.6
SETB P3.7
SETB P1.0
SETB P1.1
SETB P1.3
SETB P1.5
MOV A,COLUMN
JZ READ_KEY22
DEC A
JZ READ_KEY23
DEC A
JZ READ_KEY24
DEC A
JZ READ_KEY25
READ_KEY22:
CLR P1.0
SJMP READ_KEY26
READ_KEY23:
CLR P1.1
SJMP READ_KEY26
READ_KEY24:
CLR P1.3
SJMP READ_KEY26
READ_KEY25:
CLR P1.5
READ_KEY26:
NOP
MOV A,#80H
JNB P1.6,READ_KEY27
MOV A,#84H
JNB P1.7,READ_KEY27
MOV A,#88H
JNB P3.2,READ_KEY27
MOV A,#8CH
JNB P3.6,READ_KEY27
MOV A,#90H
JNB P3.7,READ_KEY27
RET
READ_KEY27:
ORL A,COLUMN
MOV KEY_VALUE,A
SETB 00H
RET
READ_KEY3:
CLR P1.6
CLR P1.7
CLR P3.2
CLR P3.6
CLR P3.7
SETB P1.0
SETB P1.1
SETB P1.3
SETB P1.5
JNB P1.0,READ_KEY31
JNB P1.1,READ_KEY31
JNB P1.3,READ_KEY31
JNB P1.5,READ_KEY31
CLR 00H
READ_KEY31:
RET
;******************************************
;键盘处理程序
;******************************************
KEY_ZHENGJ:
LJMP KEY_ZHENG
KEY_FUJ:
LJMP KEY_FU
KEY_ZUOJ:
LJMP KEY_ZUO
KEY_YOUJ:
LJMP KEY_YOU
KEY_SHANGJ:
LJMP KEY_SHANG
KEY_XIAJ:
LJMP KEY_XIA
KEY_XIANSJ:
LJMP KEY_XIANS
KEY_CAIDJ:
LJMP KEY_CAID
KEY_QUERJ:
LJMP KEY_QUER
KEY_SHEZIJ:
LJMP KEY_SHEZHI
DO_KEY:
MOV A,KEY_VALUE
JZ DO_KEY1
XRL A,#80H
JZ KEY_ZHI1 ;1
MOV A,KEY_VALUE
XRL A,#81H
JZ KEY_ZHI2 ;2
MOV A,KEY_VALUE
XRL A,#82H
JZ KEY_ZHI3 ;3
MOV A,KEY_VALUE
XRL A,#84H
JZ KEY_ZHI4 ;4
MOV A,KEY_VALUE
XRL A,#85H
JZ KEY_ZHI5 ;5
MOV A,KEY_VALUE
XRL A,#86H
JZ KEY_ZHI6 ;6
MOV A,KEY_VALUE
XRL A,#88H
JZ KEY_ZHI7 ;7
MOV A,KEY_VALUE
XRL A,#89H
JZ KEY_ZHI8 ;8
MOV A,KEY_VALUE
XRL A,#8AH
JZ KEY_ZHI9 ;9
MOV A,KEY_VALUE
XRL A,#8DH
JZ KEY_ZHI0 ;0
MOV A,KEY_VALUE
XRL A,#8CH
JZ KEY_ZHENGJ ;+
MOV A,KEY_VALUE
XRL A,#8EH
JZ KEY_FUJ ;-
MOV A,KEY_VALUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -