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

📄 sl07.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
字号:
;********************************************
;*用十六个键的小键盘在LED数码管上显示数码管字符的组成原理。
;*AT90S8515      8MHz     
;*双龙电子   www.sl.com.cn
;*	   liqing	2002.05.08
;********************************************
.include "8515def.inc"
.org	$000
rjmp	sl07
.org	$020
sl07:	
	ldi r17,$02	;栈指针置初值SP=0x025F
	ldi r16,$5f
	out sph,r17
	out spl,r16
	ldi r17,$0f	;PC口接4*4的十六键键盘
	out ddrc,r17
	ldi r16,$ff
	out ddrb,r16	;PB口接数码管,作字线
	out portc,r16
	out portb,r16	;PD口作位线
	out ddrd,r16
	out portd,r16
	ldi r21,$7f	;选种一位数码管
	out portd,r21
	clr r20
jiance:	
	ldi r17,$fe		;让PC0输出为0
	out portc,r17
	rjmp	jiance0		;检测是否有键按下
jiance11:
	ldi r17,$fd		;让PC1输出为0
	out portc,r17
	rjmp	jiance1		;检测是否有键按下
jiance22:
	ldi r17,$fb		;让PC2输出为0
	out portc,r17
	rjmp	jiance2		;检测是否有键按下
jiance33:
	ldi r17,$f7		;让PC3输出为0
	out portc,r17
	rjmp	jiance3		;检测是否有键按下
	rjmp	jiance		;无键按下循环检测
jiance0:
	in r16,pinc
	sbrs r16,7		;检测键“F”是否按下
	rcall	jianf		;按下则执行“F”键的程序
	sbrs r16,6		;检测键“E”是否按下
	rcall	jiane		;按下则执行“E”键的程序
	sbrs r16,5		;检测键“D”是否按下
	rcall	jiand		;按下则执行“D”键的程序
	sbrs r16,4		;检测键“C”是否按下
	rcall	jianc		;按下则执行“C”键的程序
	rjmp	jiance11
jiance1:
	in r16,pinc
	sbrs r16,7		;检测“B”键是否按下
	rcall	jianb		;按下则执行“B”键的程序
	sbrs r16,6		;检测“A”键是否按下
	rcall	jiana		;按下则执行“A”键的程序
	sbrs r16,5		;检测键“9”是否按下    
	rcall	jian9
	sbrs r16,4
	rcall	jian8		;检测键“8”是否按下
	rjmp	jiance22
jiance2:
	in r16,pinc
	sbrs r16,7		;检测键“7”是否按下
	rcall	jian7
	sbrs r16,6		;检测键“6”是否按下
	rcall	jian6
	sbrs r16,5		;检测键“5”是否按下
	rcall	jian5
	sbrs r16,4		;检测键“4”是否按下
	rcall	jian4
	rjmp	jiance33
jiance3:
	in r16,pinc
	sbrs r16,7		;检测键“3”是否按下
	rcall	jian3
	sbrs r16,6		;检测键“2”是否按下
	rcall	jian2
	sbrs r16,5		;检测键“1”是否按下
	rcall	jian1
	sbrs r16,4		;检测键“0”是否按下
	rcall	jian0
	ldi r22,2
	rcall	delay
	rjmp	jiance		;循环检测键盘

jian0:	
	sbis portb,0		;翻转PB0的输出状态
	rjmp	jian00
	cbi portb,0
	rjmp	jian000
jian00:	sbi portb,0
jian000:
	in r16,pinc
	sbrs r16,4
	rjmp	jian000
	clr r20
	ret

jian1:	
	sbis portb,1		;翻转PB1的输出状态
	rjmp	jian11
	cbi portb,1
	rjmp	jian111
jian11:	sbi portb,1
jian111:
	in r16,pinc
	sbrs r16,5
	rjmp	jian111	
	clr r20
	ret

jian2:	
	sbis portb,2		;翻转PB2的输出状态
	rjmp	jian22
	cbi portb,2
	rjmp	jian222
jian22:	sbi portb,2
jian222:
	in r16,pinc
	sbrs r16,6
	rjmp	jian222
	clr r20
	ret

jian3:	
	sbis portb,3		;翻转PB3的输出状态
	rjmp	jian33
	cbi portb,3
	rjmp	jian333
jian33:	sbi portb,3
jian333:
	in r16,pinc
	sbrs r16,7
	rjmp	jian333
	clr r20
	ret


jian4:	
	sbis portb,4		;翻转PB4的输出状态
	rjmp	jian44
	cbi portb,4
	rjmp	jian444
jian44:	sbi portb,4
jian444:
	in r16,pinc
	sbrs r16,4
	rjmp	jian444
	clr r20
	ret

jian5:	
	sbis portb,5		;翻转PB5的输出状态
	rjmp	jian55
	cbi portb,5
	rjmp	jian555
jian55:	sbi portb,5
jian555:
	in r16,pinc
	sbrs r16,5
	rjmp	jian555
	clr r20
	ret

jian6:	
	sbis portb,6		;翻转PB6的输出状态
	rjmp	jian66
	cbi portb,6
	rjmp	jian666
jian66:	sbi portb,6
jian666:
	in r16,pinc
	sbrs r16,6
	rjmp	jian666
	clr r20
	ret


jian7:	
	sbis portb,7		;翻转PB7的输出状态
	rjmp	jian77
	cbi portb,7
	rjmp	jian777
jian77:	sbi portb,7
jian777:
	in r16,pinc
	sbrs r16,7
	rjmp	jian777
	clr r20
	ret


jian8:			;让数码管显示特定的字符	
	ldi zh,high(tab*2)
	ldi zl,low(tab*2)
	add zl,r20
	lpm
	out portb,r0
	inc r20
	cpi r20,$10
	brlo	jian888
	clr r20
jian888:
	in r16,pinc
	sbrs r16,4
	rjmp	jian888
	ret

jian9:			;改变数码管的位线
	sec
	ror r21
	cpi r21,$f7
	brne	jian99
	ldi r21,$7f
jian99:	out portd,r21
jian999:
	in r16,pinc
	sbrs r16,5
	rjmp	jian999	
	ret

jiana:			;无效键
	ret

jianb:	
	ret

jianc:	
	ret

jiand:	
	ret

jiane:	
	ret

jianf:	
	ret

tab:	.db $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90
	.db $88,$83,$c6,$a1,$86,$8e

delay:		;延时
t1:	ldi r23,$200
t2:	ldi r24,$200
t3:	dec r24
	brne	t3
	dec r23
	brne	t2
	dec r22
	brne	t1
	ret
		
	

⌨️ 快捷键说明

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