STEP Motor

Màu nền
Font chữ
Font size
Chiều cao dòng

#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 conEn    @((unsigned)&PORTC*8+1);

///////////////////////////////////////////

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);

void init();

void delay(unsigned int d);

void tmr1Init(void);

//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[]);

void ledWrSeg(void);

//8255 Procedure

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

unsigned char ppiRead(unsigned char ch);

/////////////////////////////////

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

unsigned int i, n;

unsigned char stepTable[] = {0x0E,0x0D,0x0B,0x07};

unsigned char segBuf, segInd, 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 int n;

    unsigned char m;

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

    unsigned char     str2[] = "Stepmotor Tester";

    init();     

    lcdInit();

    tmr1Init();

    ALED0 = 0;

    segBuf = 0x01;

    segInd = 0;

    lcdLed = 1;

    conEn = 1;

    lcdWrStr(str1);

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

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

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

//    GIE = 1;

    while(1)

    {

        if(n<200)

        {

            n++;

            if(m<3)    m++;

            else    m = 0;

        }

        else

        {

            if(n<400)    n++;

            else        n = 0;

            if(m>0)    m--;

            else    m = 3;

        }

        TRISD = 0;

        lcdEn = 0;

        ppiEn = 1;

        Wr = 0;

        conEn = 0;

        PORTD = stepTable[m];

        Wr = conEn = 1;

        lcdClr();

        lcdWrInt(stepTable[m]);

        delay(2000);

    }

}

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

{

    if(TMR1IF)

    {   

        if(n<150)    n++;

        else

        {

            n = 0;

            if(segBuf==0)    segBuf = 0x01;

            else            segBuf <<= 1;

        }

        TMR1L = 0x3C;

        TMR1H = 0xF6;

        TMR1IF = 0;

    //    ledWrSeg();

        if(lcdEn==1)    lcdEn = 0;   

//        ALED0 = ALED1 = ALED2 = ALED3 = 1;

        TRISD = 0;

        Rd = 1;   

        ppiEn = 0;

        A0 = 1;    A1 = 0;

        PORTD = segBuf;

        Wr = 0;    Wr = 1;

        ppiEn = 1;

        TRISD = 0xff;

//        switch(segInd)

//        {

//        case 0:    ALED0 = 0;    segInd = 1;    break;

//        case 1:    ALED1 = 0;    segInd = 2;    break;

//        case 2:    ALED2 = 0;    segInd = 3;    break;

//        default:ALED3 = 0;    segInd = 0;

//        }

    }

}

void ledWrSeg(void)

{

    if(lcdEn==1)    lcdEn = 0;   

    ALED0 = ALED1 = ALED2 = ALED3 = 1;

    TRISD = 0;

    Rd = 1;   

    ppiEn = 0;

    A0 = 1;    A1 = 0;

    PORTD = segBuf;

    Wr = 0;    Wr = 1;

    ppiEn = 1;

    TRISD = 0xff;

    switch(segInd)

    {

    case 0:    ALED0 = 0;    segInd = 1;    break;

    case 1:    ALED1 = 0;    segInd = 2;    break;

    case 2:    ALED2 = 0;    segInd = 3;    break;

    default:ALED3 = 0;    segInd = 0;

    }

}

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

void init()

{

    ADCON1 = 0x07;   

    TRISA = 0x07; //config ports are output

    TRISE = 0;

    TRISC = 0;  

    TRISB = 0x01;

    TRISD = 0; 

    ALED0 = ALED1 = ALED2 = ALED3 = 1;

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

}

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: Truyen2U.Pro