⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实时钟程序.asm

📁 实时钟 实时钟 实时钟 实时钟
💻 ASM
字号:
;********************************************************************************
;题目:      实时钟程序设计
;功能:	   实时显示分,秒,毫秒,并可以通过按键来调整时间。。
;作者:解兴哲 生医0401 20044725
;日期:2007,7,2
;********************************************************************************      
	ORG 0000H
	LJMP MAIN
        ORG 000BH	;定时器0溢出中断入口
        LJMP TIME
	ORG 0030H
MAIN:	MOV 20H,#00H	;存毫秒
 	MOV 21H,#00H	;存秒
	MOV 22H,#00H	;存分
	MOV 23H,#00H	;存小时
	MOV IP,#02H	;IP初始化,将定时器0中断优先级设为高优先级
	MOV IE,#82H	;IE初始化,EA=1,ET0=1
	MOV TMOD,#01H 	;设定定时器工作方式,方式1,16位工作方式
	MOV TL0,#0B0H
	MOV TH0,#3CH	;计数初值
	SETB TR0	;启动定时
	MOV SP,#40H	;重设堆栈指针
	MOV 24H,#00H 	;24H中存选择键按下次数
NEXT:   LCALL DISP	;调用显示子程序
	LCALL KEY 	;调用按键检测子程序
	JZ NEXT 	;A=0无键按下,继续检测
	LCALL ANKEY 	;调用按键处理子程序
	LJMP NEXT	;重新循环
	NOP
	NOP
	NOP

;定时中断处理程序:
TIME:	 PUSH ACC 	;保护现场
	PUSH PSW
	MOV TL0,#0B0H 	;赋定时初值定时50MS
	MOV TH0,#3CH
	INC 20H		;毫秒加一
	MOV A,20H
	CJNE A,#20,RETI1;50mS*20=1S要循环20次,秒才加一
	MOV 20H,#00H 	;一秒钟时间到
	MOV A,21H
	ADD A,#01H	;秒加一
	DA A		;BCD码十进制校准
	MOV 21H,A
	CJNE A,#3CH,RETI1
	MOV 21H,#00H 	;一分钟时间到
	MOV A,22H
	ADD A,#01H
	DA A
	MOV 22H,A
	CJNE A,#3CH,RETI1
	MOV 22H,#00H 	;一小时时间到
	MOV A,23H
	ADD A,#01H
	DA A
	MOV 23H,A
	CJNE A,#18H,RETI1
	MOV 23H,#00H	;到时间达到24小时,清零.
RETI1: 	POP PSW 	;恢复现场
	POP ACC
	RETI		;中断返回?
	NOP
	NOP

;显示子程序
DISP:	MOV A,21H 	;处理秒21H-->2EH,2FH
	ANL A,#0FH
	MOV 2FH,A	;秒个位
	MOV A,21H 
	ANL A,#0F0H
	SWAP A
	MOV 2EH,A	;秒十位

	MOV A,22H 	;处理分钟22H-->2CH,2DH
	ANL A,#0FH
	MOV 2DH,A
	MOV A,22H
	ANL A,#0F0H
	SWAP A
	MOV 2CH,A

	MOV A,23H 	;处理小时23H-->2AH,2BH
	ANL A,#0FH
	MOV 2BH,A
	MOV A,23H
	ANL A,#0F0H
	SWAP A
	MOV 2AH,A

	MOV R0,#2FH 	;显示偏移量,秒个位
	MOV R3,#06H 	;要显示六位数
	MOV DPTR,#TABLE 
	MOV A,#20H	;00100000, P2.5有效,送秒个位
LOOP1:	 MOV B,A	;B暂存A值
	MOV P2,a	;P2数码管控制端
	MOV A,@R0	;查表,7段译码
	MOVC A,@A+DPTR
	MOV P0,a 	;送显示
	MOV R2,#80H	;延时
	DJNZ R2,$
	DEC R0
	MOV A,B
	RR A		;动态显示,数码管控制端循环有效
	DJNZ R3,LOOP1	;循环显示
	RET

TABLE: 	db 28h,7eh,0a2h,62h,74h,61h,21h ;不带小数点
	DB 7ah,20h,60h,00,00,00,00,00,00
	NOP
	NOP

;按键判断程序 P1.3-P1.5功能键 低电平有效
KEY: 	MOV A,P1
	CPL A 		;低电平有效,取反判断
	ANL A,#38H	;00111000判断有无键按下
	JZ RETX 	;A=0无键按下则返回
	LCALL DELAY	;LCALL DISP ;延时
	MOV A,P1	;再次判断,以便去抖
	CPL A
	ANL A,#38H
	JZ RETX 	;键盘去抖动
	MOV R6,A 	;将键值存入R6。
LOOP2:	LCALL DISP 	;
	MOV A,P1
	CPL A
	ANL A,#38H
	JNZ LOOP2 	;等待键释放
        LCALL DELAY	;LCALL DISP ;延时
DD:	MOV A,P1	;再次判断,以便去抖
	CPL A
	ANL A,#38H
        JNZ DD 	;等待键释放
	MOV A,R6
	RETX: RET
	NOP
	NOP

;按键处理子程序
ANKEY:	 CLR EA ;关中断
LX:	 MOV A,R6
	JB ACC.3,L1	;是选择键转L1,选择是小时、分还是秒调整
	JB ACC.4,L2 	;是数值增加键转L2
	JB ACC.5,L3	;是确认键转L3

L1:	MOV A,24H
	CJNE A,#03H,NEXTT;不为3,继续增加
	MOV 24H,#00H	;为3清零
NEXTT:	INC 24H		;累计选择键按下次数
	MOV A,24H
	CJNE  A,#01H,LED23	;不为一,则转
	SETB P3.0             	;为一,点亮秒指示灯
	JMP L12
LED23:	MOV A,24H
	CJNE A,#02H,LED3;
	SETB P3.1	;为二,点亮分指示灯
	JMP L12
LED3:      SETB P3.4	;点亮小时指示灯
	JMP L12		;结束

L2:	MOV R0,24H	;判断是哪一位增加	
	CJNE R0,#00H,J0 ;R0不为0,转J0	
	JMP L12

J0:	CJNE R0,#01H,MIN;R0不为一,转
	MOV R1,21H	;R0为一,处理秒
	CJNE R1,#3BH,J1 ;秒不为59,则加一
	MOV 21H,#00H	;秒为59,则清零
	JMP L12
J1:	MOV A,21H
	ADD A,#01H
	DA A
	MOV 21H,A
	JMP L12

MIN:	CJNE R0,#02H,HOUR   ;R0不为2,转
	MOV R1,22H	    ;R0为2,处理分
	CJNE R1,#3BH,J2     ;分不为59,则加一
	MOV 22H,#00H	    ;分为59,则清零
	JMP L12
J2:	MOV A,22H
	ADD A,#01H
	DA A
	MOV 22H,A
	JMP L12

HOUR:	MOV R1,23H	    ;剩下为处理小时
	CJNE R1,#17H,J3     ;小时不为23,则加一
	MOV 23H,#00H	    ;小时为23,则清零
	JMP L12
J3:	MOV A,23H
	ADD A,#01H
	DA A
	MOV 23H,A
	JMP L12
	
L12:	 LCALL DISP 
	LCALL DISP
	LCALL KEY	    ;判断有无键按下
	JZ L12
	LJMP LX

L3:     	SETB EA	    ;开中断
	CLR 24H	
	RET

;延时10mS
DELAY:	 MOV R7,#14H	;1周期
TM:	MOV R6,#0FFH	;1
TM1:	DJNZ R6,TM1	;2
	DJNZ R7,TM	;2
	RET		;2
;1+[1+(2*255)+2]*20+2=10.263ms

	END
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -