📄 zh8.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 + -