⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor.c

📁 ICETEK-LF2407-A板和教学实验箱使用说明书及开发板的所有实验例程
💻 C
字号:
#include "2407c.h"                    
#include "scancode.h"
#define T46uS		0x0800
ioport unsigned int port8000;
ioport unsigned int port8005;
ioport unsigned int port8001;
ioport unsigned int port8002;
ioport unsigned int port8003;
ioport unsigned int port8004;
ioport unsigned int port8007;
#define CTRGR port8000
#define CTRLCDCMDR port8001
#define CTRKEY port8001
#define CTRLCDCR port8002
#define CTRCLKEY port8002
#define CTRLCDLCR  port8003
#define CTRLCDRCR port8004
#define CTRLA port8005
#define CTRLR port8007	

void Delay(unsigned int nTime);
void interrupt time(void);
char ConvertScanToChar(unsigned char cScanCode);
void interrupt gptime1(void);     
void gp_init(void);      

ioport unsigned int port8001;	
unsigned int uWork,nCount,uN,uN1,nCount1=0,nDir;
main()
{   char cKey,cOldKey;
	unsigned int nScanCode;
	unsigned int uWork1,nSpeed;
	asm(" setc INTM");
	
	CTRGR=0x80;		// 初始化ICETEK-CTR
    CTRGR=0x0;
    CTRGR=0x80;
    CTRLR=0;			// 关闭东西方向的交通灯
    CTRLR=0x40;	// 关闭南北方向的交通灯
    CTRLR=0xC0;
    CTRGR=0x81;
	uWork1=CTRCLKEY;	// 清除键盘缓冲区
	

	uN=40; nCount=nCount1=0; nDir=0; cKey=cOldKey=0;

	*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;	// 低8位
			
			CTRGR=1;
			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=90; break;
							case '2': uN=70; break;
							case '3': uN=50; break;
							case '4': uN=30; break;
							case '5': uN=10; break;
							case '+':
								uN1=uN;
								uN=60;		// 降速
								Delay(128);
								uWork1=(*PFDATDIR);
								uWork1|=0x0010;	/* Set Motor's direction to 1 */
								(*PFDATDIR)=uWork1;
   								*T1PR=nSpeed; 
				 			 	nDir=0; 
  			 					Delay(128);
								uN=uN1;
								break;
							case '-':
								uN1=uN;
								uN=60;		// 降速
								Delay(128);
					            uWork1=(*PFDATDIR);
					            uWork1&=0xffef;	/* Set direct=0 */
					           (*PFDATDIR)=uWork1;
   					            Delay(128);
   				             	*T1PR=nSpeed; 
				 			 	nDir=1;
								Delay(128);
								uN=uN1;
								break;
						}
					}
				}
			}
		}
	//Delay(8);	
	}
	CTRGR=0;
	CTRGR=0x80;
	CTRGR=0;
	exit(0);
}               

void interrupt gptime1(void)
{
   uWork=(*PIVR);
   switch(uWork)
   {  
   		case 0x27:
   		{
			(*EVAIFRA)=0x80;

			uWork=(*PEDATDIR);
			uWork|=0x2000;
			if ( nCount1>uN )
				uWork|=0x20;
			else
				uWork&=0x0ffdf;		
			(*PEDATDIR)=uWork;
		    nCount++;
		    nCount%=18;
		    nCount1++; nCount1%=100;
   		   	break;
   		}
   }
}                       

void gp_init(void)
{
   *EVAIMRA = 0x80;
   *EVAIFRA = 0xffff;
   *GPTCONA = 0x0100;
   *T1PR    = T46uS*9/5; 
   *T1CNT   = 0;
   *T1CON   = 0x1340;
}

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


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 + -