mikroC PRO でLCDに一文字表示する最小限のプログラムを教えて下さい(PIC16F84A使用)。
mikroC PRO V4.15 を入手し、LED点灯/消灯は成功しました。次にLCDの表示に挑戦中です。
サイトには色々なサンプルプログラムがありますが、今の私には、どこが基本のコマンドかということが分かりませんので
プログラムを自分なりに小さく加工できません。
お手数ですが、LCDに一文字だけ表示する最小限でかつ基本を押さえたプログラムを教えて下さい。
(例えば”A”と表示するのみ。基本は押さえているがこれ以上簡単にはならないプログラム)
あるいはその様なプログラムがあるサイトを教えて下さい。
それが分かれば拡張して色々なプログラムができると思いますし、マニュアルももう少し読めるようになると思います。
使用しているのは
・PIC16F84A
・LCDはSC1602B
・10MHzレゾネータ
現在組立てた基板の接続です(プログラムに合わせて変更します)
RB4-DB4
RB5-DB5
RB6-DB6
RB7-DB7
RA0-EN
RA1-RS
以上です。お願いいたします。
Mikro-CでもPICCでも、LCDを扱う際の手順にたいした違いはないと思いますが・・・・
SC1602の資料に従って、初期処理を実行し、LCDを初期化したら、DataLineにデータをセットしてWiteモードで書き込むだけです。
SC1602の資料は手元にありますか?
>RA0-EN
>RA1-RS
文字を表示する=LCDデバイスにWriteするという事ですので、R/Wラインも繋がんと、文字書き込みができません。
LCDの初期化は、LCDの資料にあるように、
-----------------------------------
4bit Mode Interface Init
------------------------------------
PowerOn
1.wait 15ms
2.000011 // RS RW DB7 DB6 DB5 DB4
3.wait 4.1ms
4.000011 //
5.Wait 100us
6.000011 //
:
7.000010
8.000010
.00NF**
display-Off
display-On
EntryModeSet
--------------------------------------
のように、順にコマンドを送って初期化します。
たとえば、1.は、ENを0にしてから15ms以上をとります。まー、。PICの初期化やTRISの設定直後に15ms以上の「ま」が空けばよいです。
2.は、RS/RW/D7~4へそれぞれの値をセットし、Enable-PortのRA0を230nsだけ1にします。
ENのホールドタイムは、DataSheetを確認してください。Pwehとして、AC Characteristicsに載ってるはずです。
後は、順を追って設定していくだけす。
あと、蛇足ですが・・・
LCDは濃度調整のできるようにしてないと、表示が薄くて見えません・・・よ
______
追記。
>R/W および DB0~4 はアースラインに落としています。
あ”~、そうですね・・・ LCDにグラフィックキャラとか定義しないで使うなら、Low固定でもいいですね。
コマンドでWが1なのは、DetaReadの時くらいでした。
σ(-_-;)は、877で、Hitech-Cだったですけど・・・
--------------------
#define LCD_E RE2
#define LCD_RW RE0
#define LCD_RS RE1
#define LCD_Locate(Pos) LCD_W_Data(((Pos)&0x7F)|0x80)
void LCD_Init(void)
{
/* for SC1602SB LCD unit Init Rtn
Mode 4bit
RegSel:RE0
RrdWrt:RE1
Enable:RE2
DatBus7:RC3
DatBus6:RC2
DatBus5:RC1
DatBus4:RC0
*/
PORTC_Value=PORTC;
Delay_ms(20); // wati PoerUp 15mssec
PORTC = ((PORTC_Value & 0xf0 ) | 0b00000011); // Display init 1st signal
LCD_E_Pulse();
Delay_ms(5); // Wait 4.1ms
// Display init 2nd signal & Wiat 100us
PORTC = ((PORTC_Value & 0xf0 ) | 0b00000011);
LCD_E_Pulse();
Delay_us(120);
// Display init 3rd signal
PORTC = ((PORTC_Value & 0xf0 ) | 0b00000011); // Set to 8bit mode
LCD_E_Pulse();
// can be Check BF after This Line
Delay_us(120);
// Reset LCD
PORTC = ((PORTC_Value & 0xf0 ) | 0b00000010); // set to 4bit mode
LCD_E_Pulse();
LCD_Reset();
}
void LCD_Reset(void)
{
Delay_us(120);
LCD_W_Data(0b00101000); // 001 /4bit 0/2Line 1/5x7dot 0/ x/ x FunctionSet
// LCD_W_Data(0b00001110); // 0000 1 /Display On 1/ Cursol On 1/Brink Off 0
LCD_W_Data(0b00001100); // 0000 1 /Display On 1/ Cursol On 0/Brink Off 0
LCD_W_Data(0b00000110); // 0000 0 /Entry Mode 1/ Increment 1/WithShift 0
}
void LCD_E_Pulse(void)
{
int count_i;
Delay_us(5);
LCD_E = 1;
Delay_us(10);
LCD_E = 0;
Delay_us(5);
}
LCD_W_Data(unsigned char WordData)
{
PORTC_Value = PORTC;
Delay_us(40);
PORTC = ((PORTC_Value & 0xf0 ) | ( (WordData >> 4 ) & 0x0F ));
LCD_E_Pulse();
PORTC_Value = PORTC;
PORTC = ((PORTC_Value & 0xf0 ) | ( WordData & 0x0F ));
LCD_E_Pulse();
}
LCD_W_Char(unsigned char CharData)
{
LCD_RS = 1;
Delay_us(150);
PORTC_Value = PORTC;
PORTC = ((PORTC_Value & 0xf0 ) | ( ( CharData >> 4 ) & 0x0F ));
LCD_E_Pulse();
PORTC = ((PORTC_Value & 0xf0 ) | ( CharData & 0x0F ));
LCD_E_Pulse();
LCD_RS = 0;
Delay_us(140);
}
LCD_W_Str(const char * str)
{
LCD_RS = 1;
Delay_us(150);
while(*str)
LCD_W_Char(*str++);
LCD_RS = 0;
Delay_us(150);
}
こんくらい。C-Portの後半にも、なんか繋いでたので、イチイチPortCを読んでるけど、RB0~RB3を使ってなければ、そのへんは要らないですね。
mikroだと、なんか組み込みのサンプルサブルーチンとかあるんじゃないですか?
0 件のコメント:
コメントを投稿