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

📄 89c51.asm

📁 89C51A功能板技术指标及特性 A/D采用高精度,速度快(25us)的AD574, CPU为Atmel公司生产的89C51/89C52/89C55等 键盘显示(CZ2)采用8279,
💻 ASM
字号:
;$mod51
		org	0000h
		nop
		ajmp	main
		org	0030h
main:		clr	ea
		clr	a
		mov	psw,a
		mov	ie,a
 		djnz	0e0h,$
		djnz	0e0h,$
		mov	r0,#7fh
init1:		mov	@r0,a
		dec	r0
		cjne	r0,#00h,init1
init8279:	mov	dptr,#7001h
		movx	@dptr,a
		mov	a,#32h
		movx	@dptr,a
		acall	offled
		mov	dptr,#7001h
		mov	a,#80h
		movx	@dptr,a
		mov	dptr,#7000h
		mov	a,#0c8h
		movx	@dptr,a
		mov	30h,#80h
		mov	31h,#40h
wait:		acall	scankey
		jnc	wait
		mov	a,r1
		jb	0e4h,commkey
keynum: 	mov	a,30h		;have key
		mov	dptr,#7001h
		movx	@dptr,a
		mov	a,r1
		mov	r0,31h
		mov	@r0,a
		inc	31h
		mov	dptr,#dispcode
		movc	a,@a+dptr
		mov	dptr,#7000h
		movx	@dptr,a
		inc	30h
		mov	a,30h
		cjne	a,#88h,wait
		mov	30h,#80h
		mov	31h,#40h
		sjmp	wait
commkey:	mov	dptr,#progcomm	;命令键处理
		mov	a,r1
		anl	a,#03h
		rl	a
		jmp	@a+dptr
progcomm:	ajmp	lastp		;last key
		ajmp	nextp		;next key
		ajmp	execp		;exec key
lastp:		setb	7fh		;last key
		ajmp	last1
lasta:		mov	a,dpl		;dptr-1==>dptr
lastb:		subb	a,#01h
		jc	lastd
lastc:		mov	dpl,a
		ajmp	last3
lastd:		dec	dph
		ajmp	lastc
nextp:		clr	7fh		;NEXT KEY
last1:		acall	offled
		acALL	pickdata
		mov	a,48h
		cjne	a,#55h,last2
		jb	7fh,lasta
		inc	dptr
last3:		acall	savedata
		acall	dispall
		ajmp	last4
last2:		mov	48h,#55h
		ajmp	last3
last4:		mov	30h,#84h
		mov	31h,#44h
waitwr: 	acall	scankey 	;l00d0
		jnc	waitwr
		mov	a,r1
		jnb	0e4h,waitwra
		ajmp	commkey
waitwra:	mov	a,30h		;have key
		mov	dptr,#7001h
		movx	@dptr,a
		mov	a,r1
		mov	r0,31h
		mov	@r0,a
		inc	31h
		mov	dptr,#dispcode
		movc	a,@a+dptr
		mov	dptr,#7000h
		movx	@dptr,a
		inc	30h
		mov	a,30h
		cjne	a,#86h,waitwrb
		acall	pickdata
		ajmp	last4
waitwrb:	acall	pickdata
		ajmp	waitwr
execp:		acall	offled
		acall	pickdata
		push	dpl
		push	dph
		ret
delay:		mov	r6,#0ffh
delay1: 	mov	r7,#0ffh
		djnz	r7,$
		djnz	r6,delay1
		ret
keycode:	db	0c1h,0c8h,0c9h,0d0h,0d8h,0e0h,0c2h,0cah
		db	0d1h,0d9h,0dah,0c3h,0cbh,0d2h,0d3h,0dbh
comcode:	db	0e3h,0e2h,0e1h,00h		;last next exec
dispcode:	db	0ch,9fh,4ah,0bh,99h,29h,28h,8fh
		db	08h,09h,88h,38h,6ch,1ah,68h,0e8h
		db	0c8h,3ah,0ech,0ffh
offled: 	mov a,#0dfh
		mov dptr,#7001h
		movx @dptr,a
 offled1:	movx a,@dptr
		jb 0e7h,offled1
		ret
scankey:	mov	dptr,#7001h	    ;等待按键
		movx	a,@dptr
		anl	a,#07h
		cjne	a,#00h,havekey
		clr	c
		ret			;无键则循环
havekey:	mov	dptr,#7000h	;有键
		movx	a,@dptr 	;读键值
		mov	b,a
		mov	r1,#00h
		mov	dptr,#keycode	;查键值表
keyloop:	clr	a
		movc	a,@a+dptr
		cjne	a,b,nokey	;
		ajmp	foundkey	;数字键处理
nokey:		inc	dptr
		inc	r1
		ajmp	keyloop
foundkey:	mov	a,r1
		setb	c
		ret
pickdata:	mov	r0,#41h
		acall	pickone
		mov	dph,a
		mov	r0,#43h
		acall	pickone
		mov	dpl,a
		mov	a,48h
		cjne	a,#55h,pickret
		mov	r0,#45h
		acall	pickone
		movx	@dptr,a
pickret:	ret
pickone:	mov	a,@r0
		anl	a,#0fh
		mov	r1,a
		dec	r0
		mov	a,@r0
		swap	a
		anl	a,#0f0h
		orl	a,r1
		ret
savedata:	movx	a,@dptr
savedata1:	mov	r0,#45h
		acall	saveone
		mov	a,dpl
		acall	saveone
		mov	a,dph
saveone:	mov	r1,a
		acall	savehalf
		mov	a,r1
		swap	a
savehalf:	anl	a,#0fh
		mov	@r0,a
		dec	r0
		ret
dispall:	mov	30h,#80h
		mov	31h,#40h
		mov	r7,#08h
disp1:		mov	dptr,#7001h
		mov	a,30h
		movx	@dptr,a
		mov	r0,31h
		mov	a,@r0
		mov	dptr,#dispcode
		movc	a,@a+dptr
		mov	dptr,#7000h
		movx	@dptr,a
		inc	31h
		inc	30h
		djnz	r7,disp1
		ret
		ORG	0200H
disp8:		mov	sp,#60h 	;'8'字循环
		mov	dptr,#7001h
		clr	a
		movx	@dptr,a
		mov	a,#22h
		movx	@dptr,a
		mov	a,#0dfh
		movx	@dptr,a 	;初始化8279
disp9:		movx	a,@dptr
		jb	0e7h,disp9	;关8279
dispa:		mov	r2,#80h
dispb:		mov	a,r2
		mov	dptr,#7001h
		movx	@dptr,a 	;在哪一位
		mov	a,#08h
		mov	dptr,#7000h
		movx	@dptr,a 	;显示'8'
		lcall	delay		;延时
		mov	a,#0ffh
		mov	dptr,#7000h
		movx	@dptr,a 	;消隐
		inc	r2
		cjne	r2,#88h,dispb	;不到则循环
		ajmp	dispa		;再从第一位开始
		org	0280h
testp1: 	mov	a,#80h		;P1口输出方波
testp1a:	mov	p1,a
		rr	a
		sjmp	testp1a
		org	0300h		;检查8155 RAM
test8155:	mov	40h,#08h
		mov	41h,#01h
		mov	42h,#05h
		mov	43h,#05h
		mov	r7,#0ffh
		mov	dptr,#2000h
test8155a:	mov	a,#55h
		movx	@dptr,a 	;
		cpl	a
		movx	a,@dptr
		cjne	a,#55h,test8155err
		inc	dptr
		djnz	r7,test8155a
test8155b:	mov	44h,#09h	;
		mov	45h,#11h
		mov	46h,#11h
		mov	47h,#0dh
test8155c:	acall	dispall 	;显示'8155 GOOD'
		ajmp	test8155c
test8155err:	mov	44h,#13h	;显示'ERR'
		mov	45h,#0eh
		mov	46h,#12h
		mov	47h,#12h
		ajmp	test8155c
		org	0380h
testport:	mov	dptr,#2100h	;在8155的PA,PB,PC口
		mov	a,#0fh		;分别循环输出方波
		movx	@dptr,a
		mov	a,#01h
testporta:	mov	dptr,#2101h	;PA口
		movx	@dptr,a
		inc	dptr
		movx	@dptr,a 	;PB口
		inc	dptr
		movx	@dptr,a 	;PC口
		rl	a
		ajmp testporta
		org	0400h
test62256:	mov	40h,#02h	;检查62256好坏
		mov	41h,#05h
		mov	42h,#06h
		mov	43h,#13h
		mov	44h,#13h
		mov	dptr,#8000h
test62256a:	mov	a,#55h
		movx	@dptr,a
		cpl	a
		movx	a,@dptr
		cjne	a,#55h,test62256err
		inc	dptr
		mov	a,dph
		jnz	test62256a
		acall	delay
		ajmp	test8155b	;6264 good
test62256err:	mov	45h,#0eh	;6264 err
		mov	46h,#12h
		mov	47h,#12h
		ajmp	test8155c	;6264 err
		ORG	0480H
testad574:	mov	40h,#0ah	;在LED上显示'AD574',
		mov	41h,#0dh	;通道号及电压值
		mov	42h,#05h	;
		mov	43h,#07h
		mov	44h,#04h
		mov	45h,#13h
		mov	46h,#13h
		mov	47h,#13h
		acall	dispall
ad574a: 	acall	scankey 	;
		jnc	ad574a
		mov	a,r1
		anl	a,#07h
		orl	a,#0f8h
		mov	p1,a
ad574b: 	acall	sample
		acall	adtobuff
		acall	dispall
		acall	delay
		sjmp	ad574b
adtobuff:	mov	a,r0		;high 8 bit
		anl	a,#0fh
		mov	46h,a
		mov	a,r0
		swap	a
		anl	a,#0fh
		mov	45h,a
		mov	a,r1
		mov	47h,a
		ret
sample: 	mov	dptr,#4000h	;
		setb	p3.2
		clr	a
		movx	@dptr,a
		jb	p3.2,$
		inc	dptr
		inc	dptr
		movx	a,@dptr
		mov	r0,a		;high 8 bit
		inc	dptr
		movx	a,@dptr
		swap	a
		anl	a,#0fh
		mov	r1,a
		ret
		org	0500h
testda: 	mov	40h,#0dh	;从0832上输出到
		mov	41h,#01h	;ad574的0通道
		mov	42h,#0ah	;并在LED上显示
		nop			;0832,输出值,ad574的
		mov	a,#0f8h
		mov	p1,a
testdaa:	mov	dptr,#6000h	;采样值
		clr	a
		mov	43h,a
		mov	44h,a
		movx	@dptr,a
		djnz	0e0h,$
		acall	sample		;采样ad574
		acall	adtobuff
		acall	dispall 	;显示
		acall	delay		;延时
		mov	dptr,#6000h
		mov	a,#80h
		mov	43h,#08h
		mov	44h,#00h
		movx	@dptr,a
		clr	a
		djnz	0e0h,$
		acall	sample		;采样ad574
		acall	adtobuff
		acall	dispall 	;显示
		acall	delay		;延时
		mov	dptr,#6000h
		mov	a,#0ffh
		mov	43h,#0fh
		mov	44h,#0fh
		movx	@dptr,a
		clr	a
		djnz	0e0h,$
		acall	sample		;采样ad574
		acall	adtobuff
		acall	dispall 	;显示
		acall	delay		;延时
		ajmp	testdaa

		;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时间
		org	0580h
clock:		clr	a		;clock subprog
		mov	40h,a
		mov	41h,a
		mov	43h,a
		mov	44h,a
		mov	46h,a
		mov	47h,a
		mov	a,#13h
		mov	42h,a
		mov	45h,a
		acall	dispall
		mov	30h,#80h
		mov	31h,#40h
inclock:	acall	scankey
		jnc	inclock
		mov	a,r1
		cjne	a,#12h,inclock1
		sjmp	timeexec	;exec key
inclock1:	cjne	a,#0ah,inclock2
inclock2:	jnc	inclock
		mov	a,30h		;have key
		mov	dptr,#7001h
		movx	@dptr,a
		mov	a,r1
		mov	r0,31h
		mov	@r0,a
		inc	31h
		mov	dptr,#dispcode
		movc	a,@a+dptr
		mov	dptr,#7000h
		movx	@dptr,a
		inc	30h
		mov	a,30h
		cjne	a,#82h,inclock3
		inc	30h
		inc	31h
		sjmp	inclock4
inclock3:	cjne	a,#85h,inclock4
		inc	30h
		inc	31h
inclock4:	mov	a,30h
		cjne	a,#88h,inclock
		mov	30h,#80h
		mov	31h,#40h
		sjmp	inclock
timeexec:	mov	r0,#40h
		mov	r1,#52h
		acall	picktime	;52h=hour 51h=minutes
		acall	settime 	;50h=second
rdclockwait:	mov	dptr,#500ah
		movx	a,@dptr
		jb	0e7h,rdclockwait
		acall	rdtime
		acall	savebuff
		acall	dispall
		ajmp	rdclockwait
		nop
		org	0600h
common: 	mov	sp,#60h
		mov	tmod,#20h
		mov	th1,#0fdh
		mov	tl1,#0fdh
		mov	scon,#50h
		mov	pcon,#00h
		clr	ea
		setb	tr1
send:		mov	dptr,#buffer
		mov	r2,#0fh
send1:		clr	a
		movc	a,@a+dptr
		mov	sbuf,a
		jnb	ti,$
		clr	ti
		inc	dptr
		djnz	r2,send1
		jnb	ri,send
		clr	ri
		mov	a,sbuf
		cjne	a,#55h,send
		sjmp	$
buffer: 	db	'Designed by hgh'
picktime:	mov	r2,#03h
picktime1:	mov	a,@r0
		swap	a
		inc	r0
		orl	a,@r0
		mov	@r1,a
		inc	r0
		inc	r0
		dec	r1
		djnz	r2,picktime1
		ret
settime:	mov	r0,#50h
		mov	dptr,#500ah
		movx	a,@dptr
		mov	a,#20h
		movx	@dptr,a
		inc	dptr
		mov	a,#80h
		movx	@dptr,a
		mov	dptr,#5000h
		mov	a,@r0
		inc	r0
		movx	@dptr,a
		inc	dptr
		inc	dptr
		mov	a,@r0
		inc	r0
		movx	@dptr,a
		inc	dptr
		inc	dptr
		mov	a,@r0
		movx	@dptr,a
		mov	dptr,#500bh
		mov	a,#02h
		movx	@dptr,a
		ret
rdtime: 	mov	dptr,#5000h
		movx	a,@dptr
		mov	50h,a		;rd second
		inc	dptr
		inc	dptr
		movx	a,@dptr 	;rd minutes
		mov	51h,a
		inc	dptr
		inc	dptr
		movx	a,@dptr 	;rd hour
		mov	52h,a
		ret
savebuff:	mov	r0,#52h
		mov	r1,#40h
		mov	r2,#03h
savebuff1:	mov	a,@r0
		swap	a
		anl	a,#0fh
		mov	@r1,a
		inc	r1
		mov	a,@r0
		anl	a,#0fh
		mov	@r1,a
		inc	r1
		inc	r1
		dec	r0
		djnz	r2,savebuff1
		ret
		END

⌨️ 快捷键说明

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