📄 10000clock.asm
字号:
MOV R1,#08H
MOV R0,#56H
S_LOOP: ;秒表清零
MOV @R0,#0
INC R0
DJNZ R1,S_LOOP
LCALL S_DISPLAY
CLR TR2
MOV TH2,#0DCH ;定时10ms
MOV TL2,#00H
MOV RCAP2H,#0DCH ;重装DC00
MOV RCAP2L,#00H
SETB EA
S_BEGIN:
JB DOWN,S_KEY
LJMP S_BEGIN
S_KEY:
JNB ENTER,S_CONTINUE ;按下确认键就保存退出设置
CLR ENTER
SETB EX0
SETB EX1
SETB TR2
SETB TF1
CLR S_WATCH
LJMP CON4
S_CONTINUE:
JB DOWN,S_KEYOVER ;秒表暂停
LCALL DELAY30MS
JB DOWN,S_KEYOVER
SETB TR2
S_KEYOVER:
JB DOWN,S_KEY0
LJMP S_KEYOVER
S_KEY0: ;秒表开
JB UP,S_KEY0OVER
LCALL DELAY30MS
JB UP,S_KEY0OVER
CLR TR2
S_KEY0OVER:
JB UP,S_KEY1
LJMP S_KEY0OVER
S_KEY1: ;秒表复零
JB SW,S_KEY1OVER
LCALL DELAY150MS
JB SW,S_KEY1OVER
MOV P0,#0CCH ;写入显示起始地址(第2行第13个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P_COUNT,#0
MOV P0,#0CCH ;写入显示起始地址(第2行第13个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
LJMP STOPWATCH
S_KEY1OVER:
JB SW,S_KEY2
LJMP S_KEY1OVER
S_KEY2: ;秒表退出
JB CONF,S_KEY2OVER
LCALL DELAY150MS
JB CONF,S_KEY2OVER
SETB ENTER
MOV D_COUNT,#0C8H
MOV TL1,#0B0H ;设置T1初值,定时50ms
MOV TH1,#3CH
ANL TMOD,#0FH
ORL TMOD,#00010000B ;16位定时器
SETB ET1
SETB TR1
S_KEY2OVER:
LJMP S_KEY
C_STOP:
SETB BEE ;关闹钟
MOV C_COUNT,#64H
LCALL C_END
CLR LIG ;背光定时关
MOV TL1,#0B0H ;设置T1初值,定时50ms
MOV TH1,#3CH
ANL TMOD,#0FH
ORL TMOD,#00010000B ;16位定时器
SETB ET1
SETB TR1
RET
INT0:
MOV ByteCnt,#07H ;接收7字节
MOV SlvAdr,#0A2H ;PCF8563日历时钟器件地址为A2H
MOV SubAdr,#02H ;从日历时钟的02H单元开始
LCALL ReceData ;调用读EEPROM多字节读入过程,将信息读入接收缓冲区
LCALL LCDBUF ;把时间缓冲区的内容按十位与个位分开存放
LCALL DISPLAY ;把数据输出液晶显示
CLR IE0
RETI
RETI
RETI
INT1:
CLR BEE ;开蜂鸣器
MOV TL0,#0B0H ;设置T0初值,定时50ms
MOV TH0,#3CH
ANL TMOD,#0F0H
ORL TMOD,#00000001B ;16位定时器
SETB ET0
SETB TR0
CLR EX1 ;关闭中断
RETI
RETI
RETI
CTC0:
JB C_5S,C_NEXT
MOV TL0,#0B0H ;手动重装,定时50ms
MOV TH0,#3CH
DJNZ C_COUNT,C_EXIT
SETB C_5S
MOV C_COUNT,#64H
SETB BEE
MOV TL0,#0E0H ;定时20ms
MOV TH0,#0B1H
JB C_2S,C_END
SJMP C_EXIT
C_NEXT:
MOV TL0,#0E0H ;定时20ms
MOV TH0,#0B1H
DJNZ C_COUNT,C_EXIT
MOV C_COUNT,#64H
SETB C_2S
CLR C_5S
CLR BEE
MOV TL0,#0B0H ;手动重装,定时50ms
MOV TH0,#3CH
SJMP C_EXIT
C_END:
CLR C_2S
CLR C_5S
CLR TR0
CLR ET0
MOV XmtDat,#00000010B ;清除闹钟中断标志
MOV ByteCnt, #01H ;传送1字节
MOV SlvAdr, #0A2H ;PCF8563日历时钟器件地址为A2H
MOV SubAdr, #01H ;从日历时钟的01H单元开始
LCALL SendData ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
;PCF8563日历芯片内日历时间单元
SETB EX1 ;开闹钟中断
C_EXIT:
CLR TF0
RETI
RETI
RETI
CTC1:
MOV TL1,#0B0H ;手动重装,定时50ms
MOV TH1,#3CH
DJNZ D_COUNT,D_EXIT
MOV D_COUNT,#0C8H
SETB LIG
CLR TR1
CLR ET1
D_EXIT:
CLR TF1
RETI
RETI
RETI
CTC2:
PUSH PSW
PUSH ACC
JB S_WATCH,S_W
SETB T40 ;40ms时间到标志置1
SJMP CTC2_OUT
S_W: ;秒表计时程序
INC S_MS0
MOV A,S_MS0
CJNE A,#10,S_NEXT
MOV S_MS0,#00H
INC S_MS1
MOV A,S_MS1
CJNE A,#5,PATTERN1
LCALL PATTERN
PATTERN1:
CJNE A,#10,S_NEXT
MOV S_MS1,#00H
LCALL PATTERN
INC S_SEC0
MOV A,S_SEC0
CJNE A,#10,S_NEXT
MOV S_SEC0,#00H
INC S_SEC1
MOV A,S_SEC1
CJNE A,#6,S_NEXT
MOV S_SEC1,#00H
INC S_MIN0
MOV A,S_MIN0
CJNE A,#10,S_NEXT
MOV S_MIN0,#00H
INC S_MIN1
MOV A,S_MIN1
CJNE A,#6,S_NEXT
MOV C_MIN1,#00H
INC S_HOU0
MOV A,S_HOU0
CJNE A,#10,S_NEXT
MOV S_HOU0,#00H
INC S_HOU1
MOV A,S_HOU1
CJNE A,#10,S_NEXT
MOV C_HOU1,#00H
S_NEXT:
LCALL S_DISPLAY
CTC2_OUT:
CLR TF2
POP ACC
POP PSW
RETI
RETI
RETI
;键盘检测,检测有没有按键被按下
KEYCHK:
MOV A,P1 ;读P1状态
ANL A,#0F0H ;屏蔽低4位
CJNE A,#0F0H,NEXT1 ;高4位为1说明没有按键按下
SETB C ;C的作用是用来改写KEYSTU
SJMP NEXT2
NEXT1:
CLR C
NEXT2:
MOV A,KEYSTU
RLC A
ANL A,#07H ;保留按键状态
MOV KEYSTU,A ;保存按键状态
;判别按键状态,决定是否执行按键扫描,检查是否010态
CJNE A,#2,NEXT3
;处于010态,视为干扰,作000态处理
ANL KEYSTU,#0F8H ;重置按键状态
SJMP NEXT4
NEXT3:
CJNE A,#4,NEXT4
;处于100态,说明按键已稳定闭合,可进行按键扫描
LCALL KEYSCAN ;执行键盘扫描,确定哪一按键被按下
NEXT4:
;---键盘检测结束-----------
RET
;键盘扫描程序,检查哪个按键被按下,P1.7-P1.4键值分别为81H,82H,83H,84H
KEYSCAN:
ANL KEYNAME,#10000000B ;保留b7位
MOV A,KEYNAME
CJNE A,#0,RETURN ;若b7位为1,表明原键值未处理,返回
JB P1.7,KEYSCAN1 ;若P1.7为1扫描P1.6
MOV KEYNAME,#1
SJMP KEYSCAN_DOEN
KEYSCAN1:
JB P1.6,KEYSCAN2 ;若P1.6为1扫描P1.5
MOV KEYNAME,#2
SJMP KEYSCAN_DOEN
KEYSCAN2:
JB P1.5,KEYSCAN3 ;若P1.5为1就肯定是P1.4
MOV KEYNAME,#3
SJMP KEYSCAN_DOEN
KEYSCAN3:
MOV KEYNAME,#4
KEYSCAN_DOEN:
ORL KEYNAME,#80H ;按键有效标志置1
RETURN:
RET
LOADLCD:
MOV P0,#00000001B ;清屏并光标复位
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00111000B ;设置显示模式,8位2行5X7点阵
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00001100B ;显示器开、光标关、光标不允许闪烁
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00000110B ;文字不动,光标自动右移
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#80H ;写入显示起始地址(第一行第一个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00110010B ;写入2
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00110000B ;写入0
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#84H ;写入显示起始地址(第一行第五个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00101111B ;写入/
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#87H ;写入显示起始地址(第一行第八个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00101111B ;写入/
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#0C2H ;写入显示起始地址(第二行第三个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00111010B ;写入:
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#0C5H ;写入显示起始地址(第二行第六个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00111010B ;写入:
LCALL WR_DATA ;调用LCD数据写入子程序
;输入SUNGT86
;显示字母SETTIME
DIS_TIME:
MOV P0,#0C9H ;写入显示起始地址(第二行第十个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#01010011B ;写入S
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01000101B ;写入E
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01010100B ;写入T
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01010100B ;写入T
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001001B ;写入I
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001101B ;写入M
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01000101B ;写入E
LCALL WR_DATA ;调用LCD数据写入子程序
RET
;在第一行显示ALARM
DIS_ALARM:
MOV P0,#00000001B ;清屏并光标复位
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#0C2H ;写入显示起始地址(第二行第三个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#00111010B ;写入:
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#82H ;写入显示起始地址(第一行第二个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV P0,#01000001B ;写入A
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001100B ;写入L
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01000001B ;写入A
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01010010B ;写入R
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001101B ;写入M
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001001B ;写入I
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01010011B ;写入S
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#00100000B ;写入空值
LCALL WR_DATA ;调用LCD数据写入子程序
MOV P0,#01001111B ;写入O
LCALL WR_DATA ;调用LCD数据写入子程序
RET
;在第一行显示STOPWATCH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -