?? mouse_drive.c
字號:
//------------------------------------------------------------------------------------
// 函數(shù)名稱:
// 函數(shù)功能:
//
//------------------------------------------------------------------------------------
void map_xy(void)
{
switch(MAP.dir)
{
case 0:
MAP.y++;
ZLG7289_Download(1, 6, 0, MAP.y/10);
ZLG7289_Download(1, 7, 0, MAP.y%10);
break;
case 1:
MAP.x++;
ZLG7289_Download(1, 0, 0, MAP.x/10);
ZLG7289_Download(1, 1, 0, MAP.x%10);
break;
case 2:
MAP.y--;
ZLG7289_Download(1, 6, 0, MAP.y/10);
ZLG7289_Download(1, 7, 0, MAP.y%10);
break;
case 3:
MAP.x--;
ZLG7289_Download(1, 0, 0, MAP.x/10);
ZLG7289_Download(1, 1, 0, MAP.x%10);
break;
default:
break;
}
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱:
// 函數(shù)功能:
//
//------------------------------------------------------------------------------------
void MappulseClear(void)
{
if((MAP.rightpulse>20)&&(MAP.leftpulse>20))
map_xy();
MAP.rightpulse = 0;
MAP.leftpulse = 0;
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱: Timer1A_ISR
// 函數(shù)功能: 定時(shí)器1中斷服務(wù)函數(shù),定時(shí)檢測小車在迷宮中的狀態(tài)。
//
//------------------------------------------------------------------------------------
void Timer1A_ISR(void)
{
static int32 e[3] = {0,0,0},signl = 0,signr = 0;
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
Check_Infrared();
if(Check_Maze_State[0].front_2 && Check_Maze_State[1].front_2)
{
if(g_Run.COM_Run == GO_ON)
{
g_Run.MousePulCount = 0;
MouseRUN(STOP);
}
}
if(goahead)
{
if((Check_Maze_State[1].left_2 == 0) && (Check_Maze_State[0].left_2 ==0))
{
if(signl == 0)
{
MappulseClear();
g_Run.MousePulCount = 0;
MouseRUN(STOP);
signl = 1;
}
}
if((Check_Maze_State[1].right_2 == 0) && (Check_Maze_State[0].right_2 ==0))
{
if(signr == 0)
{
MappulseClear();
g_Run.MousePulCount = 0;
MouseRUN(STOP);
signr = 1;
}
}
}
else
{
signl = 0;
signr = 0;
}
if((MAP.leftpulse>=31)&&(MAP.rightpulse>=31))
{
map_xy();
MAP.leftpulse -=31;
MAP.rightpulse -= 31;
}
if((g_Run.WheelStop&0x11)!=0x11)
{
e[2] = e[1];
e[1] = e[0];
if((g_Run.WheelStop&0x11)==0x00)
{
if(g_Run.LeftTime > g_Run.RightTime)
{
e[0] = g_Run.SysTick - g_Run.LeftTime;
}
else
{
e[0] = g_Run.SysTick - g_Run.RightTime;
}
}
if((g_Run.WheelStop&0x11)==0x01)
{
e[0] =g_Run.SysTick - g_Run.LeftTime;
}
if((g_Run.WheelStop&0x11)==0x10)
{
e[0] =g_Run.SysTick - g_Run.RightTime;
}
e[0] = e[0] - 20;
g_Run.percent += (3*(e[0]-e[1])/2+e[0]/15 + (e[0]-2*e[1]+e[2])/10);
if(g_Run.percent<25)
g_Run.percent = 25;
if(g_Run.percent>75)
g_Run.percent = 75;
PwmPercent(g_Run.percent);
}
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱: Check_Infrared
// 函數(shù)功能: 紅外檢測函數(shù)
//------------------------------------------------------------------------------------
void Check_Infrared(void)
{
unsigned char l = 0,f = 0,r = 0,i = 0;
Check_Maze_State[1] = Check_Maze_State[0];
SendInfrared(37000);
Delay(1500);
for(i=0,l = 0,f = 0,r = 0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_L)==0)
l++;
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_F)==0)
f++;
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_R)==0)
r++;
}
ForbidInfrared();
if(l>8) // 左邊存在擋板
{
Check_Maze_State[0].left_2 = 1;
}
else // 左邊存在支路
{
Check_Maze_State[0].left_2 = 0;
}
if(f>8) // 前面存在擋板
{
Check_Maze_State[0].front_2 = 1;
}
else // 前面沒有擋板
{
Check_Maze_State[0].front_2 = 0;
}
if(r>8) // 右邊存在擋板
{
Check_Maze_State[0].right_2 = 1;
}
else // 右邊存在支路
{
Check_Maze_State[0].right_2 = 0;
}
Delay(2000);
SendInfrared(30500);
Delay(1500);
for(i=0,l = 0,f = 0,r = 0;i<10;i++)
{
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_L)==0)
l++;
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_F)==0)
f++;
if(GPIOPinRead(GPIO_PORTA_BASE, STATE_R)==0)
r++;
}
ForbidInfrared();
if(l>8) // 左邊存在擋板
{
Check_Maze_State[0].left_1 = 1;
}
else // 左邊存在支路
{
Check_Maze_State[0].left_1 = 0;
}
if(f>8) // 前面存在擋板
{
Check_Maze_State[0].front_1 = 1;
}
else // 前面沒有擋板
{
Check_Maze_State[0].front_1 = 0;
}
if(r>8) // 右邊存在擋板
{
Check_Maze_State[0].right_1 = 1;
}
else // 右邊存在支路
{
Check_Maze_State[0].right_1 = 0;
}
}
//------------------------------------------------------------------------------------
//
//
//------------------------------------------------------------------------------------
void MicroMouseInit(void)
{
SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ ); // 使能PLL,20M
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA ); // 使能GPIO A口外設(shè)
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB ); // 使能GPIO B口外設(shè)
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC ); // 使能GPIO C口外設(shè)
GPIODirModeSet(GPIO_PORTB_BASE, KEY, GPIO_DIR_MODE_IN);
if(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0)
{
while(1);
}
GPIODirModeSet(GPIO_PORTC_BASE, LED1 | LED2 | LED3 | LED4, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTB_BASE, LED5 , GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTA_BASE, STATE_L | STATE_R | STATE_F, GPIO_DIR_MODE_IN);
Timer0Ini();
Timer1Ini();
WheelPulseIni();
SysTickIni();
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱: CheckKey
// 函數(shù)功能: 讀取按鍵狀態(tài)
// 出口參數(shù): 有按鍵返回真,否則返回假
//------------------------------------------------------------------------------------
uint32 CheckKey(void)
{
if(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0)
{
Delay(50);
while(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0);
return(true);
}
else
return(false);
}
//------------------------------------------------------------------------------------
// 函數(shù)名稱: LEDDisplay
// 函數(shù)功能: 控制LED熄滅和點(diǎn)亮
// 入口參數(shù): number: 選擇所要控制的LED
// option: 控制方式參數(shù),(0,熄滅。1,點(diǎn)亮。2,狀態(tài)取反)
//------------------------------------------------------------------------------------
void LEDDisplay(uint32 number,uint32 option)
{
switch(number)
{
case 0:
case 1:
if(option == 0)
GPIOPinWrite(GPIO_PORTC_BASE, LED1, 0xff);
if(option == 1)
GPIOPinWrite(GPIO_PORTC_BASE, LED1, 0x00);
if(option == 2)
GPIOPinWrite(GPIO_PORTC_BASE, LED1, GPIOPinRead(GPIO_PORTC_BASE, LED1)^LED1);
if(number != 0)
break;
case 2:
if(option == 0)
GPIOPinWrite(GPIO_PORTC_BASE, LED2, 0xff);
if(option == 1)
GPIOPinWrite(GPIO_PORTC_BASE, LED2, 0x00);
if(option == 2)
GPIOPinWrite(GPIO_PORTC_BASE, LED2, GPIOPinRead(GPIO_PORTC_BASE, LED2)^LED2);
if(number != 0)
break;
case 3:
if(option == 0)
GPIOPinWrite(GPIO_PORTC_BASE, LED3, 0xff);
if(option == 1)
GPIOPinWrite(GPIO_PORTC_BASE, LED3, 0x00);
if(option == 2)
GPIOPinWrite(GPIO_PORTC_BASE, LED3, GPIOPinRead(GPIO_PORTC_BASE, LED3)^LED3);
if(number != 0)
break;
case 4:
if(option == 0)
GPIOPinWrite(GPIO_PORTC_BASE, LED4, 0xff);
if(option == 1)
GPIOPinWrite(GPIO_PORTC_BASE, LED4, 0x00);
if(option == 2)
GPIOPinWrite(GPIO_PORTC_BASE, LED4, GPIOPinRead(GPIO_PORTC_BASE, LED4)^LED4);
if(number != 0)
break;
case 5:
if(option == 0)
GPIOPinWrite(GPIO_PORTB_BASE, LED5, 0xff);
if(option == 1)
GPIOPinWrite(GPIO_PORTB_BASE, LED5, 0x00);
if(option == 2)
GPIOPinWrite(GPIO_PORTB_BASE, LED5, GPIOPinRead(GPIO_PORTB_BASE, LED5)^LED5);
break;
}
}
void DirDisplay(void)
{
switch(MAP.dir)
{
case 0:
ZLG7289_Download(2, 3, 0, 0x47); // F
break;
case 1:
ZLG7289_Download(2, 3, 0, 0x77); // R
break;
case 2:
ZLG7289_Download(2, 3, 0, 0x1f); // b
break;
case 3:
ZLG7289_Download(2, 3, 0, 0x0e); // L
break;
default :
ZLG7289_Download(2, 3, 0, 0x4f); // E
break;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -