良くあるSC1602をコントロールしてみる。後から調べると「ff5-tutorial-guide-2014-05-12.pdf」のp.41に、同様のものがあったがpic用。こちらはavr(arduino pro mini)なので、なにかの参考になるかと思う。
ソース記載のとおり4ビットパラレル。waitは適当。読み出しは行っていない。CGRAMへ書き込みも簡単に試してみた。
=========================
-lcd
marker -lcd
\ SC1602(HD44780)
\ portb0..3 -> DB4..7
\ portb4 -> R/W
\ portb5 -> RS
\ portc0 -> E
$24 constant ddrb
$25 constant portb
$27 constant ddrc
$28 constant portc
: b2n ( d7..d0 -- d3..d0 d7..d4 ) dup $0f and swap 4 rshift ;
: pbwr ( n -- )
portb c! 1 ms 1 portc mset 1 portc mclr ; ( write portb, pulse portc1 )
: wrd ( n -- ) b2n $20 or pbwr $20 or pbwr ; ( write data $20 RS_HIGH )
: wrc ( n -- ) b2n pbwr pbwr ; ( write command $20 RS_LOW )
: clr ( -- ) $01 wrc ;
: home ( -- ) $02 wrc ;
: setddpos ( pos -- ) b2n $8 or pbwr pbwr ;
: setcgpos ( pos -- ) b2n $4 or pbwr pbwr ;
: setcg ( x0 x1 x2 x3 x4 x5 x6 n -- ) ( write CG RAM n=address x0..x6=pattern )
3 lshift 7 for dup r@ + setcgpos swap wrd next drop ;
: init ( -- )
$3f ddrb c! ( RS, R/W, DB7, DB6, DB5, DB4 )
$01 ddrc c! ( E )
$3 pbwr 5 ms
$3 pbwr 1 ms
$3 pbwr
$2 pbwr
$28 wrc ( DL=0 4bit N=1 2line F=0 5x10dot )
$0c wrc ( Display ON/OFF )
( D=1 display on C=0 block cursor off B=0 blink off )
clr ( Clear Display )
$06 wrc ( Entry Mode Set I/D=1 右シフト S=0 表示シフトOFF )
;
: wrch ( c pos[0..31] -- )
dup 32 < if
dup 15 > if 48 + then setddpos wrd
then ;
init
$00 $1f $11 $11 $11 $1f $00 0 setcg ( square )
$00 $04 $0a $11 $0a $04 $00 1 setcg ( rhombus )
0 0 wrch
1 1 wrch
$41 2 wrch
$42 3 wrch
※コメント投稿者のブログIDはブログ作成者のみに通知されます