STEP Motor
#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: truyentop.pro