2012年5月2日水曜日

mikroC PRO でLCDに一文字表示する最小限のプログラムを教えて下さい(PIC16...

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 件のコメント:

コメントを投稿