📄 clock1.asm
字号:
;********************************************************************
;****************************PROGRAM FOR CLOCK***********************
;********************************************************************
;DESCRIPTION: CLOCK PROGRAM INCULED KEY AND DISPLAY
;AUTHORS: WEIHONGLIN
;DATE: 31ST,JULY,2003
;VER: 1.0
;********************************************************************
ORG 0000h ;留出中断入口
LJMP MAIN
ORG 0Bh
LJMP TIME
;ORG 000bH
;RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0030H
;********************************************************************
;DESCRIPTION: p0作为输出口
;p1.0-1.5作为片选信号口,p3.0作为led闪烁信号
;R0作为输入七段码缓冲区
;********************************************************************
;******************************INHITE********************************
MAIN:
MOV TMOD,#01h ;初始化时片选信号
MOV P1,#10000000B ;初化显示缓冲区 显示00: 00 00
MOV R0,#0H
MOV R1,#9H
MOV 08H,#0H ;INHITE THE AREA OF TIMER
MOV 09H,#0H
MOV 0AH,#0H
MOV 0BH,#0H
MOV 0CH,#0H
MOV 0DH,#0H
MOV 0EH,#0H
MOV 0FH,#0H
SETB P2.1 ;PREPARE FOR DEYBORD
SETB P2.2
SETB P2.3
MOV SP,#31H ;inhite the stack
SETB EA ;SET INTERUPTION ENABLE
SETB ET0
MOV TH0,#0B1H ;LOAD VALUE TO TIMER
MOV TL0,#0E0H
SETB TR0
WAIT:
AJMP $ ;WAIT FOR THE INTERUPTION
;********************************************************************
;DESCRIPTIONS:
;以下是时间中断程序
;每次中断显示片信号左移一位
;软件计数,实现秒计数,分计数,秒计数
;每半秒钟ledlamp闪一次。
;********************************************************************
;****************************TIMER***********************************
TIME:
MOV TH0,#0ffH ;LOAD VALUE
MOV TL0,#0daH
CLR RS1
SETB RS0 ;use the the 1st command register
INC R0 ;count the interuption times
CJNE R0,#251,DISP ;count 250 times
CPL P3.0 ;light on half second and shut down half second
INC R1 ;r0 is not large enough to contain the data 500 so r1 is nessesury
MOV R0,#0H ;reset the r0 register
CJNE R1,#3,DISP
MOV R1,#0H ;reset the r1 register
INC R2 ;THE LOW BIT OF SECOND
CJNE R2,#10,DISP
MOV R2,#0H ;RESET THE R2 REGISTER
INC R3 ;THE HIGHT BIT OF SECOND
CJNE R3,#6,DISP ;CHECK THE R3 REGISTER
MOV R3,#0H ;RESET THE R3 REGISTER
INC R4 ;THE LOW BIT OF MINUTE
CJNE R4,#10,DISP ;CHECK THE R4 RIGISTER
MOV R4,#0H ;RESET THE R4 RIGISTER
INC R5 ;THE HIGHT BIT OF MINUTE
CJNE R5,#6,DISP ;CHECK THE HIGHTBIT OF MINUTE
MOV R5,#0H ;RESET THE R5 REGISTER
INC R6 ;THE LOW BIT OF HOURS
CJNE R7,#1,CONTINU ;CHECK THE HIGHT BIT OF HOURS
CJNE R6,#2,DISP ;CHECK THE LOW BIT OF HOURS
MOV R6,#0H ;RESET THE R6 REGISTER
MOV R7,#0H ;RESET THE R7 REGISTER
CONTINU:
CJNE R6,#10,DISP ;CHECK THE LOW BIT OF HOURS
MOV R6,#0H ;RESET THE R6 REGISTER
INC R7 ;THE HIGHT BIT OF HOURS
;********************************************************************
;********************************DISPLAY*****************************
;DISCRIPTIONS:
;CONTROL THE STATUS OF LED DISPLAYERS
;GET THE POSITION INFORMATION FROM THE I/O P1
;GET THE DISPLAY VALUE BY THE "DIVED" SECTION
;USE THE VALUE AS ADDRESS THEN CAN FIND THE SEVEN SECTION CODE
;PUT THE SEVEN SECTION CODE INTO THE R0 BUFFER(OUTPUT BUFFER)
DISP:
MOV DPTR,#TABLE
MOV A,P1
RL A ;THE POSITION OF HIGHT BIT MOVE LEFT BY ONE STEP
MOV P0,#0FFH ;CLOSE THE LED_LAMP
MOV P1,A
CLR RS0 ;USE THE FIRST RIGISTER GROUP
CLR RS1
INC R1 ;AND R1 INCREACE BY 1
MOV A,@R1
MOVC A,@A+DPTR ;WE GET THE DATA WANTED TO SHOW ON LED
MOV R0,A ;
MOV p0,r0 ;show
CJNE R1,#15,NEXT2
MOV R1,#9H
NEXT2:
JNB P1.5,KEY1
MOV P1,#10000000B ;
;********************************************************************
;**********************************KEY*******************************
;DISCRIPTION: THE NEXT CODE WILL CHECK THE KEY STATU
;
KEY1:
JB P2.1,KEY2 ;IF KEY1 HAVE NOT BEEN PRESS DOWN
MOV A,#20 ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID
CJNE A,02H,CHECKCY1 ;IF R2>A THEN CHECK "CY"
INC R2 ;IF A=R2 THEN R2 INCREACE BY STEP 1
LJMP CHANGE1 ;
CHECKCY1:
JB CY,CHANGE1 ;CHECK IF R2>A
INC R2 ;IF NOT R2>1 THEN R2 INCREACE BY STEP 1
LJMP CHANGE1 ;
KEY2:
SETB P2.4
JB P2.2,KEY3 ;IF KEY2 HAVE NOT BEEN PRESS DOWN
MOV A,#20 ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID
CJNE A,03H,CHECKCY2 ;IF R3>A THEN CHECK "CY"
INC R3 ;IF A=R3 THEN R3 INCREACE BY STEP 1
LJMP CHANGE1 ;
CHECKCY2:
JB CY,CHANGE1 ;CHECK IF R3>A
INC R3 ;IF NOT R3>A THEN R3 INCREACE BY STEP 1
LJMP CHANGE1 ;
KEY3:
SETB P2.5
JB P2.3,P26 ;IF KEY3 HAVE NOT BEEN PRESS DOWN
MOV A,#20 ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID
CJNE A,04H,CHECKCY3 ;IF R4>A THEN CHECK "CY"
INC R4 ;IF A=R4 THEN R4 INCREACE BY STEP 1
LJMP CHANGE1
P26:
SETB P2.6
CHECKCY3:
JB CY,CHANGE1 ;CHECK IF R4>A
INC R4 ;IF NOT R4>A THEN R4 INCREACE BY STEP 1
LJMP CHANGE1 ;
CHANGE1:
JNB P2.4,CHANGE2
JNB CY,RESETR2
;ADD HOUR
MOV R2,#0
CLR CY
LJMP CHANGE2
RESETR2:
MOV R2,#0
LJMP CHANGE2
CHANGE2:
JNB P2.2,CHANGE3
JNB CY,RESETR3
;ADD MINUTE
MOV R3,#0
CLR CY
LJMP CHANGE3
RESETR3:
MOV R3,#0
LJMP CHANGE3
CHANGE3:
JNB P2.3,CHANGE3
JNB CY,RESETR4
;CLEAR SECOND
MOV R4,#0
CLR CY
LJMP BACK
RESETR4:
MOV R3,#0
BACK:
SETB RS0 ;NEXT TIME WILL USE THE SECOND REGISTER GROUP
CLR RS1
RETI
;********************************************************************
;********************************************************************
TABLE: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
; 显示;====0====1====2====3===4===5===6====7===8===9====
;********************************************************************
; IF R0!=0
; LJMP BACK
; ELSE
; LJMP RESETR4
; ENDIF
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -