こんばんわ
としぶぅ~です。
今日は天気悪いですね。。。。それに昨日の移動の疲れが・・・
では、昨日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買ったけど動いていません。。。ちょっと時間かかりそうなので週末の
時間があるときにさわろうと思います。
また動かしたらこちらに書きますね。
それでは今日はこの辺で!
おやすみなさい~^^/