' PIC-BASIC でデジタルコンパスを使う
' 方角の表示は漢字(16方位)
'
DIM news AS BYTE, news2 AS BYTE
DIM drct0 AS BYTE
DIM drct1 AS BYTE, drct2 AS BYTE
DIM i AS BYTE
DIM code AS BYTE, pcg(8) AS BYTE
DIM db AS BYTE, tmp AS BYTE
'------------- LCD初期設定
INITLCD
GOSUB pcgset
CLEARLCD
'------------- ポート初期設定
db = rd
db = ( db & &B11000000 ) | &B111111
rd = db
WHILE(1)
GOSUB GetDirection
'--------- 方角表示
IF news < 8 THEN
'0:S 1:SW 2:NE 3:N 4:SE 5:W 6:E 7:NW
LOOKUP news, drct0, &h20, &h02, &h03, &h20, &h02, &h20, &h20, &h03
LOOKUP news, drct1, &h02, &h20, &h20, &h03, &h20, &h01, &h00, &h20
LOOKUP news, drct2, &h20, &h01, &h00, &h20, &h00, &h20, &h20, &h01
ELSE
'0:SSE 1:SSW 2:NNE 3:NNW 4:ESE 5:WSW 6:ENE 7:WNW
LOOKUP news -8, drct0, &h02, &h02, &h03, &h03, &h00, &h01, &h00, &h01
LOOKUP news -8, drct1, &h02, &h02, &h03, &h03, &h02, &h02, &h03, &h03
LOOKUP news -8, drct2, &h00, &h01, &h00, &h01, &h00, &h01, &h00, &h01
ENDIF
SETPOS 1,0 : PUTLCD chr$(drct0)
SETPOS 2,0 : PUTLCD chr$(drct1)
SETPOS 3,0 : PUTLCD chr$(drct2)
SETPOS 5,0 : PUTLCD "VALUE1:",( news & &H7), ":", (news >> 3)
SETPOS 5,1 : PUTLCD "VALUE2:", news2
SLEEP 500
WEND
GetDirection:
'---------- デジタルコンパス値取得
db = rd
news = db & &B00000111
news2 = (db & &B00111000) >> 3
IF news <> news2 THEN news = news + 8
RETURN
pcgset:
'---------- 漢字定義
code = 0 '---東
pcg(0) = &B00100
pcg(1) = &B11111
pcg(2) = &B00100
pcg(3) = &B11111
pcg(4) = &B11111
pcg(5) = &B01110
pcg(6) = &B10101
pcg(7) = &B10101
GOSUB cgramset
code = 1 '---西
pcg(0) = &B00000
pcg(1) = &B11111
pcg(2) = &B01010
pcg(3) = &B01010
pcg(4) = &B11111
pcg(5) = &B11011
pcg(6) = &B10001
pcg(7) = &B11111
GOSUB cgramset
code = 2 '---南
pcg(0) = &B00100
pcg(1) = &B11111
pcg(2) = &B00100
pcg(3) = &B11111
pcg(4) = &B11011
pcg(5) = &B11111
pcg(6) = &B10101
pcg(7) = &B10101
GOSUB cgramset
code = 3 '---北
pcg(0) = &B00000
pcg(1) = &B01010
pcg(2) = &B01010
pcg(3) = &B11011
pcg(4) = &B01010
pcg(5) = &B01010
pcg(6) = &B01010
pcg(7) = &B11011
GOSUB cgramset
RETURN
cgramset:
'---------- CGRAM設定
LOW rb.BIT2
db = &B01000000 | ( code << 3 )
GOSUB lcddir 'CGRAM CODE
HIGH rb.BIT2
FOR i = 0 TO 7
db = pcg(i)
GOSUB lcddir 'CGRAM DATA
NEXT i
LOW rb.BIT2
RETURN
lcddir:
tmp = rb
tmp = tmp & &B00001111
tmp = tmp | ( db & &B11110000)
rb = tmp
HIGH rb.BIT3
SLEEP 1
LOW rb.BIT3
SLEEP 1
tmp = rb
tmp = tmp & &B00001111
tmp = tmp | ((db << 4 ) & &B11110000)
rb = tmp
HIGH rb.BIT3
SLEEP 1
LOW rb.BIT3
SLEEP 1
RETURN
|