📄 pm521.asm
字号:
ORG 0000H
STAR:LJMP MAIN
ORG 0003H
LJMP ITP0 ;INT0中断
ORG 000BH
LJMP TIM0 ;T0中断
ORG 0013H
LJMP PKEY ;INT1中断
;**************************
ORG 0030H
MAIN:MOV SP,#0C0H ;堆栈
MOV P1,#0E3H ;P1='11100011','000'三个LED灭
LCALL DELY
LCALL DELY
LCALL DELY
LCALL LCDF
MOV DPTR,#TAB0
MOV CNTZ,#16
MOV A,#90H ;'胶带跑偏报警系统'(L2),10010000,设定10H到地址计数器AC
LCALL SENC
LCALL DSCL
MOV DPTR,#TAB1
MOV CNTZ,#16
MOV A,#98H ;'江苏中显机械公司'(L3),10011000,设定18H到地址计数器AC
LCALL SENC
LCALL DSCL
MOV R0,#08H
MOV B,#0F8H
CLR A
MLP1:MOV @R0,A ;清内部RAM区
INC R0
DJNZ B,MLP1
MOV DPTR,#8001H ;8279初始化,8000H数据,8001H命令
MOV A,#0D1H ;11010001,显示RAM所有单元清零
MOVX @DPTR,A
MLP2:MOVX A,@DPTR
JB ACC.7,MLP2 ;等DU=0,即清除操作完成,需时约160us
MOV A,#00H ;8279初始化,编码扫描,键盘输入,两键互锁
MOVX @DPTR,A
MOV A,#34H ;00110100,扫描频率为外部时钟20分频
MOVX @DPTR,A
MOV DPTR,#0100H
MOV A,#0FFH
MOV R7,#0FFH
MLP3:MOVX @DPTR,A ;清外部RAM区(0FFH),清除256B外部RAM????
INC DPTR
DJNZ R7,MLP3
MOV TMOD,#21H ;定时器初始化,00100001,T1方式2波特率发生器,T0方式1,16位定时
MOV TH0,#4CH ;T0定时50MS
MOV TL0,#00H
MOV PCON,#00H ;串口初始化
MOV SCON,#50H ;01010000,串口方式1,接受允许
MOV TH1,#0FDH ;波特率9600
MOV TL1,#0FDH
MOV DPTR,#8201H ;8251初始化,8200H数据口,8201H命令口
MOV A,#4EH ;方式选择:01001110,两个同步字符,外同步,无奇偶校验,字符长8位,波特率系数*16
MOVX @DPTR,A
MOV A,#15H ;命令指令:00010101,错误标志复位,正常工作接受允许,数据终端准备好,发送允许
MOVX @DPTR,A
MOV CNT0,#00 ;T0中断次数计数器
SETB IT0 ;T0 T1下降沿有效
SETB IT1
SETB EX0 ;开放INT0 INT1 SIO中断
SETB EX1
SETB EA
SETB TR1 ;启动T1工作
;************************************************************
KEYS:MOV BUFK,#80H ;清除键值缓冲单元(BUFK键值缓冲单元)
MAN1:JNB 07H,KEYW ;尚未运行,转判键
MAN2:JNB 02H,MAN3 ;判访问下位机标志
CLR 02H
LCALL XCAL ;访问下位机,显示下位机信息
JNB 03H,MAN3 ;无问题标志,转
CLR 03H
LCALL SAVE ;有问题,存相应数据(时间、位置、状态)
LCALL SEPC ;向上位PC发
JNB 08H,MAN3
CLR 07H ;强停机,清运行标志
CLR 0FH
SETB P1.4 ;红灯亮
MOV DPTR,#TABP
MOV CNTZ,#16
MOV A,#80H ;'**系统暂停工作**'(L1)
LCALL SENC
LCALL DSCL
LCALL SSSS ;显示强停机的信息
SJMP KEYS
MAN3:JNB 10H,KEYW ;判秒标志
CLR 10H
JB 0FH,KEYW ;查询时,显示的是故障时间
LCALL TINC ;修改显示时间
KEYW:MOV A,BUFK ;判键
JNB ACC.7,KYON ;有键按下(ACC.7='0')转
SJMP MAN1 ;无键盘按下等待
KYON:MOV B,#03H
MOV DPTR,#KPRG
MUL AB
JMP @A+DPTR
KPRG:LJMP KEY0
LJMP KEY1
LJMP KEY2
LJMP KEY3
LJMP KEY4
LJMP KEY5
LJMP KEY6
LJMP KEY7
LJMP KEY8
LJMP KEY9
LJMP KEYA
LJMP KEYB
LJMP KEYC
LJMP KEYD
LJMP KEYE
LJMP KEYF
KEY0:MOV BFDA,#00H ;保存输入的数字
LJMP PKDA
KEY1:MOV BFDA,#01H
LJMP PKDA
KEY2:MOV BFDA,#02H
LJMP PKDA
KEY3:MOV BFDA,#03H
LJMP PKDA
KEY4:MOV BFDA,#04H
LJMP PKDA
KEY5:MOV BFDA,#05H
LJMP PKDA
KEY6:MOV BFDA,#06H
LJMP PKDA
KEY7:MOV BFDA,#07H
LJMP PKDA
KEY8:MOV BFDA,#08H
LJMP PKDA
KEY9:MOV BFDA,#09H
LJMP PKDA
KEYA:LCALL STOP ;停机键处理子程序
LJMP KEYS
KEYB:LCALL KRUN ;运行键处理子程序
LJMP KEYS
KEYC:LCALL KSET ;参数设置键处理子程序
LJMP KEYS
KEYD:LCALL ENTR ;参数确认键处理子程序
LJMP KEYS
KEYE:LCALL SECH ;查询键处理子程序(乒乓功能)
LJMP KEYS
KEYF:LCALL SDEC ;查询地址减处理
LJMP KEYS
;**********************
PKDA:JB 07H,EPKD ;运行状态,数字键无效
JB 0FH,EPKD ;查询状态,数字键无效
JB 11H,PAD0
JB 12H,PAD0
JB 13H,PAD0
EPKD:LJMP KEYS ;非参数设置状态,数字键无效
PAD0:MOV A,#30H
ADD A,BFDA ;数字-->ASCII-->显示缓冲单元
MOV DADP,A
JNB 11H,PAD1 ;时间设置标志11H='1'
LCALL KDL1 ;时间设置数字输入处理
LJMP KEYS
PAD1:JNB 12H,PAD2 ;下位机数目设置标志12H='1'
LCALL KDL2 ;下位机数目设置数字输入处理
LJMP KEYS
PAD2:JNB 13H,EPKD ;速度设置标志13H='1'
LCALL KDL3 ;速度设置数字输入处理
LJMP KEYS
NOP
NOP
NOP
SDDY:MOV A,BFDA
MOV @R0,A ;保存数字(在工作区WOK2)
INC R0
MOV A,DADP ;数字(ASCII码)送显示
LCALL SEND
RET
NOP
NOP
NOP
KDL1:INC CONT ;数字输入计数器+1
MOV A,CONT ;时间设置(12个数字)
CJNE A,#01H,KD10
MOV A,#89H ;第一个显示位置(L3.3) '--01年01月01日--'
LCALL SENC ;10001001,设定09H到地址计数器AC
LCALL SDDY ;保存1#数字并送显示
LJMP EKD1
KD10:CJNE A,#02H,KD11
LCALL SDDY ;保存2#数字并送显示
MOV A,#8BH ;第二个显示位置(L3.7)
LCALL SENC ;10001011,设定0BH到地址计数器AC
LJMP EKD1
KD11:CJNE A,#03H,KD12
LCALL SDDY ;保存3#数字并送显示
LJMP EKD1
KD12:CJNE A,#04H,KD13
LCALL SDDY ;保存4#数字并送显示
MOV A,#8DH ;第三个显示位置(L3.11)
LCALL SENC
LJMP EKD1
KD13:CJNE A,#05H,KD14
LCALL SDDY ;保存5#数字并送显示
LJMP EKD1
KD14:CJNE A,#06H,KD15
LCALL SDDY ;保存6#数字并送显示
MOV A,#99H ;第四个显示位置(L4.3)'--01时01分01秒--'
LCALL SENC
LJMP EKD1
KD15:CJNE A,#07H,KD16
LCALL SDDY ;保存7#数字并送显示
LJMP EKD1
KD16:CJNE A,#08H,KD17
LCALL SDDY ;保存8#数字并送显示
MOV A,#9BH ;第五个显示位置(L4.7)
LCALL SENC
LJMP EKD1
KD17:CJNE A,#09H,KD18
LCALL SDDY ;保存9#数字并送显示
LJMP EKD1
KD18:CJNE A,#0AH,KD19
LCALL SDDY ;保存10#数字并送显示
MOV A,#9DH ;第五个显示位置(L4.7)
LCALL SENC
LJMP EKD1
KD19:CJNE A,#0BH,KD1A
LCALL SDDY ;保存11#数字并送显示
LJMP EKD1
KD1A:CJNE A,#0CH,EKD1
LCALL SDDY ;保存12#数字并送显示
MOV A,#89H ;显示位置重新返回(L3.3)
LCALL SENC
MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
EKD1:RET
NOP
NOP
NOP
KDL2:INC CONT ;数字输入计数器+1
MOV A,CONT ;数目设置(3个数字)
CJNE A,#01H,KD20
MOV A,#8AH ;第一个显示位置(L3.5)
LCALL SENC
LCALL SDDY ;保存1#数字并送显示
LJMP EKD2
KD20:CJNE A,#02H,KD21
LCALL SDDY ;保存2#数字并送显示
MOV A,#8BH ;第二个显示位置(L3.7)
LCALL SENC
LJMP EKD2
KD21:CJNE A,#03H,EKD2
LCALL SDDY ;保存3#数字并送显示
MOV A,#8AH ;回到1#位置
LCALL SENC
MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
EKD2:RET
NOP
NOP
NOP
KDL3:MOV A,#8AH ;速度设置(1个数字)
LCALL SENC
MOV A,BFDA ;保存数字并送显示
MOV WOK2,A
MOV A,DADP
LCALL SEND
MOV A,#8AH ;回到1#位置
LCALL SENC
RET
NOP
NOP
NOP
DSCL:CLR A ;将ROM内容直接送显示
MOVC A,@A+DPTR ;内容(DPTR),字节数(CNTZ)
LCALL SEND
INC DPTR
DJNZ CNTZ,DSCL
RET
NOP
NOP
NOP
KSET:JB 01H,SET1 ;有手动停机标志,直接进入设置
JB 07H,ESET
JB 0FH,ESET ;运行或查询时本键无效
SET1:MOV A,#01H ;清屏
LCALL SENC
MOV DPTR,#TABS
MOV CNTZ,#16
MOV A,#80H ;显示'**系统参数设置**'(L1)
LCALL SENC
LCALL DSCL
MOV DPTR,#TAB2
MOV CNTZ,#16
MOV A,#90H ;'请输入当前时间: '(L2)
LCALL SENC
LCALL DSCL
CLR A
MOV R0,#WOK2 ;工作区充零
MOV B,#16
SETL:MOV @R0,A
INC R0
DJNZ B,SETL
MOV DPTR,#TAB3 ;显示预置时间
MOV CNTZ,#16
MOV A,#88H ;' 00年00月00日 '(L3)
LCALL SENC
LCALL DSCL
MOV DPTR,#TAB4
MOV CNTZ,#16
MOV A,#98H ;' 00时00分00秒 '(L4)
LCALL SENC
LCALL DSCL
MOV A,#89H ;在**年位置上数字反白闪烁
LCALL SENC
MOV A,#0DH
LCALL SENC
MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
SETB 11H ;置时间设置标志
ESET:RET
NOP
NOP
NOP
ENTR:JB 07H,EENT ;参数确认键处理子程序
JB 0FH,EENT ;运行或查询时,本键无效
JB 11H,ENT0
SJMP ENT1
ENT0:LCALL STIM ;时间设置确认
SJMP EENT
ENT1:JB 12H,ENT2
SJMP ENT3
ENT2:LCALL SNUM ;下位机数目设置确认
SJMP EENT
ENT3:JB 13H,ENT4
SJMP EENT
ENT4:LCALL SSPD ;速度设置确认
EENT:RET
NOP
NOP
NOP
DBCD:MOV A,@R0 ;二字节BCD-->单字节二进制数
MOV B,#10 ;(R0)-->R2,BCD高位在前
MUL AB
INC R0
ADD A,@R0
MOV R2,A
RET
NOP
NOP
NOP
STIM:MOV R0,#WOK2 ;判时间设置是否正确
LCALL DBCD
MOV A,R2
MOV R7,A ;设置的年(BCD)-->R7(二进制数)
MOV B,#04 ;判闰年
DIV AB
MOV A,B
JZ STM0
CLR 0EH ;清闰年标志
SJMP STM1
STM0:SETB 0EH ;置闰年标志0EH='1'
STM1:INC R0 ;指向月
LCALL DBCD
MOV A,R2
JNZ STM2
LJMP ERTM ;月设置值='0',错
STM2:CLR C
SUBB A,#13
JC STM3
LJMP ERTM ;月设置值>12,错
STM3:MOV A,R2
MOV R6,A ;月(BCD)-->R6(二进制数)
INC R0 ;指向日
LCALL DBCD
MOV A,R2
MOV R5,A ;日(BCD)-->R5(二进制数)
MOV A,R6 ;判月份
CLR C
SUBB A,#08
JNC STM8 ;>=8月份,转STM8
MOV A,R6
CJNE A,#02,STM5 ;<8月份,但不是2月份,转STM5
JB 0EH,STM4 ;闰年2月份,转STM4
MOV A,R5
CLR C
SUBB A,#29
JC STM9
LJMP ERTM ;非闰年2月份,日设置值>28,错
STM4:MOV A,R5
CLR C
SUBB A,#30
JC STM9
LJMP ERTM ;闰年2月份,日设置值>29,错
STM5:MOV A,R6 ;<8月份
RRC A
JNC STM7 ;<8月份的双月(30天)
STM6:MOV A,R5 ;<8月份的单月(31天)
CLR C
SUBB A,#32
JC STM9
LJMP ERTM ;日设置值>31,错
STM7:MOV A,R5
CLR C
SUBB A,#31
JC STM9
LJMP ERTM ;日设置值>30,错
STM8:MOV A,R6 ;>=8月份
RRC A
JNC STM6 ;>=8月份的双月(31天)
SJMP STM7 ;>=8月份的单月(30天)
STM9:INC R0 ;指向时
LCALL DBCD
MOV A,R2
MOV R4,A ;时(BCD)-->R4(二进制数)
CLR C
SUBB A,#24
JC STMA
LJMP ERTM ;时设置值>=24,错
STMA:INC R0 ;指向分
LCALL DBCD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -