PIC16F877A LCD CODE

#include<pic.h>

#include<pic1687x.h>

__CONFIG(HS & WDTDIS &    PWRTDIS & LVPDIS &     DUNPROT & WRTDIS &    DEBUGDIS);

static bit Rd        @((unsigned)&PORTE*8+0);    //lcdRs

static bit Wr        @((unsigned)&PORTE*8+1);    //lcdRw

static bit lcdEn    @((unsigned)&PORTC*8+0);

static bit lcdLed    @((unsigned)&PORTB*8+5);   

static bit ppiEn    @((unsigned)&PORTE*8+2);

static bit A0        @((unsigned)&PORTA*8+4);

static bit A1        @((unsigned)&PORTA*8+5);

static bit    ALED0    @((unsigned)&PORTB*8+1);

static bit    ALED1    @((unsigned)&PORTB*8+2);

static bit    ALED2    @((unsigned)&PORTB*8+3);

static bit    ALED3    @((unsigned)&PORTB*8+4);

unsigned char sec, min, hour, day, month, year;

//=================================LCD======================================

//LCD Procedure

void lcdWrCmd(unsigned char ch);

void lcdInit(void);

void lcdWrDat(unsigned char ch);

void lcdWrInt(unsigned int val);

void lcdGoHome (void);        // Move cursor go to home;

void lcdGoLeft (void);      // Move cursor left

void lcdGoRight (void);     // Move cursor right

void lcdGoPos (unsigned char line, unsigned char pos_of_line);

void lcdDownLine(void);

void lcdClr(void);

void lcdWrStr(unsigned char s[]);

//=====================================i2c=================================

void init();

void delay(unsigned int d);

void tmr1Init(void);

//8255 Procedure

void ppiInit(void);

void ppiWrite(unsigned char data, unsigned char ch);

unsigned char ppiRead(unsigned char ch);

unsigned char bank1 buffer, mask, START = 0;

unsigned int n;

unsigned char segTable[11] = {0xEB,0x28,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,0x10};

/*

* * * * * * *

*     (7)    *

*           *

*(6)     (5)*

*           *

*    (4)    *

* * * * * * *

*             *

*           *

*(0)     (3)*

*           *

*    (1)    *

* * * * * * *  *(2)

*/

//============MAIN=================================

void main()

{   

    unsigned char lcdVal;

    unsigned char m[] = "Tan phat Automation";

    unsigned char n[] = "Segment Led Tester";

    buffer = 0x01;

    lcdInit();

    tmr1Init();

    ALED0 = 0;

    lcdLed = 1;

    lcdWrStr(m);

    delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);

    lcdGoPos(1,0);    lcdWrStr(n);

    delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);

    GIE = 1;

    while(1)

    {

        while(lcdVal==buffer){}

        lcdClr();

        lcdVal = buffer;

        lcdWrInt(lcdVal);

    }

}

static void interrupt isr(void)            // Here be interrupt function - the name is

{

    if(TMR1IF)

    {

        if(lcdEn==1)    lcdEn = 0;   

        if(n<150)    n++;

        else

        {

            n = 0;

            if(buffer==0)    buffer = 0x01;

            else            buffer <<= 1;

        }

        if(START==0)

        {

            ppiWrite(0x81,'W'); //PA, PB, Upper Nible of PC are Outputs, Lower Nible of PC are Inputs

            START = 1;

        }

        TMR1L = 0x3C;

        TMR1H = 0xF6;

        TMR1IF = 0;

        if(ALED3==0)

        {

            ALED3 = 1;

            ppiWrite(buffer,'B');

            ALED0 = 0;

        }

        else

        {

            if(ALED0==0)

            {

                ALED0 = 1;

                ppiWrite(buffer,'B');

                ALED1 = 0;

            }

            else

            {

                if(ALED1==0)

                {

                    ALED1 = 1;

                    ppiWrite(buffer,'B');

                    ALED2 = 0;

                }

                else

                {

                    ALED2 = 1;   

                    ppiWrite(buffer,'B');

                    ALED3 = 0;

                }

            }

        }

    }

}

//=================================KHAOI TAO HE THONG=======================

void init()

{

    ADCON1 = 0x07;   

    TRISA = 0; //config ports are output

    TRISE = 0;

    TRISC = 0;  

    TRISB = 0;

    TRISD = 0; 

    ALED0 = ALED1 = ALED2 = ALED3 = 1;

}

void tmr1Init(void)

{

    T1CON = 0b00110000;        //Fin = 11.059.200/(4*8) = 345600Hz

    TMR1L = 0x48;

    TMR1H = 0xF4;

    TMR1IE = 1;   

    PEIE = 1;

    TMR1ON = 1;

}

void ppiInit(void)

{

    ppiWrite(0x81,'W'); //PA, PB, Upper Nible of PC are Outputs, Lower Nible of PC are Inputs

}

void ppiWrite(unsigned char data, char ch)

{

    TRISD = 0;

    Rd = 1;   

    lcdEn = 0;

    ppiEn = 0;

    switch(ch)

    {

    case 'A': //PortA   

        A0 = 0;

        A1 = 0;

        break;

    case 'B': //PortB

        A0 = 1;

        A1 = 0;

        break;

    case 'C': //PortC

        A0 = 0;

        A1 = 1;

        break;

    case 'W': //CW

        A0 = 1;

        A1 = 1;

    }

    PORTD = data;

    Wr = 0;

    Wr = 1;

    ppiEn = 1;

    TRISD = 0xff;

}

unsigned char ppiRead(char ch)

{

    unsigned char data;  

    TRISD = 0xff;

    Wr = 1; 

    lcdEn = 0;

    ppiEn = 0;

    switch(ch)

    {

    case 'A': //PortA   

        A0 = 0;

        A1 = 0;

        break;

    case 'B': //PortB

        A0 = 1;

        A1 = 0;

        break;

    case 'C': //PortC

        A0 = 0;

        A1 = 1;

        break;

    case 'W': //CW

        A0 = 1;

    A1 = 1;

    }

    Rd = 0;

    Rd = 1;

    data = PORTD;

    ppiEn = 1;

    return data;

}

//========================================LCD===============================

void delay(unsigned int d)

{

    while(d--){};

}

//==============================================

void    delayns(unsigned int n)

{

    unsigned int i;

    for(i=0;i<n;i++);

}

//===============================================

void lcdWrCmd(unsigned char ch)

{

    TRISD = 0;

    ppiEn = 1;

    delay(180);

    Rd = 0;    

     Wr = 0;

    PORTD = ch;

     lcdEn = 1;

    lcdEn=0;

    TRISD = 0xff;

}

//================================================

void lcdWrDat(unsigned char ch)

{   

    TRISD = 0;

    ppiEn = 1;

    delay(180);

    Rd = 1;    

     Wr = 0;

    PORTD = ch;

     lcdEn = 1;

    lcdEn=0;

    TRISD = 0xff;

}

//-------------------------------------------

void lcdWrStr(unsigned char s[])

{

    unsigned char i = 0;

    while(s[i]!='\0')    lcdWrDat(s[i++]);

}

//------------------------------------------

void lcdInit(void)

{     

    TRISD = 0;

    ppiEn = 1;

    delayns(0xFFFF);

    Rd = 0;     // RS = 0;  Instruction

    Wr = 0;        // RW = 0;  Write to

    lcdEn = 1;        // E = 0;   Enable   

    PORTD = 0x38;

    lcdEn    = 1;

    delayns(100);                               

    lcdEn    = 0;

    delayns(100);                             

    lcdWrCmd(0x0C);   // Display ON, Cursor off, no blink

    delayns(10);

    lcdWrCmd(0x01);   // Clear Display

    delayns(10);

    lcdWrCmd(0x80);   // Set Cursor to top left

    delayns(100); 

    TRISD = 0xff;

}

//-------------------------------------------------------------

void lcdWrInt(unsigned int val)

{

    unsigned char i, j, num[5];

    i = 0;

    while(val > 9)

    {

        num[i] = val%10 + 0x30;

        val = val/10;

        i++;

    }

    num[i] = val + 0x30;

    for(j = 0; j <= i; j++)

    {

        lcdWrDat(num[i - j]);

    }

}

//-------------------------------------------------------------

void lcdGoHome (void)    // Move cursor go to home;

{

    lcdWrCmd (0x02);    //  Cursor go home        

}

//-------------------------------------------------------------

void lcdGoLeft (void)    // Move cursor left

{

    lcdWrCmd (0x10);    //  Cursor go left           

}

//-------------------------------------------------------------

void lcdGoRight (void)   // Move cursor right

{

    lcdWrCmd (0x14);    //  Cursor go home           

}

//-------------------------------------------------------------

void lcdGoPos (unsigned char line, unsigned char pos_of_line)// Move cursor to posistion of a line

{

    unsigned char DDRAMAddr;

    if (line==0) DDRAMAddr = pos_of_line;

    else DDRAMAddr = 0x40+pos_of_line;

    lcdWrCmd (0x80+DDRAMAddr);               

}

//-------------------------------------------------------------

void lcdDownLine(void)

{

    lcdWrCmd(0xC0);

}

//-------------------------------------------------------------

void lcdClr(void)

{

    lcdWrCmd (0x01);    //  Cursor go home 

    lcdGoHome();      

}

//==============================================================

Bạn đang đọc truyện trên: AzTruyen.Top

Tags: