|
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define CWD Moto1=1;Moto2=0
#define CCWD Moto1=0;Moto2=1
#define stop Moto1=1;Moto2=1
#define LcdData P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit FuncKey=P1^2; //
sbit IncKey=P1^0;//
sbit DecKey=P1^1; //
sbit Moto1=P2^3; //
sbit Moto2=P2^4;
bit MotoStatus;
bit PulseStatus;//PWM
unsigned char NumChange;
unsigned char HPulseNum; //
unsigned char LPulseNum; //
void Delayms(unsigned int xms); //ms
void KeyScan(void);//按鍵檢測
void WriteLcd(unsigned char Dat,bit x); //1602LCD
void InitLCD(void); //初始化1602函數
void InitInt05T0(void); //初始化定時器中斷T0
void StatusLCD(void);
unsigned char FirstLine[15]={"MotoStatus: CWD"};//1602LCD顯示
unsigned char SecondLine[8]={"H/L: 0%"};
void Delayms(unsigned int xms)
{
unsigned int i,j;
for(i=xms; i>0; i--)
for(j=110; j>0; j--);
}
void WriteLcd(uchar Dat,bit x)//寫指令x=0,寫數據x=1
{
E=0;
LcdData=Dat;
RS=x;
RW=0;
E=1;
Delayms(1);
E=0;
}
void InitLcd(void)
{
WriteLcd(0x38,0);//功能開關(38H)
WriteLcd(0x0C,0);//顯示開關(0CH)
WriteLcd(0x06,0);//輸入模式(06H)
WriteLcd(0x01,0);//清除顯示(01H)
WriteLcd(0x02,0);//光標返回指令(02H or 03H)
}
void StatusLCD(void)
{
if(!MotoStatus) //˳順時針CWD
{
FirstLine[11]=' ';
FirstLine[12]='C';
FirstLine[13]='W';
FirstLine[14]='D';
}
else//逆時針
{
FirstLine[11]='C';
FirstLine[12]='C';
FirstLine[13]='W';
FirstLine[14]='D';
}
if(NumChange<100)
SecondLine[4]= ' ';
else //取占空比百位轉換ASCLL碼
SecondLine[4]=NumChange/100+0x30;
if(NumChange<10)
SecondLine[5]= ' ';
else //取占空比十位轉換ASCLL碼
SecondLine[5]=NumChange%100/10+0x30;
SecondLine[6]=NumChange%10+0x30;
}
void InitInt0T0( void)
{
TMOD=0X02;
EA=1;
EX0=1;
ET0=1;
PX0=1;
PT0=0;
IT0=1;
TH0=6;
TL0=6;
TR0=1;
}
void KeyScan(void)
{
if(!FuncKey)
{
Delayms(10);
if(!FuncKey)
{
while(!FuncKey);
MotoStatus=~MotoStatus;
}
}
if(!IncKey)
{
Delayms(10);
if(!IncKey)
{
while(!IncKey);
NumChange+=10;
if(NumChange>=100)NumChange=100;
}
}
if(!DecKey)
{
Delayms(10);
if(!DecKey)
{
while(!DecKey);
NumChange-=10;
if ((NumChange<10)|(NumChange>100))NumChange=0;
}
}
}
void Int0Serv( ) interrupt 0
{
KeyScan();
}
void T0Serv()interrupt 1
{
if(!PulseStatus)
{
if(HPulseNum--!=0)
{
if(!MotoStatus)
{
CWD;
}
else
{
CCWD;
}
}
else
{
PulseStatus=!PulseStatus;
LPulseNum=100-NumChange;
}
}
else
{
if(LPulseNum--!=0)
{
stop;
}
else
{
PulseStatus=!PulseStatus;
HPulseNum=NumChange;
}
}
}
void main()
{
uchar y;
InitLCD();
InitInt0T0();
HPulseNum=NumChange;
while(1)
{
StatusLCD();
WriteLcd(0x80,0);
for(y=0; y<15; y++)
WriteLcd(FirstLine[y],1);
WriteLcd(0xc0,0);
for(y=0; y<8; y++)
WriteLcd(SecondLine[y],1);
}
}
|
|