📄 shi.asm
字号:
TIMEOVER EQU 100
MENU EQU P3.1
INCK EQU P3.2
DECK EQU P3.3
ESC EQU P3.4 ;按键号
RS EQU P3.5;确定具体硬件的连接方式
RW EQU P3.6;确定具体硬件的连接方式
E EQU P3.7 ;确定具体硬件的连接方式
SHUJU EQU P0
TIMECON DATA 2DH
POINT1 DATA 2EH
POINT DATA 2FH
SEC DATA 30H
MIN DATA 31H
HOUR DATA 32H
DAY DATA 33H
MON DATA 34H
YEAR DATA 35H
XIN DATA 36H
NO DATA 37H
RAMP EQU 38H
JINWEI BIT 00H
ERYUE BIT 01H
LEAP BIT 02H
DAYUEB BIT 03H
XIAOYUE BIT 04H
KEYTIME BIT 05H
TIMESTOP BIT 06H
TIMEUP BIT 07H
ORG 0000H
LJMP MAIN
ORG 002BH
LJMP CTC2
ORG 0030H
PROC MAIN
MAIN:
MOV SP,#07FH
MOV R0,#1
RAMLOOP:
MOV @R0,#0
INC R0
CJNE R0,#00,RAMLOOP
MOV TIMECON,#TIMEOVER
MOV DAY,#05
MOV MON,#06
MOV YEAR,#08
MOV XIN,#04
MOV TH2,#0D8H
MOV TL2,#0F0H
MOV RCAP2H,#0D8H
MOV RCAP2L,#0F0H
MOV T2CON,#04H
SETB ET2
SETB EA
MOV SHUJU,#01H ;清屏并光标复位
LCALL ENABLE ;调用写入命令子程序
MOV SHUJU,#38H ;设置显示模式:8位2行5x7点阵
LCALL ENABLE ;调用写入命令子程序
MOV SHUJU,#0CH ;显示器开、光标关、光标不闪烁
LCALL ENABLE ;调用写入命令子程序
MOV SHUJU,#06H ;文字不动,光标自动右移
LCALL ENABLE ;调用写入命令子程序
MOV SHUJU,#80H;写入显示起始地址(第1行第一个位置)
LCALL ENABLE;调用写入命令子程序
MOV DPTR,#TAB
MOV R1,#16
MOV R0,#16
WWW1:
MOV A,R1
LCALL WWRITE
INC R1
DJNZ R0,WWW1
MOV SHUJU,#0C0H;写入显示起始地址
LCALL ENABLE;调用写入命令子程序
MOV R0,#16
MOV R1,#32
WWW2:
MOV A,R1
LCALL WWRITE
INC R1
DJNZ R0,WWW2
LOOP:
JB KEYTIME,KEY1
JB TIMEUP,TIME1
JMP LOOP
KEY1:
LCALL KEY
JMP LOOP
TIME1:
CLR TIMEUP
LCALL TIME
JMP LOOP
TAB:DB"0123456789 "
DB"2008_06_05 4 ^_^"
DB"00:00:00 "
DB"NO.00 00:00 Save"
END
;**************************************************************************
PROC TIME
TIME:
INC SEC
MOV A,SEC
CJNE A,#60,N1
N1:
JC SECOUT
MOV SEC,#0
INC MIN
SETB JINWEI
SECOUT:
MOV A,POINT
JNZ PP1
MOV A,SEC
MOV B,#10
DIV AB
MOV SHUJU,#0C6H;写入显示起始地址
LCALL ENABLE;调用写入命令子程序
LCALL WWRITE
MOV SHUJU,#0C7H
LCALL ENABLE
MOV A,B
LCALL WWRITE
PP1:
JB JINWEI,MININ
RET
MININ:
CLR JINWEI
MOV A,MIN
CJNE A,#60,N2
N2:
JC MINOUT
MOV MIN,#0
INC HOUR
SETB JINWEI
MINOUT:
MOV A,POINT
JNZ PP2
MOV A,MIN
MOV B,#10
DIV AB
MOV SHUJU,#0C3H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#0C4H
LCALL ENABLE
MOV A,B
LCALL WWRITE
PP2:
JB JINWEI,HOURIN
RET
HOURIN:
CLR JINWEI
MOV A,HOUR
CJNE A,#24,N3
N3:
JC HOUROUT
MOV HOUR,#0
INC XIN
SETB JINWEI
HOUROUT:
MOV A,POINT
JNZ PP3
MOV A,HOUR
MOV B,#10
DIV AB
MOV SHUJU,#0C0H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#0C1H
LCALL ENABLE
MOV A,B
LCALL WWRITE
PP3:
JB JINWEI,XININ
RET
XININ:
CLR JINWEI
MOV A,XIN
CJNE A,#7,N4
N4:
JC XINOUT
MOV XIN,#0
XINOUT:
INC DAY
MOV A,POINT
JNZ DAYINC
MOV A,XIN
MOV SHUJU,#8BH;写入显示起始地址
LCALL ENABLE;调用写入命令子程序
LCALL WWRITE
DAYINC:
MOV A, MON
CJNE A,#8,QQ1
QQ1:
JC QQ2
RRC A
JNC DAYUE
JMP QQ3
QQ2:
MOV A,MON
RRC A
JC DAYUE ;大月
QQ3:
MOV A,MON
CJNE A,#2,QITA ;不是二月份
MOV A,YEAR
RR A
RRC A
JC NOTLEAP ;不被4整除的100年内不是闰年
SETB LEAP
MOV A,DAY
CJNE A,#29,N6 ;闰年的二月份只有28天
N6:
JC DISP
MOV DAY,#01H
INC MON
SETB JINWEI
LJMP DISP
NOTLEAP:
CLR LEAP
MOV A,DAY
CJNE A,#30,N7
N7:
JC DISP
MOV DAY,#01
INC MON
SETB JINWEI
LJMP DISP
QITA:
SETB XIAOYUE
CLR DAYUEB
MOV A,DAY
CJNE A,#31,N8
N8:
JC DISP
MOV DAY,#01
INC MON
SETB JINWEI
LJMP DISP
DAYUE:
SETB DAYUEB
CLR XIAOYUE
MOV A,DAY
CJNE A,#32,N9
N9:
JC DISP
MOV DAY,#01
INC MON
SETB JINWEI
DISP:
MOV A,POINT
JNZ PP4
MOV A,DAY
MOV B,#10
DIV AB
MOV SHUJU,#88H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#89H
LCALL ENABLE
MOV A,B
LCALL WWRITE
PP4:
JB JINWEI,MONIN
RET
MONIN:
CLR JINWEI
MOV A,MON
CJNE A,#13,N10
N10:
JC MONOUT
MOV MON,#0
INC YEAR
SETB JINWEI
MONOUT:
MOV A,POINT
JNZ PP5
MOV A,MON
MOV B,#10
DIV AB
MOV SHUJU,#85H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#86H
LCALL ENABLE
MOV A,B
LCALL WWRITE
PP5:
JB JINWEI,YAERIN
RET
YAERIN:
CLR JINWEI
MOV A,POINT
JNZ OUT
MOV A,YEAR
MOV B,#10
DIV AB
MOV SHUJU,#82H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#83H
LCALL ENABLE
MOV A,B
LCALL WWRITE
OUT:
RET
END ;今晚写到这里先,有空再写~~~~~~~~~~~~~~ ^_^
;************************************************************
;********************************************************
;***********************************************************
PROC KEY
KEY:
CLR KEYTIME
;**************************去抖处理************
JNB MENU,MENUK
JNB INCK,INCP
JNB DECK,DECP
JNB ESC,ESCP
RET
INCP:
LJMP INCC
DECP:
LCALL DECC
RET
ESCP:
LJMP ESCK
MENUK:
HERE:
JNB MENU,HERE
INC POINT ;菜单指针
MOV A,POINT
CJNE A,#12,N2
N2:
JC N3
MOV POINT,#8
MOV SHUJU,#0C4H
LCALL ENABLE
INC POINT1
RET
N3:
MOV A,POINT
CJNE A,#01,N4 ;定义01为改变秒,02为改变分,03为改变时,04为改变日,05改变月,06改变年
;07为改变星期,08为设闹钟的NO. 09为闹时,10为闹分
MOV SHUJU,#0C7H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N4:
CJNE A,#02,N5
MOV SHUJU,#0C4H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N5:
CJNE A,#03H,N6
MOV SHUJU,#0C1H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N6:
CJNE A,#04H,N7
MOV SHUJU,#89H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N7:
CJNE A,#05,N8
MOV SHUJU,#086H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N8:
CJNE A,#06,N9
MOV SHUJU,#083H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N9:
CJNE A,#07H,N10
MOV SHUJU,#08BH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
;*********************************************************
N10:
CJNE A,#08,N11
MOV SHUJU,#0C0H
LCALL ENABLE
MOV R1,#48
MOV R0,#16
N12:
MOV A,R1
LCALL WWRITE
INC R1
DJNZ R0,N12
MOV SHUJU,#0C4H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N11:
CJNE A,#09,N13
MOV SHUJU,#0C7H
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
RET
N13:
CJNE A,#10,N14
MOV SHUJU,#0CAH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
N14:
CJNE A,#11,N15
MOV SHUJU,#0CDH
LCALL ENABLE
MOV SHUJU,#0FH
LCALL ENABLE
N15:
RET
;******************************************************
INCC:
MOV A,POINT
JZ OUTINC
CJNE A,#01,Q1
INCB:
JNB INCK,INCB
SETB TIMESTOP
INC SEC
MOV A,SEC
CJNE A,#60,NS1
NS1:
JC NS2
MOV SEC,#0
NS2:
MOV A,SEC
MOV B,#10
DIV AB
MOV SHUJU,#0C6H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
OUTINC:
RET
Q1:
CJNE A,#02,Q2
INCM:
JNB INCK,INCM
SETB TIMESTOP
INC MIN
MOV A,MIN
CJNE A,#60,NM1
NM1:
JC NM2
MOV MIN,#0
NM2:
MOV A,MIN
MOV B,#10
DIV AB
MOV SHUJU,#0C3H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
Q2:
CJNE A,#03H,Q3
INCH:
JNB INCK,INCH
SETB TIMESTOP
INC HOUR
MOV A,HOUR
CJNE A,#24,NH1
NH1:
JC NH2
MOV HOUR,#0
NH2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV SHUJU,#0C0H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C1H
LCALL ENABLE
LCALL WWRITE
RET
Q3:
CJNE A,#04,Q4
INCD:
JNB INCK,INCD
INC DAY
MOV A,DAY
JB DAYUEB,DD
JB XIAOYUE,XX
JB LEAP,YY
CJNE A,#30,ND1
ND1:
JC ND2
MOV DAY,#0
JMP ND2
DD:
CJNE A,#32,NDD1
NDD1:
JC ND2
MOV DAY,#0
JMP ND2
XX:
CJNE A,#31H,XD
XD:
JC ND2
MOV DAY,#0
JMP ND2
YY:
CJNE A,#29,YD
YD:
JC ND2
MOV DAY,#0
ND2:
MOV A,DAY
MOV B,#10
DIV AB
MOV SHUJU,#88H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#89H
LCALL ENABLE
LCALL WWRITE
RET
Q4:
CJNE A,#05,Q5
INCMON:
JNB INCK,INCMON
INC MON
MOV A,MON
CJNE A,#13,M1
M1:
JC M2
MOV MON,#0
M2:
MOV A,MON
MOV B,#10
DIV AB
MOV SHUJU,#85H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#86H
LCALL ENABLE
LCALL WWRITE
RET
Q5:
CJNE A,#06,Q6
INCY:
JNB INCK,INCY
INC YEAR
MOV A,YEAR
MOV B,#10
DIV AB
MOV SHUJU,#82H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#83H
LCALL ENABLE
LCALL WWRITE
RET
Q6:
CJNE A,#07,Q7
INCX:
JNB INCK,INCX
INC XIN
MOV A,XIN
CJNE A,#8,X1
X1:
JC OUTX
MOV XIN,#1
OUTX:
MOV A,XIN
MOV SHUJU,#8BH
LCALL ENABLE
LCALL WWRITE
RET
Q7:
CJNE A,#8,Q8
INCN:
JNB INCK,INCN
INC NO
MOV A,NO
CJNE A,#33,TT
TT:
JC TT1
MOV NO,#0
TT1:
MOV SHUJU,#0C3H
LCALL ENABLE
MOV A,NO
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
Q8:
CJNE A,#9,Q9
INCL:
JNB INCK,INCL
MOV R0,#RAMP
MOV A,@R0
INC A
CJNE A,#24,TT2
TT2:
JC TT3
MOV A,#0
TT3:
MOV SHUJU,#0C6H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
Q9:
CJNE A,#10,Q10
INCV:
JNB INCK,INCV
MOV R0,#(RAMP+1)
MOV A,@R0
INC A
CJNE A,#60,TT4
TT4:
JC TT5
MOV A,#0
TT5:
MOV SHUJU,#0C9H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0CAH
LCALL ENABLE
LCALL WWRITE
RET
Q10:
CJNE A,#11,Q11
Q11: ;*************第二次暂停^_^ *******************
RET
;***************************************************************************
;****************************************************************************
ESCK:
NOP
CLR TIMESTOP
MOV POINT,#0
MOV POINT1,#0
MOV SHUJU,#0CH
LCALL ENABLE
MOV SHUJU,#0C0H;写入显示起始地址
LCALL ENABLE;调用写入命令子程序
MOV R0,#16
MOV R1,#32
WWW2:
MOV A,R1
LCALL WWRITE
INC R1
DJNZ R0,WWW2
MOV A,SEC
MOV B,#10
DIV AB
MOV SHUJU,#0C6H;写入显示起始地址
LCALL ENABLE;调用写入命令子程序
LCALL WWRITE
MOV SHUJU,#0C7H
LCALL ENABLE
MOV A,B
LCALL WWRITE
MOV A,MIN
MOV B,#10
DIV AB
MOV SHUJU,#0C3H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#0C4H
LCALL ENABLE
MOV A,B
LCALL WWRITE
MOV A,HOUR
MOV B,#10
DIV AB
MOV SHUJU,#0C0H
LCALL ENABLE
LCALL WWRITE
MOV SHUJU,#0C1H
LCALL ENABLE
MOV A,B
LCALL WWRITE
RET
END
;************************************************************
PROC DECC
DECC:
MOV A,POINT
JZ OUTINCD
CJNE A,#01,QD1
INCDB:
JNB DECK,INCDB
SETB TIMESTOP
DEC SEC
MOV A,SEC
CJNE A,#255,NSD2
MOV SEC,#59
NSD2:
MOV A,SEC
MOV B,#10
DIV AB
MOV SHUJU,#0C6H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
OUTINCD:
RET
QD1:
CJNE A,#02,QD2
INCMD:
JNB DECK,INCMD
SETB TIMESTOP
DEC MIN
MOV A,MIN
CJNE A,#255,NMD2
MOV MIN,#59
NMD2:
MOV A,MIN
MOV B,#10
DIV AB
MOV SHUJU,#0C3H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
QD2:
CJNE A,#03H,QD3
INCHD:
JNB DECK,INCHD
SETB TIMESTOP
DEC HOUR
MOV A,HOUR
CJNE A,#255,NHD2
MOV HOUR,#23
NHD2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV SHUJU,#0C0H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C1H
LCALL ENABLE
LCALL WWRITE
RET
QD3:
CJNE A,#04,QD4
INCDD:
JNB DECK,INCDD
DEC DAY
MOV A,DAY
CJNE A,#255,NDD2
MOV DAY,#31
NDD2:
MOV A,DAY
MOV B,#10
DIV AB
MOV SHUJU,#88H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#89H
LCALL ENABLE
LCALL WWRITE
RET
QD4:
CJNE A,#05,QD5
INCMOND:
JNB DECK,INCMOND
DEC MON
MOV A,MON
CJNE A,#255,MD2
MOV MON,#12
MD2:
MOV A,MON
MOV B,#10
DIV AB
MOV SHUJU,#85H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#86H
LCALL ENABLE
LCALL WWRITE
RET
QD5:
CJNE A,#06,QD6
INCYD:
JNB DECK,INCYD
DEC YEAR
MOV A,YEAR
MOV B,#10
DIV AB
MOV SHUJU,#82H
LCALL ENABLE
LCALL WWRITE
MOV A,B
MOV SHUJU,#83H
LCALL ENABLE
LCALL WWRITE
RET
QD6:
CJNE A,#07,QD7
INCXD:
JNB DECK,INCXD
DEC XIN
MOV A,XIN
CJNE A,#0,OUTXD
MOV XIN,#7
OUTXD:
MOV A,XIN
MOV SHUJU,#8BH
LCALL ENABLE
LCALL WWRITE
QD7:
CJNE A,#08,QD8
INCND:
JNB DECK,INCND
DEC NO
MOV A,NO
CJNE A,#0,TTD
MOV NO,#1
TTD:
MOV SHUJU,#0C3H
LCALL ENABLE
MOV A,NO
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C4H
LCALL ENABLE
LCALL WWRITE
RET
QD8:
CJNE A,#09,QD9
INCLD:
JNB DECK,INCLD
MOV R0,#RAMP
MOV A,@R0
DEC A
CJNE A,#255,TTD3
MOV A,#23
TTD3:
MOV SHUJU,#0C6H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0C7H
LCALL ENABLE
LCALL WWRITE
RET
QD9:
CJNE A,#10,QD10
INCVD:
JNB DECK,INCVD
MOV R0,#(RAMP+1)
MOV A,@R0
DEC A
CJNE A,#255,TTD4
MOV A,#59
TTD4:
MOV SHUJU,#0C9H
LCALL ENABLE
MOV @R0,A
MOV B,#10
DIV AB
LCALL WWRITE
MOV A,B
MOV SHUJU,#0CAH
LCALL ENABLE
LCALL WWRITE
RET
QD10:
NOP
RET
END
;*****************************************************************
;*********************************************************显示
PROC WWRITE
WWRITE:
MOVC A,@A+DPTR
MOV SHUJU,A
SETB RS
CLR RW;RW=0;准备写入数据
CLR E;E=0;执行显示命令
LCALL DELAY;判断液晶模块是否忙?
SETB E
RET
END
;******************
PROC ENABLE
ENABLE:
CLR RS;写入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
END
PROC DELAY
DELAY:
MOV SHUJU,#0FFH;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,DELAY;如果P0.7为高电平表示忙就循环等待
RET
END
PROC CTC2
CTC2:
PUSH PSW
PUSH ACC
SETB KEYTIME
JB TIMESTOP,EXIT
DJNZ TIMECON,EXIT
SETB TIMEUP
MOV TIMECON,#TIMEOVER
EXIT:
POP ACC
POP PSW
CLR TF2
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -