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

📄 wenxu.asm

📁 一个单片机的数字钟程序(注释清晰)
💻 ASM
字号:
Z8279 equ 0ff82h
D8279 equ 0ff80h
LEDMOD equ 00h
LEDFEQ equ 38h
LEDCLS equ 0d1h
LEDWRO equ 90h

HOUR equ 28h	;存放当前时间
MINITE equ 29h
SECOND equ 2ah
T_HOUR equ 2bh	;调cmp前临时放入报时时间
T_MINITE equ 2ch
T_SECOND equ 2dh

WORK1 equ 2eh	;四个报时时间
NOON  equ 30h
WORK2 equ 32h
NIGHT  equ 34h

STATE equ 36h	;为1时正常走时,为0时正在修改时间

	org 0000h
	ajmp start
	org 000bh
	ajmp T0INT
	org 0040h
start:
	mov r1,#20h
	mov r2,#08h
	mov a,#00h
loop22:
	mov @r1,a	;清RAM 20H-27H
	inc r1
	djnz r2,loop22
	
	mov a,#00h
	mov p1,a	;置L1和L2灯灭
	mov WORK1,#08h	;初始化报时时间
	mov WORK1+1,#00h
	mov NOON,#11h
	mov NOON+1,#30h
	mov WORK2,#12h
	mov WORK2+1,#30h
	mov NIGHT,#17h
	mov NIGHT+1,#00h
	
	mov sp,#60h
	lcall INIT8279
	clr tf0
	mov r7,#00h	;当前时间00:00:00
	mov HOUR,r7
	mov MINITE,r7
	mov SECOND,r7
	mov tmod,#01h	;定时器
	mov th0,#4bh
	mov tl0,#0fch
	mov ie,#82h
	mov r2,#14h
	setb tr0
	mov STATE,#01h
start1:
	lcall TEST_BCDE
	lcall TEST_A
	sjmp start1
;**************************************
;		LED显示
;**************************************
init8279:
	push dph
	push dpl
	push acc
	push 02h
	push 01h
	mov a,STATE
	cjne a,#01h,loop55
	mov r1,#20h
	mov r2,#08h
	mov dptr,#Z8279
	mov a,#LEDMOD
	movx @dptr,a
	mov a,#LEDFEQ
	movx @dptr,a	
	mov dptr,#Z8279
	mov a,#LEDWRO
	movx @dptr,a
	mov dptr,#D8279
loop33:
	mov a,@r1
	movx @dptr,a
	inc r1
	djnz r2,loop33
loop55:	
	pop 01h
	pop 02h
	pop acc
	pop dpl
	pop dph
	ret
;************************************
;		延时
;************************************
delay:
	push 00h
	push 01h
	mov r0,#00h
delay1:
	mov r1,#00h
	djnz r1,$
	djnz r0,delay1
	pop 01h
	pop 00h
	ret
;*************************************
;		定时中断
;*************************************
T0INT:
	push acc
	mov th0,#4bh
	mov tl0,#0fch
	djnz r2,loop4	;判断2秒到(L1灯)
	djnz r6,next2
	clr p1.0
	
next2:			;时间加1秒
	mov a,SECOND
	add a,#01h	;秒
	da a
	mov SECOND,a
	cjne a,#60h,next1
	mov a,#00h
	mov SECOND,a
	mov a,MINITE	;分
	add a,#01h
	da a
	mov MINITE,a
	cjne a,#60h,next1
	mov a,#00h
	mov MINITE,a
	mov a,HOUR
	add a,#01h
	da a
	mov HOUR,a	;时
	cjne a,#24h,next1
	mov a,#00h
	mov HOUR,a
	
next1:			;时间送20H-27H以显示
	mov dptr,#LEDSEG
	mov r7,SECOND	;秒
	lcall CHAIFEN
	mov a,r3
	movc a,@a+dptr
	mov 20h,a
	mov a,r4
	movc a,@a+dptr
	mov 21h,a
	
	mov r7,MINITE	;分
	lcall CHAIFEN
	mov a,r3
	movc a,@a+dptr
	mov 23h,a
	mov a,r4
	movc a,@a+dptr
	mov 24h,a
	
	mov r7,HOUR	;时
	lcall CHAIFEN
	mov a,r3
	movc a,@a+dptr
	mov 26h,a
	mov a,r4
	movc a,@a+dptr
	mov 27h,a
	
	mov r2,#14h
	lcall INIT8279
	lcall BAOSHI
loop4:
	pop acc
	reti
;*************************************
;		修改时间
;*************************************
TEST_A:
	clr ea
	mov dptr,#Z8279
	movx a,@dptr
	anl a,#0fh
	jz  LOOP_A3
	ajmp LOOP_A4
LOOP_A3:
	ljmp RETURN_A
LOOP_A4:
	mov a,#40h
	movx @dptr,a
	mov dptr,#D8279
	movx a,@dptr
	mov r5,a
	cjne r5,#0ah,LOOP_A3	;按键为A
LOOP_A:	
	mov r1,#20h
	mov a,#00h
	mov r2,#08h
LOOP_A1:
	mov @r1,a
	inc r1
	djnz r2,LOOP_A1
	lcall init8279
	
	mov SECOND,#00h
	mov MINITE,#00h
	mov HOUR,#00h
	
	lcall scan	;小时高位
	mov r4,#07h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov HOUR,a
	lcall scan	;小时低位
	mov r4,#06h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	orl HOUR,a
	
	lcall scan	;分
	mov r4,#04h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov MINITE,a
	lcall scan
	mov r4,#03h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	orl MINITE,a
	
	lcall scan	;秒
	mov r4,#01h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov SECOND,a
	lcall scan
	mov r4,#00h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	orl SECOND,a
	
LOOP_A2:
	lcall scan	;按键F
	cjne r5,#0fh,LOOP_A2
	
	mov r2,#14h
	mov a,SECOND
	subb a,#60h	;容错
	jnb cy, LOOP_A5
	mov a,MINITE
	subb a,#60h
	jnb cy, LOOP_A5
	mov a,HOUR
	subb a,#24h
	jnb cy, LOOP_A5
	ajmp RETURN_A
LOOP_A5:
	ljmp LOOP_A
	
RETURN_A:
	setb ea
	ret
;****************************************
;		修改报时时间
;****************************************
TEST_BCDE:
	mov dptr,#Z8279
	movx a,@dptr
	anl a,#0fh
	jz  LOOP_B1
	ajmp LOOP_B2
LOOP_B1:
	ljmp RETURN_B
LOOP_B2:	
	mov STATE,#00h	;状态--不显示当前时间
	mov a,#40h
	movx @dptr,a
	mov dptr,#D8279
	movx a,@dptr
	mov r5,a
	cjne r5,#0bh,NEXTB1	;按键B时,改WORK1
BB:
	mov dptr,#Z8279
	mov a,#0d1h
	movx @dptr,a
	lcall delay
	lcall clrled
	lcall scan	;小时高位
	mov r4,#07h
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov WORK1,a
	lcall scan	;小时低位
	mov r4,#06h		
	lcall disled
	mov a,r5
	anl a,#0fh
	orl WORK1,a
	
	lcall scan
	mov r4,#04h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov WORK1+1,a
	lcall scan
	mov r4,#03h
	mov a,r5	
	lcall disled
	mov a,r5
	anl a,#0fh
	orl WORK1+1,a
NEXTBB:
	lcall scan
	cjne r5,#0fh,NEXTBB	;按键F结束
	mov a,WORK1+1
	subb a,#60h	;容错
	jnb cy, BB
	mov a,WORK1
	subb a,#24h
	jnb cy, BB
	ajmp RETURN_B	
NEXTB1:			;按键C时,改NOON
	cjne r5,#0ch,NEXTB2
BC:
	lcall clrled
	lcall scan
	mov r4,#07h
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov NOON,a
	lcall scan
	mov r4,#06h		
	lcall disled
	mov a,r5
	anl a,#0fh
	orl NOON,a
	
	lcall scan
	mov r4,#04h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov NOON+1,a
	lcall scan
	mov r4,#03h
	mov a,r5	
	lcall disled
	mov a,r5
	anl a,#0fh
	orl NOON+1,a
NEXTBC:
	lcall scan
	cjne r5,#0fh,NEXTBC
	mov a,NOON+1
	subb a,#60h
	jnb cy, BC
	mov a,NOON
	subb a,#24h
	jnb cy, BC
	ajmp RETURN_B	
NEXTB2:			;按键D时,改work2
	cjne r5,#0dh,NEXTB3
BD:
	lcall clrled
	lcall scan
	mov r4,#07h
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov WORK2,a
	lcall scan
	mov r4,#06h		
	lcall disled
	mov a,r5
	anl a,#0fh
	orl WORK2,a
	
	lcall scan
	mov r4,#04h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov WORK2+1,a
	lcall scan
	mov r4,#03h
	mov a,r5	
	lcall disled
	mov a,r5
	anl a,#0fh
	orl WORK2+1,a
NEXTBD:
	lcall scan
	cjne r5,#0fh,NEXTBD
	mov a,WORK2+1
	subb a,#60h
	jnb cy, BD
	mov a,WORK2
	subb a,#24h
	jnb cy, BD
	ajmp RETURN_B
NEXTB3:			;按键E时,改NIGHT
	cjne r5,#0eh,RETURN_B
BE:
	lcall clrled
	lcall scan
	mov r4,#07h
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov NIGHT,a
	lcall scan
	mov r4,#06h		
	lcall disled
	mov a,r5
	anl a,#0fh
	orl NIGHT,a
	
	lcall scan
	mov r4,#04h
	mov a,r5
	lcall disled
	mov a,r5
	anl a,#0fh
	swap a
	mov NIGHT+1,a
	lcall scan
	mov r4,#03h
	mov a,r5	
	lcall disled
	mov a,r5
	anl a,#0fh
	orl NIGHT+1,a
NEXTBE:
	lcall scan
	cjne r5,#0fh,NEXTBE
	mov a,NIGHT+1
	subb a,#60h
	jnb cy, BE
	mov a,NIGHT
	subb a,#24h
	jnb cy, BE
	ajmp RETURN_B
RETURN_B:		;状态--显示当前时间
	mov STATE,#01h
	ret
;*****************************************
;		屏幕清零
;*****************************************
clrled:	
	push dph
	push dpl
	push acc
	mov a,#LEDWRO
	mov r4,#00h
	mov r5,#08h	
	mov dptr,#Z8279
clrled1:
	add a,r4
	movx @dptr,a
	mov a,#00h
	mov dptr,#D8279
	movx @dptr,a
	djnz r5,clrled1
	pop acc
	pop dpl
	pop dph
	ret
;**********************************
;		报时
;**********************************
BAOSHI:
	mov T_HOUR,WORK1	;工作
	mov T_MINITE,WORK1+1;
	mov T_SECOND,#00h
	lcall CMP
	cjne r5,#01h,BAOSHI1
	setb p1.0
	mov r6,#2
	ajmp BAOSHI_R
BAOSHI1:
	mov T_HOUR,NOON		;午休
	mov T_MINITE,NOON+1;
	mov T_SECOND,#00h
	lcall CMP
	cjne r5,#01h,BAOSHI2
	setb p1.0
	setb p1.1
	mov r6,#2
	ajmp BAOSHI_R
BAOSHI2:
	mov T_HOUR,NOON		;午休+1小时
	mov T_MINITE,NOON+1;
	mov T_SECOND,#00h
	mov a,T_HOUR
	add a,#01h
	da a
	mov T_HOUR,a
	lcall CMP
	cjne r5,#01h,BAOSHI3
	clr p1.1
	ajmp BAOSHI_R
BAOSHI3:
	mov T_HOUR,WORK2	;下午
	mov T_MINITE,WORK2+1;
	mov T_SECOND,#00h
	lcall CMP
	cjne r5,#01h,BAOSHI4
	setb p1.0
	mov r6,#2
	ajmp BAOSHI_R
BAOSHI4:
	mov T_HOUR,NIGHT	;下班
	mov T_MINITE,NIGHT+1;
	mov T_SECOND,#00h
	lcall CMP
	cjne r5,#01h,BAOSHI5
	setb p1.0
	setb p1.1
	mov r6,#2
	ajmp BAOSHI_R
BAOSHI5:
	mov T_HOUR,NIGHT	;下班+10分钟
	mov T_MINITE,NIGHT+1;
	mov T_SECOND,#00h
	mov a,T_MINITE
	add a,#10h
	da a
	mov T_MINITE,a
	lcall CMP
	cjne r5,#01h,BAOSHI_R
	clr p1.1
BAOSHI_R:
	ret
;*********************************************
;	时间比较,相等时r5=1,否则r5=0
;*********************************************
CMP:
	mov a,HOUR
	cjne a,T_HOUR,CMP1
	mov a,MINITE
	cjne a,T_MINITE,CMP1
	mov a,SECOND
	cjne a,T_SECOND,CMP1
	mov r5,#01h
	ajmp CMP2
CMP1:
	mov r5,#00h
CMP2:
	ret
;*********************************************
;		扫描一按键送r5
;*********************************************
scan:
	mov dptr,#Z8279	
	movx a,@dptr
	anl a,#0fh
	jz  scan
	mov a,#40h
	movx @dptr,a
	mov dptr,#D8279
	movx a,@dptr
	mov r5,a
	ret
;********************************************
;		显示a到偏移为r4处
;********************************************
disled:
	push dph
	push dpl
	push acc
	mov a,#LEDWRO
	add a,r4
	mov dptr,#Z8279
	movx @dptr,a
	mov dptr,#LEDSEG
	mov a,r5
	movc a,@a+dptr
	mov dptr,#D8279
	movx @dptr,a
	pop acc
	pop dpl
	pop dph
	ret
;**********************************************
;      拆分字符,传入r7,r4--高位,r3--低位
;**********************************************
CHAIFEN:
	push acc
	mov a,r7
	mov r3,a
	mov r4,a
	mov a,#0fh
	anl a,r3
	mov r3,a
	mov a,#0f0h
	anl a,r4
	swap a 
	mov r4,a
	pop acc
	ret
	
LEDSEG:
	db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
	db 7fh,6fh,77h,7ch,39h,5eh,79h,71H
	end

⌨️ 快捷键说明

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