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

📄 zh8.asm

📁 the practice of proteus and avr
💻 ASM
字号:
.device AT90S8535
.equ    sph     =$3E
.equ    spl     =$3D
.equ    TIMSK   =$39
.equ    OCR1AH  =$2B
.equ    OCR1AL  =$2A
.equ    TCCR1B  =$2E
.equ    SREG	=$3F
.equ    TCNT1H	=$2D
.equ    TCNT1L	=$2C
.equ	PORTA	=$1B
.equ	DDRA	=$1A
.equ    PINA    =$19
.equ	PORTB	=$18
.equ	DDRB	=$17
.equ    PINB    =$16
.equ	PORTC	=$15
.equ	DDRC	=$14
.equ    PINC    =$13
.equ	PORTD	=$12
.equ	DDRD	=$11
.equ    PIND    =$10
.def 	XL     	=r26
.def 	XH     	=r27

	.org	$0000
	rjmp	main
	.org	$006
	rjmp	t1_cp

main:	ldi	r16,$02			;栈指针置初值
	out	sph,r16
	ldi	r16,$5f
	out	spl,r16
	ldi	r16,$ff			;PA、PB、PD口定义为输出口
	out	DDRA,r16
	out	DDRB,r16
	out	DDRD,r16
	ldi	r16,$00			;PC口定义为输入口
	out	DDRC,r16
	ldi	r22,$00
	sbi	PORTA,0
	ldi	r16,$10			;允许T1比较匹配A中断
	out	TIMSK,r16
	clr	r16			;置TCNT1初值为0
	out	TCNT1L,r16
	out	TCNT1H,r16
	ldi	r16,$7a			;OCRLA置$7A12,即1s中断1次
	out	OCR1AH,r16
	ldi	r16,$12
	out	OCR1AL,r16
	ldi	r16,$0c			;T/C1对主频256分频定时
	out	TCCR1B,r16
	ldi	XL,$60
	ldi	XH,$00
	ldi	r16,$00			;段码存储区清0
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
	ldi	r16,$79
	st	X+,r16
	ldi	r16,$73
	st	X+,r16
	ldi	r16,$06			;设置初始密码为"123456"
	st	X+,r16
	dec	r16
	st	X+,r16
	dec	r16
	st	X+,r16
	dec	r16
	st	X+,r16
	dec	r16
	st	X+,r16
	dec	r16
	st	X+,r16
	ldi	r16,$00			;输入密码存储区清0
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
	st	X+,r16
a0:	rcall	disp
;**********************************************************
lscan:	ldi	r16,$f0			;键盘扫描程序
	out	DDRC,r16
	out	PORTC,r16
l1:	in	r16,PINC
	cpi	r16,$f1
	brne	l2
	rcall	t1ms
	in	r16,PINC
	cpi	r16,$f1
	brne	l2
	ldi	r17,$00
	rjmp	rscan
l2:	cpi	r16,$f2
	brne	l3
	rcall	t1ms
	cpi	r16,$f2
	brne	l3
	ldi	r17,$01
	rjmp	rscan
l3:	cpi	r16,$f4
	brne	l4
	rcall	t1ms
	cpi	r16,$f4
	brne	l4
	ldi	r17,$02
	rjmp	rscan
l4:	cpi	r16,$f8
	brne	a0
	rcall	t1ms
	cpi	r16,$f8
	brne	a0
	ldi	r17,$03
rscan:	ldi	r16,$0f
	out	DDRC,r16
	out	PORTC,r16
c1:	in	r16,PINC
	cpi	r16,$e0
	brne	c2
	ldi	r18,$00
	rjmp	calcu
c2:	cpi	r16,$d0
	brne	c3
	ldi	r18,$01
	rjmp	calcu
c3:	cpi	r16,$b0
	brne	lscan
	ldi	r18,$02
;**********************************************************
calcu:	cpi	r17,$00			;计算键号
	brne	calcu1
	ldi	r17,$00
	rjmp	cb
calcu1:	cpi	r17,$01
	brne	calcu2
	ldi	r17,$03
	rjmp	cb
calcu2:	cpi	r17,$02
	brne	calcu3
	ldi	r17,$06
	rjmp	cb
calcu3:	ldi	r17,$09
cb:	add	r17,r18
;**********************************************************
	cpi	r17,$0a			;是否为"CLR"键
	brne	j1
	cpi	r22,$00
	brne	j2
	rcall	alarm1
	rjmp	main
;**********************************************************
j2:	rcall	shiftr
	dec	r22
	rcall	w0
	rjmp	a0
;**********************************************************
j1:	cpi	r17,$0b			;判断是否为"ENTER"键
	brne	j3
	cpi	r22,$06
	brne	j4
;**********************************************************
com:	ldi	r16,$06			;比较密码
	mov	r4,r16
	ldi	XL,$6e			;输入密码暂存区
	ldi	XH,$00
agai:	ld	r16,X
	mov	r19,r16
	ldi	r16,$06
	sub	XL,r16
	ld	r16,X+
	cpse	r16,r19			;比较
	rjmp	j5
	ldi	r16,$06
	add	XL,r16
	dec	r4
	brne	agai
	cbi	PORTA,0
	rjmp	fini
;**********************************************************
j5:	rcall	alarm2
	rjmp	main
;**********************************************************
j4:	rcall	alarm1
	rjmp	main
;**********************************************************
j3:	inc	r22			;按下数字键
	cpi	r22,$07
	brne	k1
	rcall	alarm1
	rcall	w0			;等待按键抬起
	rjmp	main
;**********************************************************
k1:	rcall	shiftl
	rcall	w0
	rjmp	a0
;**********************************************************
alarm1:	sbi	PORTA,7			;操作错误报警
	ldi	r21,$01
	sei
	ret
;**********************************************************
alarm2:	sbi	PORTA,7			;密码错误报警
	ldi	r21,$03
	sei
	ret
;**********************************************************
					;等待按键抬起
w0:	rcall	disp
	ldi	r20,$f0
	out	PORTC,r20
w1:	in	r20,PINC
	andi	r20,$ff
	cpi	r20,$f0
	brne	w2
	ret
w2:	rjmp	w0
;**********************************************************
shiftl:	ldi	r16,$05			;段码,输入密码右移子程序
	mov	r3,r16
	ldi	XL,$64
	ldi	XH,$00
l:	ld	r16,x+
	st	x,r16
	dec	XL
	dec	XL
	dec	r3
	brne	l
	inc	XL
	ldi	r16,$40
	st	x,r16
	ldi	r16,$05
	mov	r3,r16
	ldi	XL,$72
	ldi	XH,$00
left2:	ld	r16,x+
	st	x,r16
	dec	XL
	dec	XL
	dec	r3
	brne	left2
	inc	XL
	st	x,r17
	ret	
;**********************************************************
shiftr:	ldi	r16,$05			;段码,输入密码右移子程序
	mov	r3,r16
	ldi	XL,$61
	ldi	XH,$00
r:	ld	r16,x
	dec	XL
	st	x+,r16
	inc	XL
	dec	r3
	brne	r
	dec	XL
	ldi	r16,$00
	st	x,r16
	ldi	XL,$6e
	ldi	XH,$00
	ldi	r16,$05
	mov	r3,r16
rr:	ld	r16,x
	dec	XL
	st	x+,r16
	inc	XL
	dec	r3
	brne	rr
	dec	XL
	ldi	r16,$00
	st	x,r16
	ret
;**********************************************************
disp:					;显示控制子程序
	ldi	XL,$60
	ldi	XH,$00
	ldi	r16,$fe			;送个位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fd			;送十位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$fb			;送百位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16
	rcall	t1ms
	ldi	r16,$f7			;送千位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$ef			;送万位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$df			;送十万位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16
	rcall	t1ms
	ldi	r16,$bf			;送百万位位线
	out	PORTD,r16
	ld	r16,x+
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ldi	r16,$7f			;送千万位位线
	out	PORTD,r16
	ld	r16,x
	out	PORTB,r16		;查7段码,送B口输出
	rcall	t1ms			;延时1ms
	ret
;**********************************************************
					;延时
t1ms:	ldi	r24,71			;延时1ms子程序
	push	r24
del2:	push	r24
del3:	dec	r24
	brne	del3
	pop	r24
	dec	r24
	brne	del2
	pop	r24
	ret
;**********************************************************
t1_cp:	dec	r21
	brne	cp
	cbi	PORTA,7
	cli
cp:	reti
;**********************************************************
fini:	ldi	XL,$60
	ldi	XH,$00
	ldi	r16,$40			;段码存储区设置为HELLO---
	st	X+,r16
	ldi	r16,$40
	st	X+,r16
	ldi	r16,$40
	st	X+,r16
	ldi	r16,$5c
	st	X+,r16
	ldi	r16,$38
	st	X+,r16
	ldi	r16,$38
	st	X+,r16
	ldi	r16,$79
	st	X+,r16
	ldi	r16,$76
	st	X+,r16
fin:	rcall	disp
	rjmp	fin

⌨️ 快捷键说明

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