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