📄 key.asm
字号:
.include "c:\appnotes\8515def.inc"
.org $000
rjmp main
.org $007
rjmp timer0
.org $008
rjmp SPI_TXC
.org $00d
MAIN: ldi r17,$5f
out SPL,r17
ldi r17,$02
out SPH,r17 ;setup STACK pointer in internal SRAM so that
;RCALL and interrupt subroutine can use it for
; return
ldi r25,$80
out SREG,r25 ;enable globle interrupt
;ldi r17,$08
;out WDTCR,r17;enable watchdog
;wdr ;reset wachdog
ldi r17,$02
out TIMSK,r17;enable timer0 overflow
ser r16
out DDRB,r16 ;portb is output mode and turn off all LEDS
sbi DDRB,5 ;set MOSI(PB.5) output mode whwn SPI is master.
sbi DDRB,7 ;set SCK (PB.7) output mode when SPI is master
sbi DDRB,4 ;set SS output mode so that this byte cann't
;influence SPI master work mode .
ldi r17,0b11111100
out SPCR,r17 ;set SPE,MSTR,CPOL,CPHA ,reset the others
clr r17
out SPDR,r17 ;clear all display
start:rcall ksi
cpi r18 ,0 ; r18 is used to distingulish
; if any key is push down
breq return
rjmp lk1
return:rjmp main
lk1:rcall delay
rcall ksi
cpi r18 ,0
brne lk0
rjmp start
lk0: ldi r18,$ef
clr r20 ;r20 is column number
lk4: out SPDR,r18
;wait: sbis SPSR,7
; rjmp wait
sbis PIND,6
rjmp line0
rjmp lone
line0:ldi r19,0 ; R19 is this line first key number
rjmp lkp
lone: sbis PIND,5
rjmp line1
rjmp ltwo
line1:ldi r19,$04
rjmp lkp
ltwo: sbis PIND,4
rjmp line2
rjmp lthree
line2:ldi r19,$08
rjmp lkp
lthree:sbis PIND,3
rjmp line3
rjmp next
line3:ldi r19,$0c
lkp:add r20,r19 ;r20 is final key number
lkp0:rcall ksi
cpi r18,0
breq exit
rjmp lkp0
exit:rjmp display
next:inc r20
sec
rol r18
rjmp lk4
ksi: ldi r17,$00
out SPDR,r17
in r18,PIND
neg r18
andi r18,$78
ret
delay:ldi r21,$01
d2:ldi r22,$01
d1:ldi r23,$01
d0:dec r23
;wdr
brne d0
dec r22
brne d1
dec r21
brne d2
ret
timer0:reti
SPI_TXC:reti
.org $0100
seg_code:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07
.db $7f,$6f,$77,$7c,$39,$5e,$79,$71
display: rcall flash_ram
ldi YL,$60
ldi YH,$00
add YL,r20
ld r20,Y
led_disp:out SPDR , r20
ldi r17,$01
out PORTB,r17 ;PB.0 output 1 ,the rightest LED
;display key number
rjmp ext
flash_ram: ldi YL,$60
ldi YH,$00 ;RAM begin address
ldi ZL ,low(seg_code*2) ; load Z register low byte
ldi ZH ,high(seg_code*2); load Z register high byte
ldi r18,$10 ;flash data block size
load_flash:lpm
st Y+,r0
adiw ZL,1
dec r18
brne load_flash
ret
ext: .exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -