としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC16F88を動かす。。。その12(次の対応・・昨日できなかったこと)

2012-09-18 21:56:59 | PIC16F88

こんばんわ

としぶぅ~です。

今日は天気悪いですね。。。。それに昨日の移動の疲れが・・・

 

では、昨日Pickit3で、できなかったことをPickit2で確認してみました。

問題なく動作しました。

とりあえず、本日はLCDのデータポートを移動したのでその対応と動作確認。

後、回路も変更して、温度センサLM61を実装しました。

回路図はこちら

動作状況はこちら

やっぱりPickit2はいいな~。。。思ったように動いてくれる(笑)

 

修正したリストはこちら

"lcd_f88.c"としました。(ヘッダも"lcd_f88.h")

//*
//* LCD(SC1602) interface file(pic16f88 board)
//*
//* 以下の機能を供給する
//* lcd_cmd(unsigned char) LCDにコマンドデータを出力する
//* lcd_data(unsigned char) LCDに表示データを出力する
//* lcd_clear(void) 画面をクリアする
//* lcd_puts("ABCD・・・HJ") 文字列を表示する
//* lcd_posyx(y,x) カーソル位置を、行 y、横位置 xにする
//* lcd_init(void) LCDの初期化をする
//*
//*
//* LCD_RS PORTA, 7 ;RS信号
//* LCD_E PORTA, 6 ;E信号
//* LCD_DB PORTA ;DB6-4:PORTA 2-0(上位4ビット)
//* LCD_DB PORTB ;DB7:PORTB 3
//*


#include
#include "delay.h"
#include "lcd_f88.h"

#define LCD_RS RA7
#define LCD_EN RA6


// write a byte to the LCD in 4 bit mode
void lcd_cmd(unsigned char c)
{
unsigned char cdata;
unsigned char cdataA;

cdataA = (c >> 4) & 0x0f;
PORTB = (cdataA & 0x08) | (PORTB & 0xf7);
// Making MSB Command Data 4bit
cdata = (cdataA | (PORTA & 0x70 & 0xb0));
PORTA = cdata; // RS = "H"→”L"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;

cdataA = (c & 0x0f);
PORTB = (cdataA & 0x08) | (PORTB & 0xf7);
// Making LSB Command Data 4bit
cdata = cdataA | (PORTA & 0x70 & 0xb0);
PORTA = cdata; // RS = "H"→”L"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
DelayMs(5);
}

// write one character to the LCD
void lcd_data(unsigned char c)
{
unsigned char cdata;
unsigned char cdataA;

cdataA = (c >> 4) & 0x0f;
PORTB = (cdataA & 0x08) | (PORTB & 0xf7);
// Making MSB Data 4bit
cdata = cdataA | (PORTA & 0xf0) | 0x80;
PORTA = cdata; // RS = "L"→”H"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;

cdataA = (c & 0x0f);
PORTB = (cdataA & 0x08) | (PORTB & 0xf7);
// Making LSB Data 4bit
cdata = (cdataA & 0x0F) | (PORTA & 0xf0) | 0x80;
PORTA = cdata; // RS = "L"→”H"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
DelayMs(5);
}

// Clear and home the LCD
void lcd_clear(void)
{
lcd_cmd(0x1);
DelayMs(5);
}

// write a string of chars to the LCD
void lcd_puts(const char * s)
{
while(*s)
lcd_data(*s++);
}

// Go to the specified position
void lcd_posyx(unsigned char ypos,unsigned char xpos)
{
unsigned char pcode;

switch(ypos & 0x03){
case 0: pcode=0x80;
break;
case 1: pcode=0xC0;
break;
case 2: pcode=0x94;
break;
case 3: pcode=0xD4;
break;
}
lcd_cmd(pcode += xpos);
}

// initialise the LCD - put into 4 bit mode
void lcd_init(void)
{

// Initalize コマンドを2~3回書き込まないとうまく動かない(2Lineモードにならなかった))
lcd_cmd(0x2c); // 4 bit mode, 2-LineMode, 5x8 font
DelayUs(40);
lcd_cmd(0x2c); // 4 bit mode, 2-LineMode, 5x8 font
DelayUs(40);
lcd_cmd(0x0c); // display on, blink curson on
DelayUs(40);
lcd_clear(); // display off
DelayMs(2);
lcd_cmd(0x06); // entry mode
}

マーカー入れたところが以前のソフトから修正したところです。

1bitだけ違うポート使うのは面倒ですね。。。

ま、しょうがない!

 

とりあえず動いたからきょうはこのへんにしときます。

明日は、ADの部分いじります。。。どうやるかも考えながら^^

 

昨日Pickit3買ったけど動いていません。。。ちょっと時間かかりそうなので週末の

時間があるときにさわろうと思います。

また動かしたらこちらに書きますね。

 

それでは今日はこの辺で!

おやすみなさい~^^/