目次
前
次
点滅器(その2)
点滅器は、すでに扱っていますが、次の
タイミングチャートを生成して、ポート
に接続した8個のLEDを順次点灯させて
みます。
回路図は以下。
8ステップで特定ビットを1にするので
ビットセットのサブルーチンがあるとし
次のようにメインコードを組み上げ。
MAIN:
mov r7,#8
mov r6,#7
MAINL:
mov a,r6
mov r2,a
call SET_BIT
mov a,r2
outl P1,a
dec r6
djnz r7,MAINL
;
jmp MAIN
サブルーチンのコーリングシーケンスは
次のように指定。
レジスタr2に、論理値の1をセットする
ビット位置を格納。サブルーチンコール
すると、レジスタr2に結果が格納されて
くる。
サブルーチン名をSET_BITとすると
次のように定義できます。
SET_BIT:
; store
mov a,r2
mov @r0,a
; 0 bit
jnz SET_BIT1
mov r0,#01h
jmp SET_BITX
; 1 bit
SET_BIT1:
mov a,@r0
xrl a,#1
jnz SET_BIT2
mov r0,#02h
jmp SET_BITX
; 2 bit
SET_BIT2:
mov a,@r0
xrl a,#2
jnz SET_BIT3
mov r0,#04h
jmp SET_BITX
; 3 bit
SET_BIT3:
mov a,@r0
xrl a,#3
jnz SET_BIT4
mov r0,#08h
jmp SET_BITX
; 4 bit
SET_BIT4:
mov a,@r0
xrl a,#4
jnz SET_BIT5
mov r0,#10h
jmp SET_BITX
; 5 bit
SET_BIT5:
mov a,@r0
xrl a,#5
jnz SET_BIT6
mov r0,#20h
jmp SET_BITX
; 6 bit
SET_BIT6:
mov a,@r0
xrl a,#6
jnz SET_BIT7
mov r0,#40h
jmp SET_BITX
; 7 bit
SET_BIT7:
mov a,@r0
xrl a,#7
jnz SET_BITX
mov r0,#80h
;
SET_BITX:
;
ret
考え方は、単純です。
レジスタr2の値を0から7のいずれかに
なっているかを判断して、レジスタr2に
指定値を格納するだけ。
排他的論理和を使い、指定値になっていると
アキュムレータが0になることを利用。
ポートの初期化や一時変数で使うエリアを
考えて、まとめると以下。
; BIT test
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
TMP equ 18h
;****************
; define symbols
;****************
ENTRY equ 0h
E_INT equ 3h
E_TIM equ 7h
;*******************
; interrupt vectors
;*******************
org ENTRY
jmp START
; external interrupt
org E_INT
retr
; timer interrupt
org E_TIM
retr
org 10h
;**************
; sub routines
;**************
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
clr a
outl P1,a
outl P2,a
; set pointer
mov r0,#TMP
;
ret
SET_BIT:
; store
mov a,r2
mov @r0,a
; 0 bit
jnz SET_BIT1
mov r0,#01h
jmp SET_BITX
; 1 bit
SET_BIT1:
mov a,@r0
xrl a,#1
jnz SET_BIT2
mov r0,#02h
jmp SET_BITX
; 2 bit
SET_BIT2:
mov a,@r0
xrl a,#2
jnz SET_BIT3
mov r0,#04h
jmp SET_BITX
; 3 bit
SET_BIT3:
mov a,@r0
xrl a,#3
jnz SET_BIT4
mov r0,#08h
jmp SET_BITX
; 4 bit
SET_BIT4:
mov a,@r0
xrl a,#4
jnz SET_BIT5
mov r0,#10h
jmp SET_BITX
; 5 bit
SET_BIT5:
mov a,@r0
xrl a,#5
jnz SET_BIT6
mov r0,#20h
jmp SET_BITX
; 6 bit
SET_BIT6:
mov a,@r0
xrl a,#6
jnz SET_BIT7
mov r0,#40h
jmp SET_BITX
; 7 bit
SET_BIT7:
mov a,@r0
xrl a,#7
jnz SET_BITX
mov r0,#80h
;
SET_BITX:
;
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
MAIN:
mov r7,#8
mov r6,#7
MAINL:
mov a,r6
mov r2,a
call SET_BIT
mov a,r2
outl P1,a
dec r6
djnz r7,MAINL
;
jmp MAIN
end
リスティングファイルは次のようになります。
0000 ; BIT test
0000 ;
0000 INCLUDE 8048.LIB
0000 list
0000
0000 ;*******************
0000 ; value and address
0000 ;*******************
0018 TMP equ 18h
0000
0000 ;****************
0000 ; define symbols
0000 ;****************
0000 ENTRY equ 0h
0003 E_INT equ 3h
0007 E_TIM equ 7h
0000
0000 ;*******************
0000 ; interrupt vectors
0000 ;*******************
0000 org ENTRY
0000 2400 + jmp START
0002
0002 ; external interrupt
0002 org E_INT
0003 93 + retr
0004
0004 ; timer interrupt
0004 org E_TIM
0007 93 + retr
0008
0008 org 10h
0010 ;**************
0010 ; sub routines
0010 ;**************
0010 INIT:
0010 ; disable external interrupt
0010 15 + dis i
0011 ; disable timer interrupt
0011 35 + dis tcnti
0012 ; initialize I/O
0012 27 + clr a
0013 39 + outl P1,a
0014 3A + outl P2,a
0015 ; set pointer
0015 B818 + mov r0,#TMP
0017 ;
0017 83 + ret
0018
0018 SET_BIT:
0018 ; store
0018 FA + mov a,r2
0019 A0 + mov @r0,a
001A ; 0 bit
001A 9620 + jnz SET_BIT1
001C B801 + mov r0,#01h
001E 045D + jmp SET_BITX
0020 ; 1 bit
0020 SET_BIT1:
0020 F0 + mov a,@r0
0021 D301 + xrl a,#1
0023 9629 + jnz SET_BIT2
0025 B802 + mov r0,#02h
0027 045D + jmp SET_BITX
0029 ; 2 bit
0029 SET_BIT2:
0029 F0 + mov a,@r0
002A D302 + xrl a,#2
002C 9632 + jnz SET_BIT3
002E B804 + mov r0,#04h
0030 045D + jmp SET_BITX
0032 ; 3 bit
0032 SET_BIT3:
0032 F0 + mov a,@r0
0033 D303 + xrl a,#3
0035 963B + jnz SET_BIT4
0037 B808 + mov r0,#08h
0039 045D + jmp SET_BITX
003B ; 4 bit
003B SET_BIT4:
003B F0 + mov a,@r0
003C D304 + xrl a,#4
003E 9644 + jnz SET_BIT5
0040 B810 + mov r0,#10h
0042 045D + jmp SET_BITX
0044 ; 5 bit
0044 SET_BIT5:
0044 F0 + mov a,@r0
0045 D305 + xrl a,#5
0047 964D + jnz SET_BIT6
0049 B820 + mov r0,#20h
004B 045D + jmp SET_BITX
004D ; 6 bit
004D SET_BIT6:
004D F0 + mov a,@r0
004E D306 + xrl a,#6
0050 9656 + jnz SET_BIT7
0052 B840 + mov r0,#40h
0054 045D + jmp SET_BITX
0056 ; 7 bit
0056 SET_BIT7:
0056 F0 + mov a,@r0
0057 D307 + xrl a,#7
0059 965D + jnz SET_BITX
005B B880 + mov r0,#80h
005D ;
005D SET_BITX:
005D ;
005D 83 + ret
005E
005E ;**************
005E ; main routine
005E ;**************
005E org 100h
0100 START:
0100 1410 + call INIT
0102 MAIN:
0102 BF08 + mov r7,#8
0104 BE07 + mov r6,#7
0106 MAINL:
0106 FE + mov a,r6
0107 AA + mov r2,a
0108 1418 + call SET_BIT
010A FA + mov a,r2
010B 39 + outl P1,a
010C CE + dec r6
010D EF06 + djnz r7,MAINL
010F ;
010F 2402 + jmp MAIN
0111
0111 end
次のようなタイミングチャートで、ビットの変化を
する場合には、メイン処理に工夫をして対応します。
レジスタr7の変化からレジスタr6の変化にします。
MAIN:
mov r7,#8
mov r6,#0
MAINL:
mov a,r6
mov a,r2
call SET_BIT
mov a,r2
outl P1,a
inc r6
djnz r7,MAINL
;
jmp MAIN
論理値の1が順次シフトして様子は、オシロスコープで
観測しておけばよいのですが、目視可能にするためには
無駄時間が必要。次のようにソフトウエアでのループを
回せばよいでしょう。
WAIT:
; set counter
mov R5,#0
WAITL:
nop
djnz R5,WAITL
;
ret
全体では、次のようにまとめられます。
; BIT test
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
TMP equ 20h
;****************
; define symbols
;****************
ENTRY equ 0h
E_INT equ 3h
E_TIM equ 7h
;*******************
; interrupt vectors
;*******************
org ENTRY
jmp START
; external interrupt
org E_INT
retr
; timer interrupt
org E_TIM
retr
org 10h
;**************
; sub routines
;**************
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
clr a
outl P1,a
outl P2,a
; set pointer
mov r0,#TMP
;
ret
SET_BIT:
; store
mov a,r2
mov @r0,a
; 0 bit
jnz SET_BIT1
mov r0,#01h
jmp SET_BITX
; 1 bit
SET_BIT1:
mov a,@r0
xrl a,#1
jnz SET_BIT2
mov r0,#02h
jmp SET_BITX
; 2 bit
SET_BIT2:
mov a,@r0
xrl a,#2
jnz SET_BIT3
mov r0,#04h
jmp SET_BITX
; 3 bit
SET_BIT3:
mov a,@r0
xrl a,#3
jnz SET_BIT4
mov r0,#08h
jmp SET_BITX
; 4 bit
SET_BIT4:
mov a,@r0
xrl a,#4
jnz SET_BIT5
mov r0,#10h
jmp SET_BITX
; 5 bit
SET_BIT5:
mov a,@r0
xrl a,#5
jnz SET_BIT6
mov r0,#20h
jmp SET_BITX
; 6 bit
SET_BIT6:
mov a,@r0
xrl a,#6
jnz SET_BIT7
mov r0,#40h
jmp SET_BITX
; 7 bit
SET_BIT7:
mov a,@r0
xrl a,#7
jnz SET_BITX
mov r0,#80h
;
SET_BITX:
;
ret
WAIT:
; set counter
mov R5,#0
WAITL:
nop
djnz R5,WAITL
;
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
MAIN:
mov r7,#8
mov r6,#0
MAINL:
mov a,r6
mov a,r2
call SET_BIT
mov a,r2
outl P1,a
; update
inc r6
; delay
call WAIT
call WAIT
call WAIT
call WAIT
call WAIT
;
djnz r7,MAINL
;
jmp MAIN
end
目次
前
次