📄 motor.c
字号:
#include "scancode.h"
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
#define SPSA0 *(unsigned int *)0x38
#define SPSD0 *(unsigned int *)0x39
#define SPSA1 *(unsigned int *)0x48
#define SPSD1 *(unsigned int *)0x49
#define REGISTERCLKMD (*(unsigned int *)0x58)
#define T46uS 0x0200
ioport unsigned char port8000;
ioport unsigned char port8001;
ioport unsigned char port8002;
ioport unsigned char port8007;
void Delay(unsigned int nTime);
void interrupt time(void);
char ConvertScanToChar(unsigned char cScanCode);
ioport unsigned char port8001;
unsigned int uWork,nCount,uN,nCount1,nDir;
main()
{
unsigned int nSpeed,nScanCode,uWork1,uN1;
unsigned char cKey,cOldKey;
REGISTERCLKMD=0;
port8000=0;
port8000=0x80;
port8000=1;
port8007=0; // 关闭东西方向的交通灯
port8007=0x40; // 关闭南北方向的交通灯
uWork1=port8002; // 清除键盘缓冲区
REGISTERCLKMD=0x1007; // DSP主频改为两倍PLL时钟=32MHz
uN=30; nCount=nCount1=0; nDir=0; cKey=cOldKey=0;
SPSA1=1; // set McBSP1's SPCR2
uWork=SPSD1;
uWork&=0xfffe; // set XRST=0
SPSD1=uWork;
SPSA1=0x0e; // set McBSP1's PCR1
uWork=SPSD1;
uWork|=0x2400; // set XIOEN=1 FSXM=1, Enable IO,FSR for output
SPSD1=uWork;
SPSA0=0; // set McBSP0's SPCR1
uWork=SPSD0;
uWork&=0xfffe; // set RRST=0
SPSD0=uWork;
SPSA0=0x0e; // set McBSP0's PCR1
uWork=SPSD0;
uWork|=0x1101; // set RIOEN=1 FSXM=1, Enable IO,CLKR for output,set Motor's direction to 1
SPSD0=uWork;
asm(" ssbx INTM"); // 关中断,进行关键设置时不许打扰
uWork1= PMST;
PMST = uWork1&0xff;
IMR = 0x8;
TCR = 0x411;
TIM = 0;
PRD = T46uS;
nSpeed=T46uS;
TCR = 0x422;
IFR = 0x8;
asm(" rsbx INTM");
while ( 1 )
{
if ( nCount>16 )
{
port8000=1;
nCount=0;
nScanCode=port8001; // 读扫描码
nScanCode&=0x0ff; // 低8位
//uWork1=port8001; // 清除键盘缓冲区
if ( nScanCode!=0 )
{
if ( nScanCode==SCANCODE_Enter ) break;
else
{
cKey=ConvertScanToChar(nScanCode);
if ( cKey!=0 && cOldKey!=cKey )
{
cOldKey=cKey;
switch ( cKey )
{
case '0': uN=100; break;
case '1': uN=70; break;
case '2': uN=50; break;
case '3': uN=30; break;
case '4': uN=10; break;
case '5': uN=1; break;
case '+':
uN1=uN;
uN=60; // 降速
Delay(1024);
SPSA0=0;
uWork1=SPSD0;
uWork1&=0xfffe;
SPSD0=uWork1;
SPSA0=0x0e;
uWork1=SPSD0;
uWork1|=0x1101; //set Motor's direction to 1
SPSD0=uWork1;
PRD=nSpeed;
nDir=0;
Delay(1024);
uN=uN1;
break;
case '-':
uN1=uN;
uN=60; // 降速
Delay(1024);
SPSA0=0;
uWork1=SPSD0;
uWork1&=0xfffe;
SPSD0=uWork1;
SPSA0=0x0e;
uWork1=SPSD0;
uWork1|=0x1100; //set Motor's direction to 0
uWork1&=0xfffe;
SPSD0=uWork1;
PRD=nSpeed;
nDir=1;
Delay(1024);
uN=uN1;
break;
}
}
}
}
}
}
TCR = 0x412;
REGISTERCLKMD=0;
port8000=0;
port8000=0x80;
port8000=0;
exit(0);
}
void Delay(unsigned int nDelay)
{
int i,j,k=0;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<1024;j++ )
k++;
}
void interrupt time(void)
{
SPSA1=1; // set McBSP1's SPCR2
uWork=SPSD1;
uWork&=0xfffe; // set XRST=0
SPSD1=uWork;
SPSA1=0x0e; // set McBSP1's PCR1
uWork=SPSD1;
uWork|=0x2400; // set XIOEN=1 FSXM=1, Enable IO,FSR for output
if ( nCount1>uN ) uWork|=4;
else uWork&=0x0fffb;
SPSD1=uWork;
nCount++;
nCount1++; nCount1%=100;
}
char ConvertScanToChar(unsigned char cScanCode)
{
char cReturn;
cReturn=0;
switch ( cScanCode )
{
case SCANCODE_0: cReturn='0'; break;
case SCANCODE_1: cReturn='1'; break;
case SCANCODE_2: cReturn='2'; break;
case SCANCODE_3: cReturn='3'; break;
case SCANCODE_4: cReturn='4'; break;
case SCANCODE_5: cReturn='5'; break;
case SCANCODE_6: cReturn='6'; break;
case SCANCODE_7: cReturn='7'; break;
case SCANCODE_8: cReturn='8'; break;
case SCANCODE_9: cReturn='9'; break;
// case SCANCODE_F1:
case SCANCODE_Plus: cReturn='+'; break;
// case SCANCODE_F2:
case SCANCODE_Minus: cReturn='-'; break;
}
return cReturn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -