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

📄 clock.asm

📁 一个时间程序
💻 ASM
字号:


CONT2   EQU     20         	        ;延迟10毫秒时间常数(可调整)
KSCAN:	MOV	P1,#0F0H                ;先判有无键按下,扫描码为0F0H
	MOV     A, P1                       ;读键盘状态
	CJNE    A,  #0F0H,AGAIN	     ;有键按下转再次扫描
	RET			     ;无键按下返回
AGAIN:
        LCALL DLAY10		        ;为去抖动而延迟10毫秒
	MOV P1,	#0F0H		        ;再次扫描码为0F0H
	MOV A, P1		       ;读键盘状态
	CJNE A,#0F0H, OK	;确实有键按下转OK
	RET			;无键按下返回
OK:	MOV R3,	A		;保存第一次扫描值
	MOV P1,	#0FH		;第二次扫描码为0FH
	MOV A, P1	        ;取第二次扫描值
	ORL A, R3	        ;与第一次扫描值合成键值
	MOV R3, A		;键值保存于R3
LOOP:	MOV P1,	#0F0H		;等待松键
	MOV A,	P1		;读键盘状态
	CJNE A,	#0F0H,	LOOP	;未松键就再等待
;键号译码
DCODK:	MOV DPTR,#CDKTBL     	;键值表首址送DPTR
	MOV B,	#12		;限制最多查表次数为12次
	MOV A,	#0		;从0号键开始查表
LOOP1:	PUSH ACC			;保护键号
	MOVC A,	@A+DPTR	        ;查键值表
	CJNE	A,03H,	NEXT1	;未查到就再查下一个
	POP	ACC		;恢复键号
	MOV	R3,A		;保存键号
	SJMP	KFUNC		;查到则转判按键类型程序
NEXT1:	POP	ACC		;恢复键号
	INC	A		;指向下一个键号
	SJMP	LOOP1		;再查下一个
;键盘功能程序
KFUNC:	MOV	A,#9		;判按键类型,设置最大数字键号
	SUBB	A,R3		;与扫描到的键号比较
	JNC	JP1		;是数字键转JP1
        SJMP    JP2
JP1:    CLR     79H		;清功能键标志
        SETB	78H		;置数字键标志
        SJMP    JP3 
JP2:    CLR     78H		;清数字键标志
        SETB	79H		;置功能键标志
JP3:	RET
DLAY10: MOV	R4,#CONT2	;延迟10毫秒
JP4:	MOV	R5,#0
		DJNZ	R5,$
		DJNZ	R4,JP4
		RET
;键值表
CDKTBL:	DW 7D7BH,77BDH,0BBB7H,0DDDBH,0D7EDH,0EBE7H

;显示器驱动程序(DSPLY.ASM)


CONT1   EQU     06H                     ;延迟3毫秒的时间常数(可调整)
DSPLY:	MOV	DPTR,	#CCDTBL			;字形码表首址送DPTR
		MOV     R0,  #30H		;8位地址指针指向最右边显示位
		MOV 	36H, #0FEH		;位选码初值送36H单元
		MOV	R2,  #6			;显示位数初值送计数器R2
LOOP2:	MOV	A,	#0FFH			;先关显示器,位选码为0FFH
		MOV	P2, A
		MOV	P0, A			;字形码也为0FFH写入显示器
		MOV	A, 36H			;取位选码
		MOV	P2, A			;
		MOV	A, @R0			;取更新显示数据
		MOVC	A, @A+DPTR		;查字形码表
		MOV     P0,  A			;写入显示器
		MOV	R4, #CONT1		;延迟3毫秒
LOOP3:	MOV		R5, #0
		DJNZ	R5, $
		DJNZ	R4, LOOP3
		MOV	A, 36H			;产生下一位字选码
		RL	A
		MOV	36H, A
		INC	R0			;拨指针,准备扫描下一位
		DJNZ	R2, LOOP2		;扫描位数计数,未完就重复
		RET
;字符"0" ~"9"的字形码表(0电平有效)
CCDTBL:	DW 4079H,2430H,1912H,0278H,0010H



;⑷ 初始化程序

INIT:	MOV	A,	#0
	MOV	R0,	#30H			;显示数据缓冲单元清0
	MOV	B,	#9
LLOP:	MOV	@R0,	A
	INC	R0
	DJNZ	B,	LLOP
	MOV	2FH,	#0			;按键标志清0
	MOV	2EH,	#100			;"秒"定时计数器计数初值
	MOV	TH0,	#0D8H			;T0定时10mS时间常数
	MOV	TL0,	#0F0H			;(Fosc=12MHz)
	SETB	TR0				;启动T0计数
	SETB	ET0				;允许T0中断
	SETB	EA				;开系统中断
;⑶ 定时中断服务程序(TIMER.ASM)

;定时器中断服务程序:用T0定时10mS,时间常数为 D8F0H,
;用2EH单元做计数器,初值为100。"时、分、秒"数据分别经过
;37H,38H,39H单元转换后装入30H,31H,32H,33H,34H,35H单元。

TIMR:	MOV	TH0,	#0D8H			;重装时间常数
	MOV	TL0,	#0F0H
	DJNZ	2EH,	TJPP			;未够1秒转
	MOV	2EH,	#100			;够1秒重装计数初值
	PUSH	ACC
	MOV	A,	37H			;秒加1
        ADD	A,	#1
	DA	A				;BCD调整
	MOV	37H,	A
	XRL	A,	#60H		;够60秒否?
	JZ	TJP0			;够60秒转
	MOV	A,	37H		;拆字分装
	ANL	A,	#0FH
	MOV	30H,	A
	MOV	A,	37H
	SWAP	A
		ANL	A,	#0FH
		MOV	31H,	A
TJPP: 	LJMP	TJPN				;未够60秒返回
TJP0:	MOV	37H,	#0			;够60秒复0
	MOV	A,	37H		;拆字分装
	ANL	A,	#0FH
	MOV	30H,	A
	MOV	A,	37H
	SWAP	A
	ANL	A,	#0FH
	MOV	31H,	A
	MOV	A,	38H			;分加1
	ADD	A,	#1
	DA	A	 			;BCD调整
	MOV	38H,	A
	XRL	A,	#60H			;够60分否?
	JZ	TJP1				;够60分转
	MOV	A,	38H			;拆字分装
	ANL	A,	#0FH
	MOV	32H,	A
	MOV	A,	38H
	SWAP	A
	ANL	A,	#0FH
	MOV	33H,	A
	LJMP	TJPN			;未够60分返回
TJP1:	MOV	38H,	#0		;够60分复0
	MOV	A,	38H		;拆字分装
	ANL	A,	#0FH
	MOV	32H,	A
	MOV	A,	38H
	SWAP	A
	ANL	A,	#0FH
	MOV	33H,	A
	MOV	A,	39H		;时加1
	ADD	A,	#1
	DA	A	        	;BCD调整
	MOV	39H,	A
	XRL	A,	#24H		;够24时否?
	JZ	TJP2			;够24时转
	MOV	A,	39H		;拆字分装
	ANL	A,	#0FH
	MOV	34H,	A
	MOV	A,	39H
	SWAP	A
	ANL	A,	#0FH
	MOV	35H,	A
	LJMP	TJPN	        	;未够24时返回
TJP2:	MOV	39H,	#0		;够24时复0
	MOV	A,	39H	;拆字分装
	ANL	A,	#0FH
	MOV	34H,	A
	MOV	A,	39H
	SWAP	A
	ANL	A,	#0FH
	MOV	35H,	A
TJPN: 	POP	ACC
		RETI

END

⌨️ 快捷键说明

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