fnd(assembly)
DESCRIPTION
FND(assembly). Code description. 20072413 박민호. Code - main. FND. LOOP: LDIR16, 0xFF;R16 = 0xFF STSDIG_SELECT, R16;FND_CS = R16 LDIR16, 0xFF;R16 = 0xFF STSFND_DATA, R16;FND_DATA = R16 LDIR17, 0x00;R17 = 0x00 LOOP1: MOVR16, R17;R16 = R17 - PowerPoint PPT PresentationTRANSCRIPT
FND(assembly)Code description
20072413 박민호
FNDCode - main
출처 : 수업자료LOOP:
LDI R16, 0xFF ;R16 = 0xFFSTS DIG_SELECT, R16 ;FND_CS = R16LDI R16, 0xFF ;R16 = 0xFFSTS FND_DATA, R16 ;FND_DATA = R16
LDI R17, 0x00 ;R17 = 0x00LOOP1:
MOV R16, R17 ;R16 = R17CALL BIN2LED ;call BIN2LED subroutineSTS FND_DATA, R16 ;FND_DATA = R16CALL D50MS ;call D50MS subroutineINC R17 ;R17++CPI R17, 0x10 ;(R17==0x10)?BRNE LOOP1 ; 다르면 goto LOOP1
LDI R16, 'H' ;R16 = 'H'CALL BIN2LED ;call BIN2LED subroutineSTS FND_DATA, R16 ;FND_DATA = R16CALL D50MS ;call D50MS subroutine
LDI R16, '-' ;R16 = '-'CALL BIN2LED ;call BIN2LED subroutineSTS FND_DATA, R16 ;FND_DATA = R16CALL D50MS ;call D50MS subroutine
LDI R16, '.' ;R16 = '.'CALL BIN2LED ;call BIN2LED subroutineSTS FND_DATA, R16 ;FND_DATA = R16CALL D50MS ;call D50MS subroutine
LDI R16, ''' ;R16 = '''CALL BIN2LED ;call BIN2LED subroutineSTS FND_DATA, R16 ;FND_DATA = R16CALL D50MS ;call D50MS subroutine
JMP LOOP ;goto LOOP
FNDCode - bin2led
출처 : 수업자료
BIN2LED: PUSH R17
PUSH ZHPUSH ZLCPI R16, 'H'BRNE BIN2L1LDI R16, 0x10RJMP BIN2L4
BIN2L1:CPI R16, '-'BRNE BIN2L2LDI R16, 0x11RJMP BIN2L4
...
BIN2L4:LDI R17, byte3(FND_TABLE << 1)LDI ZH, high(FND_TABLE << 1)LDI ZL, low(FND_TABLE << 1)ADD ZL, R16CLR R16ADC ZH, R16ADC R17, R16OUT RAMPZ, R17LPM R16, ZPOP ZLPOP ZHPOP R17RET
FND_TABLE:.db 0b11000000, 0b11111001 ; 0,
1.db 0b10100100, 0b10110000 ; 2,
3.db 0b10011001, 0b10010010 ; 4,
5.db 0b10000010, 0b11011000 ; 6,
7.db 0b10000000, 0b10010000 ; 8,
9.db 0b10001000, 0b10000011 ; a,
b.db 0b11000110, 0b10100001 ; c,
d.db 0b10000110, 0b10001110 ; e, f.db 0b10001001, 0b10111111 ; H,
-.db 0b01111111, 0b11111111 ; ., '
; 첫 번째 바이트 더한 캐리를 두 번째 바이트에 더함; 두 번째 바이트 더한 캐리를 세 번째 바이트에 더함; 세 번째로 올라온 캐리를 RAMPZ set 하는데 사용
RAMPZ 레지스터와 함께 z-pointer 를 초기화해주기 위한 작업이다 .여기서는 LPM 을 사용하므로 , RAMPZ 가 필요없다 .따라서
LDI R17, byte3(FND_TABLE<<1)ADC R17, R16OUT RAMPZ, R17
이 세 줄은 없어도 상관없음 !!
FNDSstate in memory
$0000 $0001
$0002 $0003
$0004 $0005
$0006 $0007
$0008 $0009
$000A $000B
Low High Address
$0000
$0001
$0002
$0003
$0004
$0005
$FFFC $FFFD
$FFFE $FFFF
$7FFE
$7FFF
0000 0000 0000 0000
Low High Address0000 0000 0000 0001 0000 0000 0000 0000
0000 0000 0000 00010000 0000 0000 0010 0000 0000 0000 0011
0000 0000 0000 0100 0000 0000 0000 0101 0000 0000 0000 0010
0000 0000 0000 00110000 0000 0000 0110 0000 0000 0000 0111
0000 0000 0000 1000 0000 0000 0000 1001 0000 0000 0000 0100
0000 0000 0000 01010000 0000 0000 1010 0000 0000 0000 1011
1111 1111 1111 1100 1111 1111 1111 1101 0111 1111 1111 1110
0111 1111 1111 11111111 1111 1111 1110 1111 1111 1111 1111
…..
…..
FND_TABLE:.db 0b11000000, 0b11111001 ; 0, 1.db 0b10100100, 0b10110000 ; 2, 3.db 0b10011001, 0b10010010 ; 4, 5.db 0b10000010, 0b11011000 ; 6, 7.db 0b10000000, 0b10010000 ; 8, 9.db 0b10001000, 0b10000011 ; a, b.db 0b11000110, 0b10100001 ; c, d.db 0b10000110, 0b10001110 ; e, f.db 0b10001001, 0b10111111 ; H, -.db 0b01111111, 0b11111111 ; ., '
2x
Q&A
Thank youFND