📄 motor.c
字号:
#include "2407c.h"
#define T46uS 0x0d40
void interrupt gptime1(void);
void gp_init(void);
char ConvertScanToChar(unsigned char cScanCode);
void Delay(unsigned int nDelay);
ioport unsigned char port8001;
unsigned int uWork,nCount;
main()
{ char cKey;
unsigned char nScanCode;
unsigned int uWork1,nSpeed;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa;
*SCSR1=0x81fe; //40m
uWork=(*MCRC);
uWork&=0x0efdf; /* PWM11/IOPE5,TDIR2/IOPF4 for normal I/O ports */
(*MCRC)=uWork;
gp_init();
*IMR=0x3;
*IFR=0xffff;
nCount=0;
uWork=(*WSGR);
uWork&=0x0fe3f;
(*WSGR)=uWork;
uWork=(*PFDATDIR);
uWork|=0x1000;
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork;
asm(" clrc INTM");
Delay(128);
*T1PR=T46uS;
nSpeed=T46uS;
for(;;)
{
if ( nCount>=16 )
{
nCount=0;
nScanCode=port8001;
nScanCode&=0x0ff;
if ( nScanCode!=0 )
{
cKey=ConvertScanToChar(nScanCode);
if ( cKey=='A' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1|=0x0010; /* Set direct=1 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
}
else if ( cKey=='B' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
}
else if ( cKey=='C' )
{
if ( nSpeed== 0x17D9 )
nSpeed=T46uS;
else
nSpeed=0x17D9;
*T1PR=nSpeed;
}
else if ( cKey=='D' )
{
if ( nSpeed== 0x0a40 )
nSpeed=T46uS;
else
nSpeed=0x0a40;
*T1PR=nSpeed;
}
}
}
}
}
void interrupt gptime1(void)
{
uWork=(*PIVR);
switch(uWork)
{
case 0x27:
{
(*EVAIFRA)=0x80;
uWork=(*PEDATDIR);
uWork|=0x2000;
uWork^=0x0020;
(*PEDATDIR)=uWork;
nCount++;
break;
}
}
}
void gp_init(void)
{
*EVAIMRA = 0x80;
*EVAIFRA = 0xffff;
*GPTCONA = 0x0100;
*T1PR = T46uS*9/5;
*T1CNT = 0;
*T1CON = 0x1340;
}
char KeyLUT[16]={ 'A','B','C','D',
'E','F','G','H',
'I','J','K','L',
'M','N','O','P'
};
char ConvertScanToChar(unsigned char cScanCode)
{
int nWork;
unsigned int uWork1,uWork2;
uWork1=uWork2=cScanCode;
uWork1>>=4;
uWork2&=0x0f;
switch ( uWork1 )
{
case 1: nWork=0; break;
case 2: nWork=4; break;
case 4: nWork=8; break;
case 8: nWork=12; break;
}
switch ( uWork2 )
{
case 1: nWork+=3; break;
case 2: nWork+=2; break;
case 4: nWork+=1; break;
}
return KeyLUT[nWork];
}
void Delay(unsigned int nDelay)
{
int i,j,k;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<16;j++ )
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -