📄 sl08.lst
字号:
.equ DDD3 =3
.equ DDD2 =2
.equ DDD1 =1
.equ DDD0 =0
;PIND
.equ PIND7 =7
.equ PIND6 =6
.equ PIND5 =5
.equ PIND4 =4
.equ PIND3 =3
.equ PIND2 =2
.equ PIND1 =1
.equ PIND0 =0
;SPCR
.equ SPIE =7
.equ SPE =6
.equ DORD =5
.equ MSTR =4
.equ CPOL =3
.equ CPHA =2
.equ SPR1 =1
.equ SPR0 =0
;SPSR
.equ SPIF =7
.equ WCOL =6
;USR
.equ RXC =7
.equ TXC =6
.equ UDRE =5
.equ FE =4
.equ OR =3
;UCR
.equ RXCIE =7
.equ TXCIE =6
.equ UDRIE =5
.equ RXEN =4
.equ TXEN =3
.equ CHR9 =2
.equ RXB8 =1
.equ TXB8 =0
;ACSR
.equ ACD =7
.equ ACO =5
.equ ACI =4
.equ ACIE =3
.equ ACIC =2
.equ ACIS1 =1
.equ ACIS0 =0
.def XL =r26
.def XH =r27
.def YL =r28
.def YH =r29
.def ZL =r30
.def ZH =r31
.equ RAMEND =$25F ;Last On-Chip SRAM Location
.equ XRAMEND =$FFFF
.equ E2END =$1FF
.equ FLASHEND=$FFF
.equ INT0addr=$001 ;External Interrupt0 Vector Address
.equ INT1addr=$002 ;External Interrupt1 Vector Address
.equ ICP1addr=$003 ;Input Capture1 Interrupt Vector Address
.equ OC1Aaddr=$004 ;Output Compare1A Interrupt Vector Address
.equ OC1Baddr=$005 ;Output Compare1B Interrupt Vector Address
.equ OVF1addr=$006 ;Overflow1 Interrupt Vector Address
.equ OVF0addr=$007 ;Overflow0 Interrupt Vector Address
.equ SPIaddr =$008 ;SPI Interrupt Vector Address
.equ URXCaddr=$009 ;UART Receive Complete Interrupt Vector Address
.equ UDREaddr=$00a ;UART Data Register Empty Interrupt Vector Address
.equ UTXCaddr=$00b ;UART Transmit Complete Interrupt Vector Address
.equ ACIaddr =$00c ;Analog Comparator Interrupt Vector Address
.org $000
000000 c01f rjmp sl08
.org $020
sl08:
000020 e012 ldi r17,$02 ;栈指针置初值SP=0x025F
000021 e50f ldi r16,$5f
000022 bf1e out sph,r17
000023 bf0d out spl,r16
000024 ef1f ldi r17,$ff
000025 ef00 ldi r16,$f0
000026 bb17 out ddrb,r17 ;PB口作字线
000027 bb18 out portb,r17
000028 bb01 out ddrd,r16 ;PD7~PD4作位线
000029 bb12 out portd,r17
00002a e00f ldi r16,$0f
00002b bb04 out ddrc,r16 ;PC口用于键盘检测
00002c bb15 out portc,r17
00002d e028 ldi r18,8 ;欲显示的字符8
00002e e75f ldi r21,$7f ;数码管位线初值
loop0:
00002f d01b rcall jiance ;调用键盘检测程序
000030 e0f1 ldi zh,high(tab*2)
000031 e4e0 ldi zl,low(tab*2)
000032 0fe2 add zl,r18
000033 95c8 lpm ;查出七段码
000034 2d30 mov r19,r0
000035 bb38 out portb,r19 ;字线输出
000036 bb52 out portd,r21 ;位线输出
000037 9408 sec ;进位位置 1
000038 9557 ror r21 ;循环位线
000039 3f57 cpi r21,$f7 ;控制位线的范围
00003a f409 brne loop1
00003b e75f ldi r21,$7f ;重置位线初值
00003c e062 loop1: ldi r22,$02
00003d d001 rcall delay
00003e cff0 rjmp loop0
delay:
00003f e174 t1: ldi r23,20
000040 ec88 t2: ldi r24,200
000041 ec98 t3: ldi r25,200
000042 959a t4: dec r25
000043 f7f1 brne t4
000044 958a dec r24
000045 f7d9 brne t3
000046 957a dec r23
000047 f7c1 brne t2
000048 956a dec r22
000049 f7a9 brne t1
00004a 9508 ret
jiance:
00004b ef1e ldi r17,$fe ;让PC0输出为0
00004c bb15 out portc,r17
00004d c00a rjmp jiance0 ;检测是否有键按下
jiance11:
00004e ef1d ldi r17,$fd ;让PC1输出为0
00004f bb15 out portc,r17
000050 c011 rjmp jiance1
jiance22:
000051 ef1b ldi r17,$fb ;让PC1输出为0
000052 bb15 out portc,r17
000053 c018 rjmp jiance2
jiance33:
000054 ef17 ldi r17,$f7 ;让PC1输出为0
000055 bb15 out portc,r17
000056 c01f rjmp jiance3
000057 9508 ret ;无键按下
jiance0:
000058 b303 in r16,pinc
000059 ff07 sbrs r16,7 ;检测键“F”是否按下
00005a d043 rcall jianf ;按下则执行“F”键的程序
00005b ff06 sbrs r16,6 ;检测键“E”是否按下
00005c d03f rcall jiane ;按下则执行“E”键的程序
00005d ff05 sbrs r16,5 ;检测键“D”是否按下
00005e d03b rcall jiand ;按下则执行“D”键的程序
00005f ff04 sbrs r16,4 ;检测键“C”是否按下
000060 d037 rcall jianc ;按下则执行“C”键的程序
000061 cfec rjmp jiance11
jiance1:
000062 b303 in r16,pinc
000063 ff07 sbrs r16,7 ;检测“B”键是否按下
000064 d031 rcall jianb ;按下则执行“B”键的程序
000065 ff06 sbrs r16,6 ;检测“A”键是否按下
000066 d02d rcall jiana ;按下则执行“A”键的程序
000067 ff05 sbrs r16,5 ;检测键“9”是否按下
000068 d029 rcall jian9
000069 ff04 sbrs r16,4
00006a d025 rcall jian8 ;检测键“8”是否按下
00006b cfe5 rjmp jiance22
jiance2:
00006c b303 in r16,pinc
00006d ff07 sbrs r16,7 ;检测键“7”是否按下
00006e d01f rcall jian7
00006f ff06 sbrs r16,6 ;检测键“6”是否按下
000070 d01b rcall jian6
000071 ff05 sbrs r16,5 ;检测键“5”是否按下
000072 d017 rcall jian5
000073 ff04 sbrs r16,4 ;检测键“4”是否按下
000074 d013 rcall jian4
000075 cfde rjmp jiance33
jiance3:
000076 b303 in r16,pinc
000077 ff07 sbrs r16,7 ;检测键“3”是否按下
000078 d00d rcall jian3
000079 ff06 sbrs r16,6 ;检测键“2”是否按下
00007a d009 rcall jian2
00007b ff05 sbrs r16,5 ;检测键“1”是否按下
00007c d005 rcall jian1
00007d ff04 sbrs r16,4 ;检测键“0”是否按下
00007e d001 rcall jian0
00007f 9508 ret ;循环检测键盘
jian0:
000080 e020 ldi r18,0 ;欲显示的数为0
000081 9508 ret
jian1:
000082 e021 ldi r18,1 ;欲显示的数为1
000083 9508 ret
jian2:
000084 e022 ldi r18,2 ;欲显示的数为2
000085 9508 ret
jian3:
000086 e023 ldi r18,3 ;欲显示的数为3
000087 9508 ret
jian4:
000088 e024 ldi r18,4 ;欲显示的数为4
000089 9508 ret
jian5:
00008a e025 ldi r18,5 ;欲显示的数为5
00008b 9508 ret
jian6:
00008c e026 ldi r18,6 ;欲显示的数为6
00008d 9508 ret
jian7:
00008e e027 ldi r18,7 ;欲显示的数为7
00008f 9508 ret
jian8:
000090 e028 ldi r18,8 ;欲显示的数为8
000091 9508 ret
jian9:
000092 e029 ldi r18,9 ;欲显示的数为9
000093 9508 ret
jiana:
000094 e02a ldi r18,10 ;欲显示的数为10 "A"
000095 9508 ret
jianb:
000096 e02b ldi r18,11 ;欲显示的数为11 "B"
000097 9508 ret
jianc:
000098 e02c ldi r18,12 ;欲显示的数为12 "C"
000099 9508 ret
jiand:
00009a e02d ldi r18,13 ;欲显示的数为13 "D"
00009b 9508 ret
jiane:
00009c e02e ldi r18,14 ;欲显示的数为14 "E"
00009d 9508 ret
jianf:
00009e e02f ldi r18,15 ;欲显示的数为15 "F"
00009f 9508 ret
tab:
.db $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90
0000a0 f9c0
0000a1 b0a4
0000a2 9299
0000a3 f882
0000a4 9080
.db $88,$83,$c6,$a1,$86,$8e
0000a5 8388
0000a6 a1c6
0000a7 8e86
Assembly complete with no errors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -