2013年8月10日土曜日

Pic : LCD AQM0802A driving

Driving AQM0802A LCD

I have bought AQM0802A which can be driven by the I2C bus.
Driving voltage is 3.3V so PIC is also driven by 3.3V for connecting by I2C.



Below is the example code of driving the LCD.
This ic has the function of continuous sending, but below code is only sending each byte every time. 

Sending each byte needs slave address, control byte and data byte.
By setting control byte, clear, changing cursor and etc can be implemented like SD1602 display.
This ic only needs 2 wire from Pic so we can use lots of port comparing with SD1602.

///////////////////
i2cLCD.h
///////////////////
#ifndef I2C_FUNCTION
#define I2C_FUNCTION

#define SLV_ADDR 0x7C
#define LCD_CLEAR 0x01
#define LCD_1ST_LINE 0x80
#define LCD_2ND_LINE 0xC0

int lcdCommand(char cmd);
int lcdIni(void);
int lcdByteWrite(unsigned char cmd, unsigned char data);
int lcdPrintSting(char* str);

#endif

///////////////////
i2c functions
///////////////////
#include <p18f2320.h>
#include <delays.h>
#include <i2c.h>
#include "i2cLCD.h"
#include "wait.h"

int lcdPrintSting(char* str)
{
char byteRsOn=0x40;
//Send buffer data
while(*str!=0x00)
{
lcdByteWrite(byteRsOn, *str);
str++;
}

return 0;
}

int lcdCommand(char cmd)
{
lcdByteWrite(0x00, cmd);
return 0;
}

int lcdIni(void)
{
OpenI2C(MASTER,SLEW_OFF);
//Function set
lcdByteWrite(0x00, 0x38);
wait_ms(1);

//Function set, IS=1
lcdByteWrite(0x00, 0x39);
wait_ms(1);
//Internal osc freq. setting
lcdByteWrite(0x00, 0x14);
wait_ms(1);

//Contrast set
lcdByteWrite(0x00, 0x70);
wait_ms(1);

//Power/ICON/Contrast control
lcdByteWrite(0x00, 0x56);
wait_ms(1);

//Follower control
lcdByteWrite(0x00, 0x6C);
wait_ms(300);

//Function set
lcdByteWrite(0x00, 0x38);
wait_ms(1);

//Dispaly on/off control
lcdByteWrite(0x00, 0x0C);
wait_ms(1);

//Clear dispaly
lcdByteWrite(0x00, 0x01);
wait_ms(2);

    return 0;
}


int lcdByteWrite(unsigned char cmd, unsigned char data)
{
//Start Condition
    IdleI2C();
    StartI2C();
    while(SSPCON2bits.SEN){;}
        
//Write Slave Address wtih Write mode
    if(WriteI2C(SLV_ADDR)<0){return -1;}
IdleI2C();
    //Send control byte
    if(WriteI2C(cmd)<0){return -2;}
IdleI2C();
//Write data
if(WriteI2C(data)<0){return -3;}
//Send Stop
IdleI2C();
    StopI2C();
while(SSPCON2bits.PEN);
Delay10TCYx(4);
    
return 0;

}


/////////////////////////////////
//main: 10MHz external OSC is used
/////////////////////////////////
void main(void)
{
char test[]="AQM0802A";

  //I2C initialization
TRISC = 0x18;
SSPADD = 24; //MCLK40MHz / (4*(SSPAD+1)) = 400khz
  SSPCON1 = 0b00101000;
wait_ms(100);
lcdIni();

lcdCommand(LCD_1ST_LINE);
lcdPrintSting(test);
lcdCommand(LCD_2ND_LINE);
lcdPrintSting(test);
while(1)
{

}

0 件のコメント:

コメントを投稿