📄 sjj.asm
字号:
/*液晶控制引脚*/
RS BIT P3.7
RW BIT P3.6
E BIT P3.5
/*语音芯片ISD2560控制引脚*/
ISD_CE BIT P3.2
ISD_PD BIT P3.3
ISD_PR BIT P2.0
/*系统按键*/
FLAG_UP BIT P2.3
FLAG_DOWN BIT P2.4
FLAG_STOP BIT P2.5
FLAG_HALF BIT P2.7
/*24C02控制引脚*/
I2C_SDA BIT P2.2
I2C_SCL BIT P2.1
FLAGUP BIT 00H
FLAGDOWN BIT 01H
FLAGHALF BIT 02H
GETTOP BIT 03H
GETBOTTOM BIT 04H
SEC DATA 35H ; 秒存放单元(BCD码)
SECD DATA 36H ; 0.05秒存放单元(BCD码)
ORG 0000H
AJMP MAIN
;ORG 000BH
;LJMP TIMER0 ;定时器T0中断,负脉冲时计圈数
ORG 001BH
LJMP TIMER1 ;定时器T1中断,定时1ms
ORG 0050H
MAIN:MOV SP, #70H
LCALL INITIAL
LCALL CLS
CLR FLAGUP
CLR FLAGDOWN
CLR FLAGHALF
CLR GETTOP
CLR GETBOTTOM
MOV SEC,#0 ;0秒
MOV SECD,#0 ;0.00秒
MOV TMOD,#15H
MOV TH1,#0H
MOV TL1,#0H
MOV TH0,#0H
MOV TL0,#0H
MOV TH1,#3CH ;定时初值(50ms,12MHz晶体)
MOV TL1,#0B0H
MOV TH0,#0FFH
MOV TL0,#23H
CLR TF0
MOV DPTR,#LINE0
MOV A,#80H
LCALL WRITE_COM
LCALL DISLINE
MOV DPTR,#LINE1
MOV A,#0C0H
LCALL WRITE_COM
LCALL DISLINE
SETB ISD_CE
SETB ISD_PD
SETB ISD_PR
/*判断按键*/
key: jnb FLAG_UP,up
jnb FLAG_DOWN,down
jnb FLAG_STOP,GOSTOP
jnb FLAG_HALF,HALF
SJMP KEY
GOSTOP: LJMP STOP
/*国旗上升按键*/
up: lcall keycheck
jb FLAG_UP,key
JB GETTOP,KEY
;SETB TR0
;SETB TR1 ;启动定时器T1
;SETB ET1 ;允许定时器T1中断
;SETB EA ;开放中断
CLR GETBOTTOM
CLR FLAGHALF
LCALL CLS
MOV DPTR,#LINE2
MOV A,#10000000B
LCALL WRITE_COM
LCALL DISLINE
SETB ISD_PR
CLR ISD_PD
CLR ISD_CE
lcall djuping
lcall key
/*国旗下降按键*/
down: lcall keycheck
jb FLAG_DOWN,key
JB GETBOTTOM,KEY
JB FLAGHALF,HALFDOWN
CLR GETTOP
CLR FLAGHALF
LCALL CLS
MOV DPTR,#LINE3
MOV A,#10000000B
LCALL WRITE_COM
LCALL DISLINE
lcall djdowning
lcall key
/*半旗状态*/
HALF: LCALL KEYCHECK
JB FLAG_HALF,KEY
SETB FLAGHALF
CLR GETTOP
CLR GETBOTTOM
SETB ISD_CE
SETB ISD_PD
LCALL CLS
MOV DPTR,#LINE5
MOV A,#10000000B
LCALL WRITE_COM
LCALL DISLINE
SETB ISD_PR
CLR ISD_PD
CLR ISD_CE
LCALL DJUPING
MOV R4,#10
LCALL KEEPDOWN2
CLR GETTOP
CLR GETBOTTOM
LJMP KEY
HALFDOWN:mov r4,#10
HALFUP2:mov r3,#50
HALFUP: MOV P1,#01H
LCALL DEL
MOV P1,#08H
LCALL DEL
MOV P1,#02H
LCALL DEL
MOV P1,#04H
LCALL DEL
MOV R0,#0C0H
MOV A,R0
LCALL WRITE_COM
MOV R1,SEC
LCALL WRITESEC
djnz r3,HALFUP
djnz r4,HALFUP2
setb gettop
LCALL DJDOWNING
LJMP KEY
/*国旗停止按键*/
stop: lcall keycheck
jb FLAG_STOP,KEYBACK
CLR TR0
CLR TR1
CLR TF1
MOV SEC,#0 ;0秒
MOV SECD,#0 ;0.00秒
LCALL CLS
MOV DPTR,#LINE4
MOV A,#10000000B
LCALL WRITE_COM
LCALL DISLINE
lcall djstop
KEYBACK: lcall key
/*
RECORD: lcall keycheck
jb P2.7,key
CLR ISD_PR
CLR ISD_PD
CLR ISD_CE
; JMP $
RET
*/
/*按键消抖*/
keycheck: MOV R7,#10
D2: MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
ret
/*国旗上升处理子程序*/
djuping:jnb FLAG_DOWN,GODOWN
jnb FLAG_STOP,stop
SETB TR1 ;启动定时器T1
SETB ET1 ;允许定时器T1中断
SETB EA ;开放中断
mov r4,#30
keepup2:mov r3,#50
KEEPUP: MOV P1,#01H
LCALL DEL
MOV P1,#08H
LCALL DEL
MOV P1,#02H
LCALL DEL
MOV P1,#04H
LCALL DEL
MOV R0,#0C0H
MOV A,R0
LCALL WRITE_COM
MOV R1,SEC
LCALL WRITESEC
;JMP djuping
djnz r3,keepup
djnz r4,keepup2
setb gettop
ret
/*国旗下降处理子程序*/
DJDOWNING:jnb FLAG_UP,back_up
jnb FLAG_STOP,BACK_STOP
mov r4,#30
keepdown2:mov r3,#50
KEEPDOWN: MOV P1,#01H
LCALL DEL
MOV P1,#04H
LCALL DEL
MOV P1,#02H
LCALL DEL
MOV P1,#08H
LCALL DEL
djnz r3,keepdown
djnz r4,keepdown2
setb getbottom
ret
BACK_UP: lcall up
ret
BACK_STOP:LCALL STOP
RET
GODOWN: LCALL DOWN
RET
/*国旗停止处理子程序*/
DJSTOP: mov p1,#00h
CLR TR1
CLR EA
CLR TR0
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TH0,#0FFH
MOV TL0,#23H
ret
; ljmp key
WRITESEC: INC R0
MOV A,R0
LCALL WRITE_COM
MOV A,R1
ANL A,#0F0H
SWAP A
ADD A,#30H
LCALL WRITE_DATA
INC R0
MOV A,R0
LCALL WRITE_COM
MOV A,R1
ANL A,#0FH
ADD A,#30H
LCALL WRITE_DATA
RET
TIMER1: ORL TL1,#0B0H ;重置定时器时常数
MOV TH1,#3CH
PUSH ACC ;保护现场
PUSH PSW
MOV A,SECD
ADD A,#1 ;加0.05秒
DA A
MOV SECD,A
CJNE A,#20H,CLKEE
MOV SECD,#0
MOV A,SEC ;调整秒
ADD A,#1
DA A
MOV SEC,A
CLKEE: POP PSW
POP ACC
RETI
/*液晶显示字符、数字*/
DIS: LCALL WRITE_COM ;液晶显示
PUSH ACC
MOV A,@R1
LCALL WRITE_DATA
POP ACC
INC A
INC R1
DJNZ R2,DIS
RET
/*液晶显示字符串*/
DISLINE: PUSH ACC
DISL_LOOP: CLR A
MOVC A,@A+DPTR
JZ END_DISL
LCALL WRITE_DATA
INC DPTR
SJMP DISL_LOOP
END_DISL: POP ACC
RET
LINE0: DB "SYSTEM IS READY,",00H
LINE1: DB "MAKE A CHOICE:" ,00H
LINE2: DB "FLAG IS RISEING!",00H
LINE3: DB "FLAG IS DOWNING!",00H
LINE4: DB "FLAG IS STOPPED!",00H
LINE5: DB "HALF POSITION!" ,00H
/*液晶显示初始化*/
INITIAL: MOV A,#00111000B
LCALL WRITE_COM
MOV A,#00001110B
LCALL WRITE_COM
MOV A,#00000110B
LCALL WRITE_COM
RET
/*液晶显示忙检查*/
CHECK_BUSY:PUSH ACC
PUSH PSW
BUSY_LOOP: CLR E
SETB RW
CLR RS
SETB E
MOV A,P0
CLR E
JB ACC.7,BUSY_LOOP
POP PSW
POP ACC
LCALL DISDEL
RET
/*液晶显示写控制字*/
WRITE_COM: LCALL CHECK_BUSY
CLR E
CLR RS
CLR RW
SETB E
MOV P0,A
CLR E
RET
/*液晶显示写数据*/
WRITE_DATA: LCALL CHECK_BUSY
CLR E
SETB RS
CLR RW
SETB E
MOV P0,A
CLR E
RET
/*液晶显示清屏*/
CLS: MOV A,#00000001B
LCALL WRITE_COM
RET
/*液晶显示延时*/
DISDEL: MOV R6,#5
LL1: MOV R7,#255
DJNZ R7,$
DJNZ R6,LL1
RET
/*步进电机转动延时*/
DEL: MOV R6,#8
LL2: MOV R7,#255
DJNZ R7,$
DJNZ R6,LL1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -