#define Wait 40
#include "I2CLCD.h"
#include "i2c.h"
/*
PIC16F690はハード的にマスターになれないようなので、
ソフト的にマスターにする。
I2C低電圧キャラクタ液晶モジュール(16x2行)を用いる。
http://strawberry-linux.com/catalog/items?code=27001
*/
byte chCount;
byte LCD_WRITE;
void write(unsigned char control, unsigned char dt);
// 初期化 コントラストなどは要チェック
void LCDinit()
{
chCount = 0;
Delay_ms(40);
LCD_WRITE= 0x7c;
write(0x0, 0x38); //data8bit, numberOfLine=2
Delay_us(Wait);
write(0x0, 0x39); //data8bit, numberOfLine=2
Delay_us(Wait);
write(0x0, 0x14); //internal OSC frequency
Delay_us(Wait);
write(0x0, 0x7f); // contrast
Delay_us(Wait);
write(0x0, 0x5F); // power/icon/contrast control
Delay_us(Wait);
write(0x0, 0x6a); // follower control
Delay_ms(200); // 200ms
write(0x0, 0x0c); // Display ON
Delay_us(Wait);
write(0x0, 0x01); // clear disply
Delay_us(2000); // 2ms
write(0x00, 0x06); // entry mode set
Delay_us(Wait);
}
// カーソルをホームに持って行く
void home()
{
write(0x00,0x02); // return to home
chCount=0;
Delay_ms(2);
}
// 画面クリア
void clear()
{
write(0x00,0x01); // clear display
chCount=0;
Delay_ms(2);
}
// 一文字表示
void writeCh(unsigned char ch)
{
int x;
if(ch==0x0a){
x= chCount %32;
if(x<16) {
write(0x00,0xc0);
chCount=16;
}
else {
write(0x00,0x01); // clear display
chCount=0;
Delay_ms(2);
}
}
else
{
write(0x40,ch);
x= ++chCount %32;
if( x ==16) write(0x00,0xc0);
}
}
// 文字列表示
void writeString(char* ch)
{
while(*ch){
writeCh(*ch++);
}
}
// データ送出
void write(unsigned char control, unsigned char dt)
{
I2C_START();
WriteByte(LCD_WRITE);
WriteByte(control);
WriteByte(dt);
I2C_STOP();
}
// 簡易書式付き整数表示
void writeF(int x, int column, char zeroPad)
{
char Buffer[10];
char num[5];
int i,j, n=0, signFlag=0;
if(x<0) { // マイナスの値の場合
signFlag=1;
x *= -1;
}
do {
num[n++] = x%10;
x /= 10;
} while(x != 0);
i = column-n;
if(i>0) {
for(i=0; i<10; i++) Buffer[i]=' ';
if(zeroPad) for(i=0; i<column-n; i++) Buffer[i]='0';
Buffer[9]=0;
for(i=column-n, j=n-1; i<column; i++, j--) Buffer[i]=num[j]|'0';
Buffer[i]=0;
if(signFlag) Buffer[column-n-1]='-';
}
else {
j=0;
if(signFlag) Buffer[j++]='-';
for(i=--n; i>=0; i--) Buffer[j++]=num[i]|'0';
Buffer[j]=0;
}
writeString(Buffer);
}
// 整数表示
void writeInt(int x)
{
char num[5];
int n=0;
if(x<0) { // マイナスの値の場合
writeCh('-');
x *= -1;
}
do {
num[n++] = x%10 +'0';
x /= 10;
} while(x != 0);
while(--n >=0) writeCh(num[n]);
}
// アイコン表示
void setIcon(int x)
{
write(0x00, 0x39); // Function set
write(0x00, 0x40 | 0x0f); // flower icon
if(x & 1) write(0x40, 0x10);
else write(0x40, 0x00);
write(0x00, 0x40 | 0x0d); // Battery icon
write(0x40, 0);
if(x & 0x0e) {
write(0x00, 0x40 | 0x0d); // Battery icon
write(0x40, ((x & 0x0e)<<1) | 2);
}
write(0x00, 0x40 | 0x0b); // no sound icon
if(x & 0x10) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x40 | 0x09); // Key icon
if(x & 0x20) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x40 | 0x07); // 矢印 icon
write(0x40, 0);
if(x & 0xC0) {
write(0x00, 0x40 | 0x07); // 矢印 icon
write(0x40, (x & 0xC0)>>3);
}
write(0x00, 0x40 | 0x06); // enter icon
if(x & 0x100) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x40 | 0x04); // ring icon
if(x & 0x200) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x40 | 0x02); // 電話 icon
if(x & 0x400) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x40); // antena icon
if(x & 0x800) write(0x40, 0x10);
else write(0x40, 0);
write(0x00, 0x38); // Function set
}
// グラフィック表示
void setCG(char mode, char* cgData)
{
unsigned char i, j;
write(0x00,0x38); // Function set IS= 0
write(0x00,0x40); // CGRAM set address= 0
if(mode == 0) { // StringModeで呼ばれた時はデフォールトにセット
for(i=0; i<8; i++) {
for(j=0; j<8; j++) {
if(j < (7-i)) write(0x40,0x00);
else write(0x40,0x1f); // 横棒をセット
}
}
}
else {
for(i=0; i<64; i++ ) write(0x40, cgData[i]);
}
}
|