📄 s.txt
字号:
T_RST Bit P3.4 ;实时时钟复位线引脚
T_CLK Bit P3.2 ;实时时钟时钟线引脚
T_IO Bit P3.3 ;实时时钟数据线引脚
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
DAY EQU 33H
MONTH EQU 34H
WEEK EQU 35H
YEARL EQU 36H
ORG 0000H
LJMP start
ORG 001bH
AJMP INTT1 ; 定时中断T1入口
start: LCALL KEY
AJMP START
;*******流水灯*******
KEY0: MOV R2,#3
RESB: MOV R1,#8
MOV A,#0FEH
LOOPSB: MOV P2,A
RL A
LCALL DELAY
DJNZ R1,LOOPSB
DJNZ R2,RESB
mov p2,#0ffh
KS: MOV P1,#0F0H
MOV A,P1
MOV B,A
ACALL DELAY
MOV A,P1
CJNE A,B,DS0
CJNE A,#0D0H,DS0
AJMP KEYS1
DS0: AJMP KS
KEYS1: MOV R7,#5
REB: MOV R1,#8
MOV A,#0FEH
LOOPB: MOV P2,A
RR A
LCALL DELAY
DJNZ R1,LOOPB
DJNZ R7,REB
MOV R7,#5
REC: MOV R1,#9
MOV A,#0FEH
LOOPC: MOV P2,A
RL A
LCALL DELAY
DJNZ R1,LOOPC
DJNZ R7,REC
mov p2,#0ffh
ks1: MOV P1,#0F0H
MOV A,P1
MOV B,A
ACALL DELAY
MOV A,P1
CJNE A,B,DS10
CJNE A,#0B0H,DS10
AJMP KEYS13
DS10: AJMP KS1
KEYS13: MOV R2,#3
RESB3: MOV R1,#10
MOV A,#0FAH
LOOPSB3: MOV P2,A
RR A
LCALL DELAY
DJNZ R1,LOOPSB3
DJNZ R2,RESB3
mov p2,#0ffh
KS2: MOV P1,#0F0H
MOV A,P1
MOV B,A
ACALL DELAY
MOV A,P1
CJNE A,B,DS2O
CJNE A,#070H,DS2O
AJMP KEYS23
DS2O: AJMP KS2
KEYS23: mov r0,#5
retu: mov p2, #07eh ; 双亮点向中间移
lcall delay
lcall delay
mov p2, #0bdh
lcall delay
lcall delay
mov p2, #0dbh
lcall delay
lcall delay
mov p2, #0e7h
lcall delay
lcall delay
djnz r0,retu
mov p2,#0ffh
RET
;*******音乐*******
KEY1: MOV SP,#60H
MOV TMOD,#10H
SETB ET1
SETB EA
SETB TR1
START0:clr p3.4
MOV 30H,#00H
NEXTT:MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,A
JZ ENDD
ANL A,#0FH
MOV R5,A
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING
CLR TR1
AJMP DD1
SING:DEC A
MOV 22H,A
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV TH1,A
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL1,A
MOV 20H,A
SETB TR1
DD1: LCALL DELAYY
INC 30H
AJMP NEXTT
ENDD:CLR TR1
AJMP START0
INTT1:PUSH PSW
PUSH ACC
MOV TL1,20H
MOV TH1,21H
cpl p3.4
POP ACC
POP PSW
RETI
;*******日期**************************************************************
KEY2: ;CLR T_RST
;CLR T_CLK
MOV SP,#60H ;修改堆栈
MOV SECOND,#00H ;初始时间设为12:00:00
MOV MINUTE,#00H
MOV HOUR,#12H
MOV DAY,#31h ;初始日期设为08年1月1日第一周
MOV MONTH,#05
MOV WEEK,#20H
MOV YEARL,#08H
LCALL SETDS1302
LCALL GET1302
LCALL DISPLAY
MAIN: MOV R3,#50
MOV TMOD,#01H
MOV TH0,#70H ;置定时器初值(定时40ms)
MOV TL0,#00H
SETB TR0 ;启动定时器0
LP1: JBC TF0,LP2 ;查询计数溢出
SJMP LP1 ;未到40 ms继续计数
LP2: MOV TH0,#0B8H ;重新置定时器初值
MOV TL0,#00H
LCALL DISPLAY ;显示
DJNZ R3,LP1 ;未到1 S继续循环
LCALL GET1302 ;每过1s从DS1302读取一次时间
mov r3,#50
LCALL JP
SJMP lp1
;数码显示子程序
DISPLAY:
MOV DPTR,#DIG_CODE
;显示日
MOV P1,#11111000b
MOV A,DAY
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110100b
MOV A,DAY
SWAP A
ANL A,#07H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
;*******************************************
;显示月
MOV P1,#11110010b
MOV A,MONTH
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110001b
MOV A,MONTH
SWAP A
ANL A,#03H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
RET
;---------------------------------------------------------------------------------------------------
JP: MOV P1,#0F0H
MOV A,P1
MOV B,A
ACALL DELAY
MOV A,P1
CJNE A,B,JP0
CJNE A,#0E0H,JP0
AJMP JP1
JP0: AJMP JP
JP1: MOV SP,#60H ;修改堆栈
MOV SECOND,#00H ;初始时间设为12:00:00
MOV MINUTE,#00H
MOV HOUR,#12H
MOV DAY,#31h ;初始日期设为08年1月1日第一周
MOV MONTH,#05
MOV WEEK,#20H
MOV YEARL,#08H
LCALL SETDS1302
LCALL GET1302
LCALL DISPLAY2
MAIN2: MOV R3,#50
MOV TMOD,#01H
MOV TH0,#70H ;置定时器初值(定时40ms)
MOV TL0,#00H
SETB TR0 ;启动定时器0
LP12: JBC TF0,LP22 ;查询计数溢出
SJMP LP12 ;未到40 ms继续计数
LP22: MOV TH0,#0B8H ;重新置定时器初值
MOV TL0,#00H
LCALL DISPLAY2 ;显示
DJNZ R3,LP12 ;未到1 S继续循环
LCALL GET1302 ;每过1s从DS1302读取一次时间
mov r3,#50
SJMP lp12
DISPLAY2:
MOV DPTR,#DIG_CODE
;*******************************************
;显示分
MOV P1,#11111000b
MOV A,MINUTE
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110100b
MOV A,MINUTE
SWAP A
ANL A,#07H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
;*******************************************
;显示小时
MOV P1,#11110010b
MOV A,HOUR
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110001b
MOV A,HOUR
SWAP A
ANL A,#03H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
RET
;*******************************************
;******* 年份*******
KEY3: ;CLR T_RST
;CLR T_CLK
MOV SP,#60H ;修改堆栈
MOV SECOND,#00H ;初始时间设为12:00:00
MOV MINUTE,#00H
MOV HOUR,#12H
MOV DAY,#31h ;初始日期设为08年1月1日第一周
MOV MONTH,#05
MOV WEEK,#20H
MOV YEARL,#08H
LCALL SETDS1302
LCALL GET1302
LCALL DISPLAY3
MAIN3: MOV R3,#50
MOV TMOD,#01H
MOV TH0,#70H ;置定时器初值(定时40ms)
MOV TL0,#00H
SETB TR0 ;启动定时器0
LP13: JBC TF0,LP23 ;查询计数溢出
SJMP LP13 ;未到40 ms继续计数
LP23: MOV TH0,#0B8H ;重新置定时器初值
MOV TL0,#00H
LCALL DISPLAY3 ;显示
DJNZ R3,LP13 ;未到1 S继续循环
LCALL GET1302 ;每过1s从DS1302读取一次时间
mov r3,#50
SJMP LP13
DISPLAY3:
MOV DPTR,#DIG_CODE
;*******************************************
;显示年
MOV P1,#11111000b
MOV A,YEARL
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110100b
MOV A,YEARL
SWAP A
ANL A,#07H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110010b
MOV A,WEEK
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
MOV P1,#11110001b
MOV A,WEEK
SWAP A
ANL A,#03H
MOVC A,@A+DPTR
MOV P0,A
LCALL DIS_DELAY
RET
;*******************************************
;---------------------------------------------------------------------------------------------------
;显示延时5ms子程序
DIS_DELAY:
PUSH PSW
MOV R7,#10
D1: MOV R6,#248
D2: DJNZ R6,$
DJNZ R7,D1
POP PSW
RET
;---------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------
;设置DS1302初始时间,并启动计时
SETDS1302:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;写控制命令字
LCALL INPUTBYTE
MOV B,#00H ;写保护关闭
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SECOND ;内存中的时间首地址
MOV R1,#80H ;DS1302中的时间首地址
MOV R7,#7 ;字节数
SETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1 ;写命令字
LCALL INPUTBYTE
MOV A,@R0 ;设置时间
MOV B,A
LCALL INPUTBYTE
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE
MOV B,#80H ;开写保护
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
;---------------------------------------------------------------------------------------------------
;从DS1302读取时间
GET1302:
MOV R0,#SECOND
MOV R1,#81H ;DS1302中读时间的首地址
MOV R7,#7
GETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE ;写命令字
LCALL OUTPUTBYTE ;读时间
MOV @R0,A ;将从DS1302中读取的时间从内存中保存
INC R0 ;修改地址指针
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
;---------------------------------------------------------------------------------------------------
;向DS1302写一个字节
INPUTBYTE:
MOV R4,#8
INPUTLOOP:
MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
;NOP
;NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET
;---------------------------------------------------------------------------------------------------
;从DS1302读一个字节
OUTPUTBYTE:
clr a
clr c
MOV R4,#8
OUTPUTLOOP:
NOP
;NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
;NOP
;NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
KEY: MOV P1,#0F0H
MOV A,P1
MOV B,A
ACALL DELAY
MOV A,P1
CJNE A,B,D0
CJNE A,#0E0H,K1
AJMP KEY0
K1: CJNE A,#0D0H,K2
AJMP KEY1
K2: CJNE A,#0B0H,k3
AJMP KEY2
K3: CJNE A,#070H,D0
AJMP KEY3
D0: RET
DELAY: MOV R6,#200
DL1: MOV R5,#250
DJNZ R5,$
DJNZ R6,DL1
RET
DEL1: MOV R7,#02
DL2:MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DL2
RET
DELAYY:MOV R7,#02
DELAY0:MOV R4,#187
DELAY1:MOV R3,#248
DJNZ R3,$
DJNZ R4,DELAY1
DJNZ R7,DELAY0
DJNZ R5,DELAYY
RET
;---------------------------------------------------------------------------------------------------
;字符显示码表
DIG_CODE:
DB 14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,05H
TABLE:
DB 02H,82H
DB 16H,32H,54H,02H,52H
DB 0A6H,32H,54H,02H,52H
DB 64H,74H,0B6H,64H
DB 52H,5CH,32H,22H
DB 16H,12H,14H,32H,22H
DB 16H,12H,14H,22H,32H
DB 26H,12H,94H,22H,32H
DB 2CH
DB 32H,52H
DB 36H,22H,14H,54H
DB 0ACH,92H,0A2H
DB 96H,0A2H,96H,82H
DB 3CH,54H
DB 36H,22H,14H,54H
DB 0ACH,92H,0A2H
DB 16H,12H,14H,22H,32H
DB 2CH,02H,82H
DB 16H,32H,56H,12H
DB 0A6H,32H,56H,52H
DB 66H,72H,0B6H,62H
DB 62H,52H,58H,32H,22H
DB 16H,12H,14H,32H,22H
DB 16H,12H,14H,22H,32H
DB 26H,92H,0A4H,12H,22H
DB 1CH
DB 00
TABLE1:
DW 64580,64684,64777,64820
DW 64898,64968,65030,64260
DW 64400,64524,65058,63835,64021
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -