mikroBASIC用液晶表示サブルーチン群 作成:2007-09-09
MikroBASICに標準で付いてくる液晶表示ルーチンは自由な配線が出来ないので自作しました。このプログラムはデジタル時計の一部ですが汎用性があるため今後再利用しやすいようここにまとめておきます。
1.8ビットモードでも4ビットモードでもどちらでも動作可能
2.8ビットモードは速度優先なので、8ビットポートを1つ占有
8ビットモードで使うPICの足の数は10
DB0〜DB7用に8ビットポート1つ。つまり足8本
以下のとおり結線すること Rx は RA でも RB でも8ビットポートであれば何でもいいという意味
DB0 −> Rx0
DB1 −> Rx1
DB2 −> Rx2
DB3 −> Rx3
DB4 −> Rx4
DB5 −> Rx5
DB6 −> Rx6
DB7 −> Rx7
EnableSignal(E)用に足1本
RegisterSelect(RS)用に足1本
4ビットモードで使うPICの足の数は6
DB4〜DB7用に足4本
EnableSignal(E)用に足1本
RegisterSelect(RS)用に足1本
3.4ビットモードは配線の自由度を優先するため、PICのどのピンに接続しても良い
4.対応している液晶は秋月電子で販売されている 16×2文字の SC1602 SD1602 の2種
この互換機なら何でもOK
5.PICの周波数は何でもOK(たぶん)
6.液晶表示装置からの読み出しは非対応 BUSY FLAG のチェックもしていない
液晶表示装置の機種により処理速度が違うので厳密にはBUSY FLAGをチェックして処理が完了したことを確認するのが美しいが
プログラムが複雑になるのと、一部不安定とのうわさがあるので対応しないこととした
LCD関数一覧 これを見るよりソースコードのサンプルを見たほうが早いかも | |
Procedure名 | 解説 |
my_lcd_init | ■機能 LCDを初期化する たのProcedureはこれを実行した後に使用する必要がある ■引数 なし ■補足 mikroBASICの標準関数にlcd_initというのがあるので、関数名がダブらないように my_lcd_init と命名した |
my_lcd_clear | ■機能 LCDの画面をすべてクリヤする ■引数 なし ■補足 mikroBASICの標準関数にlcd_clearというのがあるので、関数名がダブらないように my_lcd_clear と命名した |
lcd_home | ■機能 画面をクリヤせずにカーソルの位置をホームポジション(画面左上)にする lcd_locate(0,0) と同じ ■引数 なし ■補足 lcd_locate(0,0) の法が処理速度が何倍も速いので使う必要性はあまりない |
lcd_create_char | ■機能 ユーザー定義フォントを最大8個登録できます ■引数 1.no −> 登録するフォントの番号 0 〜 7 2.ch −> 登録するフォントのビットパターン String[8]型 フォントは8×5サイズ String[0] が 一番上の行のビットパターン String[7] はカーソル用の領域として 0x00 にしておくのがよい 横方向は5ビットなので右詰で入力 ■お作法 この機能を実行すると文字の表示位置がホームポジション(=左上の位置)になります |
lcd_cursor | ■機能 カーソルの表示非表示、カーソルの点滅を制御する ■引数 1.cursor_on −> True:カーソル表示 False:カーソル非表示 2.blink −> True:カーソル点滅 False:カーソル点滅なし |
lcd_char | ■機能 LCDに一文字表示する 表示位置はlcd_locateであらかじめ設定しておく 続けて実行するばあいはlcd_locateを使用せずとも1文字ずつ右に表示位置が変わる これはこのプログラムの機能ではなくLCD自体の機能 ■引数 1.ch −> 表示する文字の1バイトコード |
lcd_string | ■機能 LCDに文字列を表示する ■引数 1.buf −> 文字列を格納した String[17]型 の変数 |
lcd_locate | ■機能 文字列の表示位置を変更する カーソルを表示している場合、カーソルが移動する カーソルを表示していないときは表面上何も起こらないがlcd_charやlcd_stringで文字を表示させたときの位置が変わる ■引数 1.x −> 表示位置の横方向の位置 一番左が0 で 一番右が15 2.y −> 表示位置の縦方向の位置 上段が0 で 下段が1 |
lcd_byte | ■機能 LCDに1バイトのデータを送る データの内容によって処理の待ち時間を判断する 他のProcedureが使用しているものなのでこれを直接使用することはない ■引数 rs −> RS信号線をHighにするかLowにするか 1 または 0 を渡す ch −> LCDに送る1バイトのコード |
lcd_enable_delay | ■機能 LCDにEnableを送る 他のProcedureが使用しているものなのでこれを直接使用することはない ■引数 delay −> Enableを送った後の待ち時間 |
これは8ビットモードで使用するときのサンプル。ソフトの定義部分を変更すればDB0〜DB7,E,RSの結線は変更できます。
実験風景
Step1. 6行目〜238行目を切り取って貼り付ける。もちろん行番号は不要。行番号のないものが一番下にあるのでそれを使えばよい。
Step2. 8ビットモードで使うときは 6行目 を削除するかコメントにする。
Step3. 15行目〜38行目までを回路とあわせる
編集するのは = の右側部分
4ビットモードで使用するときは <<EDIT 4bit & 8bit>> と <<EDIT
4bit>> となっている行を編集する
8ビットモードで使用するときは <<EDIT 4bit & 8bit>> と <<EDIT
8bit>> となっている行を編集する
Step4. メインルーチンを書く
ご参考:上のサンプル回路図を組んで、このプログラムを書き込めば何も変更しなくても動きます
サンプルを動かすとこうなります <−MOVIE
0001 '--------------------------------------------------------- 0002 ' LCD TEST PROGRAM 0003 '--------------------------------------------------------- 0004 program MY_LCD 0005 0006 #define LCD_4BIT ' <<EDIT 4bit>> 0007 0008 '--------------------------------------------------------- 0009 ' LCD subroutines 0010 '--------------------------------------------------------- 0011 symbol PORT_OUTPUT = 0 0012 symbol PORT_INPUT = 1 0013 0014 '---- LCD -------------------------- 0015 symbol LCD_E_TRIS = TRISA ' <<EDIT 4bit & 8bit>> 0016 symbol LCD_E_PORT = PORTA ' <<EDIT 4bit & 8bit>> 0017 symbol LCD_E_BIT = 3 ' <<EDIT 4bit & 8bit>> 0018 0019 symbol LCD_RS_TRIS = TRISE ' <<EDIT 4bit & 8bit>> 0020 symbol LCD_RS_PORT = PORTE ' <<EDIT 4bit & 8bit>> 0021 symbol LCD_RS_BIT = 0 ' <<EDIT 4bit & 8bit>> 0022 0023 #ifdef LCD_4BIT then 0024 symbol LCD_DB4_TRIS = TRISD ' <<EDIT 4bit>> 0025 symbol LCD_DB5_TRIS = TRISD ' <<EDIT 4bit>> 0026 symbol LCD_DB6_TRIS = TRISD ' <<EDIT 4bit>> 0027 symbol LCD_DB7_TRIS = TRISD ' <<EDIT 4bit>> 0028 symbol LCD_DB4_PORT = PORTD ' <<EDIT 4bit>> 0029 symbol LCD_DB5_PORT = PORTD ' <<EDIT 4bit>> 0030 symbol LCD_DB6_PORT = PORTD ' <<EDIT 4bit>> 0031 symbol LCD_DB7_PORT = PORTD ' <<EDIT 4bit>> 0032 symbol LCD_DB4_BIT = 4 ' <<EDIT 4bit>> 0033 symbol LCD_DB5_BIT = 5 ' <<EDIT 4bit>> 0034 symbol LCD_DB6_BIT = 6 ' <<EDIT 4bit>> 0035 symbol LCD_DB7_BIT = 7 ' <<EDIT 4bit>> 0036 #else 0037 symbol LCD_DB_PORT = PORTD ' <<EDIT 8bit>> 0038 symbol LCD_DB_TRIS = TRISD ' <<EDIT 8bit>> 0039 #endif 0040 0041 0042 '--------------------------------------------------------- 0043 ' Private 0044 ' SEND enable signal & delay 0045 '--------------------------------------------------------- 0046 sub procedure lcd_enable_delay(dim delay as word) 0047 dim i as word 0048 0049 LCD_E_PORT.LCD_E_BIT = 1 0050 Delay_us(1) 0051 LCD_E_PORT.LCD_E_BIT = 0 0052 for i = 0 to delay 0053 Delay_us(1) 0054 next i 0055 end sub 0056 0057 '--------------------------------------------------------- 0058 ' Private 0059 ' SEND byte 0060 '--------------------------------------------------------- 0061 sub procedure lcd_byte( dim rs as byte, dim ch as byte ) 0062 if rs = 1 then 0063 LCD_RS_PORT.LCD_RS_BIT = 1 0064 else 0065 LCD_RS_PORT.LCD_RS_BIT = 0 0066 end if 0067 0068 #ifdef LCD_4BIT THEN 0069 LCD_DB7_PORT.LCD_DB7_BIT = ( ch and %10000000 ) 0070 LCD_DB6_PORT.LCD_DB6_BIT = ( ch and %01000000 ) 0071 LCD_DB5_PORT.LCD_DB5_BIT = ( ch and %00100000 ) 0072 LCD_DB4_PORT.LCD_DB4_BIT = ( ch and %00010000 ) 0073 LCD_E_PORT.LCD_E_BIT = 1 0074 Delay_us(1) 0075 LCD_E_PORT.LCD_E_BIT = 0 0076 LCD_DB7_PORT.LCD_DB7_BIT = ( ch and %00001000 ) 0077 LCD_DB6_PORT.LCD_DB6_BIT = ( ch and %00000100 ) 0078 LCD_DB5_PORT.LCD_DB5_BIT = ( ch and %00000010 ) 0079 LCD_DB4_PORT.LCD_DB4_BIT = ( ch and %00000001 ) 0080 #else 0081 LCD_DB_PORT = ch 0082 #endif 0083 LCD_E_PORT.LCD_E_BIT = 1 0084 Delay_us(1) 0085 LCD_E_PORT.LCD_E_BIT = 0 0086 if (ch <= %00000011) then 0087 Delay_us(1640) 0088 else 0089 Delay_us( 43) 0090 end if 0091 0092 LCD_RS_PORT.LCD_RS_BIT = 0 0093 end sub 0094 0095 '--------------------------------------------------------- 0096 ' Clear display 0097 '--------------------------------------------------------- 0098 sub procedure my_lcd_clear() 0099 lcd_byte( 0, %00000001 ) 0100 end sub 0101 0102 '--------------------------------------------------------- 0103 ' return the cursor to the home position 0104 '--------------------------------------------------------- 0105 sub procedure lcd_home() 0106 lcd_byte( 0, %00000010 ) 0107 end sub 0108 0109 '--------------------------------------------------------- 0110 ' Cursor control 0111 ' 0112 ' cursor_on -> True:cursor on False:cursor off 0113 ' blink -> True:blink on False:blink off 0114 '--------------------------------------------------------- 0115 sub procedure lcd_cursor( dim cursor_on as boolean, dim blink as boolean ) 0116 dim ch as byte 0117 0118 ch = %00001100 0119 if cursor_on = True then 0120 ch = ch or %00000010 0121 end if 0122 if blink = True then 0123 ch = ch or %00000001 0124 end if 0125 lcd_byte( 0, ch ) 0126 end sub 0127 0128 '--------------------------------------------------------- 0129 ' LCD initialize 0130 '--------------------------------------------------------- 0131 sub procedure my_lcd_init() 0132 Delay_ms(15) 0133 LCD_E_TRIS.LCD_E_BIT = PORT_OUTPUT 0134 LCD_RS_TRIS.LCD_RS_BIT = PORT_OUTPUT 0135 #ifdef LCD_4BIT THEN 0136 LCD_DB7_TRIS.LCD_DB7_BIT = PORT_OUTPUT 0137 LCD_DB6_TRIS.LCD_DB6_BIT = PORT_OUTPUT 0138 LCD_DB5_TRIS.LCD_DB5_BIT = PORT_OUTPUT 0139 LCD_DB4_TRIS.LCD_DB4_BIT = PORT_OUTPUT 0140 #else 0141 LCD_DB_TRIS = 0x00 0142 #endif 0143 0144 LCD_RS_PORT.LCD_RS_BIT = 0 0145 0146 #ifdef LCD_4BIT THEN 0147 LCD_DB7_PORT.LCD_DB7_BIT = 0 0148 LCD_DB6_PORT.LCD_DB6_BIT = 0 0149 LCD_DB5_PORT.LCD_DB5_BIT = 1 0150 LCD_DB4_PORT.LCD_DB4_BIT = 1 0151 #else 0152 LCD_DB_PORT = %00110000 0153 #endif 0154 lcd_enable_delay( 4100 ) 0155 lcd_enable_delay( 40 ) 0156 lcd_enable_delay( 40 ) 0157 #ifdef LCD_4BIT THEN 0158 LCD_DB4_PORT.LCD_DB4_BIT = 0 0159 lcd_enable_delay( 40 ) 0160 #endif 0161 0162 #ifdef LCD_4BIT THEN 0163 lcd_byte( 0, %00101000 ) 0164 #else 0165 lcd_byte( 0, %00111000 ) 0166 #endif 0167 lcd_cursor( False, False ) 0168 Delay_ms(100) 0169 end sub 0170 0171 '--------------------------------------------------------- 0172 ' display character 0173 '--------------------------------------------------------- 0174 sub procedure lcd_char( dim ch as byte ) 0175 lcd_byte( 1, ch ) 0176 end sub 0177 0178 '--------------------------------------------------------- 0179 ' display string 0180 '--------------------------------------------------------- 0181 sub procedure lcd_string( dim byref buf as string[17] ) 0182 dim i as byte 0183 dim len2 as byte 0184 0185 len2 = strlen(buf) - 1 0186 for i = 0 to len2 0187 lcd_char( buf[i] ) 0188 next i 0189 end sub 0190 0191 '--------------------------------------------------------- 0192 ' Locate cursor 0193 ' 0194 ' x -> cusor x posision range 0 to 15 0195 ' y -> cusor y posision range 0 to 2 0196 ' 0197 ' ex 0198 ' lcd_locate( 0, 0 ) <- home posision (upper left) 0199 '--------------------------------------------------------- 0200 sub procedure lcd_locate( dim x as byte, dim y as byte ) 0201 dim addr as byte 0202 0203 addr = %10000000 0204 if y = 1 then 0205 addr = addr + 0x40 0206 end if 0207 addr = addr + x 0208 0209 lcd_byte( 0, addr ) 0210 end sub 0211 0212 '--------------------------------------------------------- 0213 ' Create original characters 0214 ' 0215 ' no -> character No 0 to 5 0216 ' ch -> 8 x 5 character bit pattern 0217 ' ex) font 'A' 0218 ' ch[0] = %00001110 0219 ' ch[1] = %00010001 0220 ' ch[2] = %00010001 0221 ' ch[3] = %00010001 0222 ' ch[4] = %00011111 0223 ' ch[5] = %00010001 0224 ' ch[6] = %00010001 0225 ' ch[7] = %00000000 0226 '--------------------------------------------------------- 0227 sub procedure lcd_create_char( dim no as byte, dim byref ch as string[8] ) 0228 dim cgram_addr as byte 0229 dim i as byte 0230 0231 cgram_addr = %01000000 or (no << 3) 0232 lcd_byte( 0, cgram_addr ) 0233 for i = 0 to 7 0234 lcd_byte( 1, ch[i] ) 0235 next i 0236 0237 lcd_locate(0,0) 0238 end sub 0239 0240 '--------------------------------------------------------- 0241 ' LCD test main routine 0242 '--------------------------------------------------------- 0243 main: 0244 dim i as byte 0245 dim buf as string[17] 0246 0247 dim org_char1 as string[8] 0248 dim org_char2 as string[8] 0249 dim org_char3 as string[8] 0250 0251 org_char1[0] = %00010101 0252 org_char1[1] = %00010101 0253 org_char1[2] = %00010101 0254 org_char1[3] = %00010101 0255 org_char1[4] = %00010101 0256 org_char1[5] = %00010101 0257 org_char1[6] = %00010101 0258 org_char1[7] = %00000000 0259 0260 org_char2[0] = %00011111 0261 org_char2[1] = %00000000 0262 org_char2[2] = %00011111 0263 org_char2[3] = %00000000 0264 org_char2[4] = %00011111 0265 org_char2[5] = %00000000 0266 org_char2[6] = %00011111 0267 org_char2[7] = %00000000 0268 0269 while( True ) 0270 my_lcd_init() 0271 0272 0273 ' <<display>> 0274 ' 123_____________ 0275 ' _____________ABC 0276 my_lcd_clear() 0277 lcd_char("1") 0278 lcd_char("2") 0279 lcd_char("3") 0280 lcd_locate(13,1) 0281 for i = 0x41 to 0x43 0282 lcd_char(i) 0283 next i 0284 Delay_ms(3000) 0285 0286 ' <<display>> 0287 ' X_______________ <- Original Font No.0 TATEJIMA 0288 ' X_______________ <- Original Font No.1 YOKOJIMA 0289 my_lcd_clear() 0290 lcd_create_char( 0, org_char1 ) 0291 lcd_create_char( 1, org_char2 ) 0292 lcd_char(0) 'display original font No.0 0293 lcd_locate(0,1) 0294 lcd_char(1) 'display original font No.1 0295 lcd_locate(14,1) 0296 Delay_ms(3000) 0297 0298 ' <<display>> 0299 ' X_______________ <- Original Font No.3 animation 0300 ' ________________ 0301 for i = 0 to 7 0302 org_char3[i] = %00000000 0303 next i 0304 0305 my_lcd_clear() 0306 lcd_create_char( 2, org_char3 ) 0307 lcd_char(2) 0308 0309 for i = 0 to 7 0310 Delay_ms(500) 0311 org_char3[i] = %11111111 0312 lcd_create_char( 2, org_char3 ) 0313 next i 0314 0315 Delay_ms(1000) 0316 0317 ' <<display>> 0318 ' 2007-09-09______ 0319 ' ________12:30:45 0320 my_lcd_clear() 0321 0322 buf = "2007-09-09" 0323 lcd_string( buf ) 0324 lcd_locate(8,1) 0325 buf = "12:30:45" 0326 lcd_string( buf ) 0327 Delay_ms(3000) 0328 0329 ' <<display>> 0330 ' ABC_____________ <- move cursor 0331 ' abc_____________ 0332 my_lcd_clear() 0333 0334 lcd_cursor( True, True ) 'cursor blinking 0335 buf = "ABC" 0336 lcd_string( buf ) 0337 lcd_locate(0,1) 0338 buf = "abc" 0339 lcd_string( buf ) 0340 Delay_ms(2000) 0341 0342 lcd_cursor( True, False ) 0343 for i = 2 to 0 step -1 0344 Delay_ms(500) 0345 lcd_locate(i,1) 0346 next i 0347 Delay_ms(2000) 0348 wend 0349 end.
行番号のないソースリスト コピペ用 (上のものとまったく同じ)
'--------------------------------------------------------- ' LCD TEST PROGRAM '--------------------------------------------------------- program MY_LCD #define LCD_4BIT ' <<EDIT 4bit>> '--------------------------------------------------------- ' LCD subroutines '--------------------------------------------------------- symbol PORT_OUTPUT = 0 symbol PORT_INPUT = 1 '---- LCD -------------------------- symbol LCD_E_TRIS = TRISA ' <<EDIT 4bit & 8bit>> symbol LCD_E_PORT = PORTA ' <<EDIT 4bit & 8bit>> symbol LCD_E_BIT = 3 ' <<EDIT 4bit & 8bit>> symbol LCD_RS_TRIS = TRISE ' <<EDIT 4bit & 8bit>> symbol LCD_RS_PORT = PORTE ' <<EDIT 4bit & 8bit>> symbol LCD_RS_BIT = 0 ' <<EDIT 4bit & 8bit>> #ifdef LCD_4BIT then symbol LCD_DB4_TRIS = TRISD ' <<EDIT 4bit>> symbol LCD_DB5_TRIS = TRISD ' <<EDIT 4bit>> symbol LCD_DB6_TRIS = TRISD ' <<EDIT 4bit>> symbol LCD_DB7_TRIS = TRISD ' <<EDIT 4bit>> symbol LCD_DB4_PORT = PORTD ' <<EDIT 4bit>> symbol LCD_DB5_PORT = PORTD ' <<EDIT 4bit>> symbol LCD_DB6_PORT = PORTD ' <<EDIT 4bit>> symbol LCD_DB7_PORT = PORTD ' <<EDIT 4bit>> symbol LCD_DB4_BIT = 4 ' <<EDIT 4bit>> symbol LCD_DB5_BIT = 5 ' <<EDIT 4bit>> symbol LCD_DB6_BIT = 6 ' <<EDIT 4bit>> symbol LCD_DB7_BIT = 7 ' <<EDIT 4bit>> #else symbol LCD_DB_PORT = PORTD ' <<EDIT 8bit>> symbol LCD_DB_TRIS = TRISD ' <<EDIT 8bit>> #endif '--------------------------------------------------------- ' Private ' SEND enable signal & delay '--------------------------------------------------------- sub procedure lcd_enable_delay(dim delay as word) dim i as word LCD_E_PORT.LCD_E_BIT = 1 Delay_us(1) LCD_E_PORT.LCD_E_BIT = 0 for i = 0 to delay Delay_us(1) next i end sub '--------------------------------------------------------- ' Private ' SEND byte '--------------------------------------------------------- sub procedure lcd_byte( dim rs as byte, dim ch as byte ) if rs = 1 then LCD_RS_PORT.LCD_RS_BIT = 1 else LCD_RS_PORT.LCD_RS_BIT = 0 end if #ifdef LCD_4BIT THEN LCD_DB7_PORT.LCD_DB7_BIT = ( ch and %10000000 ) LCD_DB6_PORT.LCD_DB6_BIT = ( ch and %01000000 ) LCD_DB5_PORT.LCD_DB5_BIT = ( ch and %00100000 ) LCD_DB4_PORT.LCD_DB4_BIT = ( ch and %00010000 ) LCD_E_PORT.LCD_E_BIT = 1 Delay_us(1) LCD_E_PORT.LCD_E_BIT = 0 LCD_DB7_PORT.LCD_DB7_BIT = ( ch and %00001000 ) LCD_DB6_PORT.LCD_DB6_BIT = ( ch and %00000100 ) LCD_DB5_PORT.LCD_DB5_BIT = ( ch and %00000010 ) LCD_DB4_PORT.LCD_DB4_BIT = ( ch and %00000001 ) #else LCD_DB_PORT = ch #endif LCD_E_PORT.LCD_E_BIT = 1 Delay_us(1) LCD_E_PORT.LCD_E_BIT = 0 if (ch <= %00000011) then Delay_us(1640) else Delay_us( 43) end if LCD_RS_PORT.LCD_RS_BIT = 0 end sub '--------------------------------------------------------- ' Clear display '--------------------------------------------------------- sub procedure my_lcd_clear() lcd_byte( 0, %00000001 ) end sub '--------------------------------------------------------- ' return the cursor to the home position '--------------------------------------------------------- sub procedure lcd_home() lcd_byte( 0, %00000010 ) end sub '--------------------------------------------------------- ' Cursor control ' ' cursor_on -> True:cursor on False:cursor off ' blink -> True:blink on False:blink off '--------------------------------------------------------- sub procedure lcd_cursor( dim cursor_on as boolean, dim blink as boolean ) dim ch as byte ch = %00001100 if cursor_on = True then ch = ch or %00000010 end if if blink = True then ch = ch or %00000001 end if lcd_byte( 0, ch ) end sub '--------------------------------------------------------- ' LCD initialize '--------------------------------------------------------- sub procedure my_lcd_init() Delay_ms(15) LCD_E_TRIS.LCD_E_BIT = PORT_OUTPUT LCD_RS_TRIS.LCD_RS_BIT = PORT_OUTPUT #ifdef LCD_4BIT THEN LCD_DB7_TRIS.LCD_DB7_BIT = PORT_OUTPUT LCD_DB6_TRIS.LCD_DB6_BIT = PORT_OUTPUT LCD_DB5_TRIS.LCD_DB5_BIT = PORT_OUTPUT LCD_DB4_TRIS.LCD_DB4_BIT = PORT_OUTPUT #else LCD_DB_TRIS = 0x00 #endif LCD_RS_PORT.LCD_RS_BIT = 0 #ifdef LCD_4BIT THEN LCD_DB7_PORT.LCD_DB7_BIT = 0 LCD_DB6_PORT.LCD_DB6_BIT = 0 LCD_DB5_PORT.LCD_DB5_BIT = 1 LCD_DB4_PORT.LCD_DB4_BIT = 1 #else LCD_DB_PORT = %00110000 #endif lcd_enable_delay( 4100 ) lcd_enable_delay( 40 ) lcd_enable_delay( 40 ) #ifdef LCD_4BIT THEN LCD_DB4_PORT.LCD_DB4_BIT = 0 lcd_enable_delay( 40 ) #endif #ifdef LCD_4BIT THEN lcd_byte( 0, %00101000 ) #else lcd_byte( 0, %00111000 ) #endif lcd_cursor( False, False ) Delay_ms(100) end sub '--------------------------------------------------------- ' display character '--------------------------------------------------------- sub procedure lcd_char( dim ch as byte ) lcd_byte( 1, ch ) end sub '--------------------------------------------------------- ' display string '--------------------------------------------------------- sub procedure lcd_string( dim byref buf as string[17] ) dim i as byte dim len2 as byte len2 = strlen(buf) - 1 for i = 0 to len2 lcd_char( buf[i] ) next i end sub '--------------------------------------------------------- ' Locate cursor ' ' x -> cusor x posision range 0 to 15 ' y -> cusor y posision range 0 to 2 ' ' ex ' lcd_locate( 0, 0 ) <- home posision (upper left) '--------------------------------------------------------- sub procedure lcd_locate( dim x as byte, dim y as byte ) dim addr as byte addr = %10000000 if y = 1 then addr = addr + 0x40 end if addr = addr + x lcd_byte( 0, addr ) end sub '--------------------------------------------------------- ' Create original characters ' ' no -> character No 0 to 5 ' ch -> 8 x 5 character bit pattern ' ex) font 'A' ' ch[0] = %00001110 ' ch[1] = %00010001 ' ch[2] = %00010001 ' ch[3] = %00010001 ' ch[4] = %00011111 ' ch[5] = %00010001 ' ch[6] = %00010001 ' ch[7] = %00000000 '--------------------------------------------------------- sub procedure lcd_create_char( dim no as byte, dim byref ch as string[8] ) dim cgram_addr as byte dim i as byte cgram_addr = %01000000 or (no << 3) lcd_byte( 0, cgram_addr ) for i = 0 to 7 lcd_byte( 1, ch[i] ) next i lcd_locate(0,0) end sub '--------------------------------------------------------- ' LCD test main routine '--------------------------------------------------------- main: dim i as byte dim buf as string[17] dim org_char1 as string[8] dim org_char2 as string[8] dim org_char3 as string[8] org_char1[0] = %00010101 org_char1[1] = %00010101 org_char1[2] = %00010101 org_char1[3] = %00010101 org_char1[4] = %00010101 org_char1[5] = %00010101 org_char1[6] = %00010101 org_char1[7] = %00000000 org_char2[0] = %00011111 org_char2[1] = %00000000 org_char2[2] = %00011111 org_char2[3] = %00000000 org_char2[4] = %00011111 org_char2[5] = %00000000 org_char2[6] = %00011111 org_char2[7] = %00000000 while( True ) my_lcd_init() ' <<display>> ' 123_____________ ' _____________ABC my_lcd_clear() lcd_char("1") lcd_char("2") lcd_char("3") lcd_locate(13,1) for i = 0x41 to 0x43 lcd_char(i) next i Delay_ms(3000) ' <<display>> ' X_______________ <- Original Font No.0 TATEJIMA ' X_______________ <- Original Font No.1 YOKOJIMA my_lcd_clear() lcd_create_char( 0, org_char1 ) lcd_create_char( 1, org_char2 ) lcd_char(0) 'display original font No.0 lcd_locate(0,1) lcd_char(1) 'display original font No.1 lcd_locate(14,1) Delay_ms(3000) ' <<display>> ' X_______________ <- Original Font No.3 animation ' ________________ for i = 0 to 7 org_char3[i] = %00000000 next i my_lcd_clear() lcd_create_char( 2, org_char3 ) lcd_char(2) for i = 0 to 7 Delay_ms(500) org_char3[i] = %11111111 lcd_create_char( 2, org_char3 ) next i Delay_ms(1000) ' <<display>> ' 2007-09-09______ ' ________12:30:45 my_lcd_clear() buf = "2007-09-09" lcd_string( buf ) lcd_locate(8,1) buf = "12:30:45" lcd_string( buf ) Delay_ms(3000) ' <<display>> ' ABC_____________ <- move cursor ' abc_____________ my_lcd_clear() lcd_cursor( True, True ) 'cursor blinking buf = "ABC" lcd_string( buf ) lcd_locate(0,1) buf = "abc" lcd_string( buf ) Delay_ms(2000) lcd_cursor( True, False ) for i = 2 to 0 step -1 Delay_ms(500) lcd_locate(i,1) next i Delay_ms(2000) wend end.