?? drivers.asm
字號:
.public Forward
Forward: .proc
push r1,r2 to [sp]
SET_IOA_IN;
r1 = 0x000f
r2 = [P_IOA_Data]
r1 = r1 | r2
r2 = r1 & 0xfff9
// r2 = r2 & r1
SET_IOA_OUT
[P_IOA_Data] = R2
r1 = [B2C]
test r1,1
jz ?straight
?round:
r1 = 0x8000
r2 = 0x0090
call F_Pwm
pc = ?go
?straight:
r1 = 0x5000
r2 = 0x00f0
call F_Pwm
// call delay_1
?go:
pop r1,r2 from [sp]
retf
.endp
//**********************************************//
//Function Name : BackWard //
//Function : BackWard (void) //
//Input : none //
//Output : car go Backward //
//Destroy : none //
.public Backward
Backward: .proc
push r1,r2 to [sp]
SET_IOA_IN;
r1 = 0x000f
r2 = [P_IOA_Data]
r1 = r1 | r2
// r2 = C_CAR_Backward
r2 = r1 & 0xfff6
// r2 = r2 & r1
SET_IOA_OUT
[P_IOA_Data] = R2
r1 = 0xa000
// r2 = 0x0140
r2 =0x0140
call F_Pwm
call delay_1
pop r1,r2 from [sp]
retf
.endp
//**********************************************//
//Function Name : Round //
//Function : Round (void) //
//Input : none //
//Output : car go Round //
//Destroy : none //
.public Round
Round: .proc
push r1,r2 to [sp]
SET_IOA_IN;
r1 = 0x000f
r2 = [P_IOA_Data]
r1 = r1 | r2
r2 = C_CAR_Round
r2 = r2 &r1
// r2 = r2 & r1
SET_IOA_OUT
[P_IOA_Data] = R2
pop r1,r2 from [sp]
retf
.endp
//**********************************************//
//Function Name : Stop //
//Function : Stop (void) //
//Input : none //
//Output : car stop //
//Destroy : none //
.public Stop
Stop: .proc
push r1,r2 to [sp]
SET_IOA_IN;
R1 = [P_IOA_Data]
r2 = C_CAR_Stop
r2 = r2 | r1
SET_IOA_OUT
[P_IOA_Data] = R2
pop r1,r2 from [sp]
retf
.endp
//**********************************************//
//Function Name : F_TestState //
//Function : F_TestState (void) //
//Input : r4 //
//Output : car`s movement //
//Destroy : none //
.public F_TestState
F_TestState: .proc
// CALL Stop
r4 = [P_IOB_Data]
R4 &= 0xC000
cmp r4,0x0000
je GoForward
cmp r4,0x4000
je GoLeft
cmp r4,0x8000
je GoRight
pc = exit
GoForward: //前進
// r1 = 0x0000
// r2 = 0x0000
// call F_Pwm
[LastState] = r4
call Forward
pc = exit
GoLeft:
// r1 = 0x0000
// r2 = 0x0000
// call F_Pwm
[LastState] = r4
// r1 = 0x0020
// r2 = 0x0340
call TurnLeft
pc = exit
GoRight:
// r1 = 0x0000
// r2 = 0x0000
// call F_Pwm
[LastState] = r4
call TurnRight
exit:
retf
.endp
//**********************************************//
//Function Name : Delay //
//Function : Delay (void) //
//Input : none //
//Output : delay //
//Destroy : none //
.public delay
delay: .proc
int off
push r1,r2 to [sp]
R2 = 0x0FFF
L_DELAY:
CLEAR_WATCHDOG
PUSH R1,R5 TO [SP]
NOP
nop
POP R1,R5 FROM [SP]
R2 -= 1
CMP R2,0
JNE L_DELAY
CLEAR_WATCHDOG
pop r1,r2 from [sp]
IRQ ON
retf
.endp
//**********************************************//
//Function Name : Delay_1 //
//Function : Delay_1 (void) //
//Input : none //
//Output : delay //
//Destroy : none //
.public delay_1
delay_1: .proc
int off
push r1,r2 to [sp]
R2 = 0x06FF
L_DELAY_1:
CLEAR_WATCHDOG
PUSH R1,R5 TO [SP]
NOP
POP R1,R5 FROM [SP]
R2 -= 1
CMP R2,0
JNE L_DELAY_1
CLEAR_WATCHDOG
pop r1,r2 from [sp]
IRQ ON
retf
.endp
//======================================================
// 函數(shù)名稱: F_Pwm
// 實現(xiàn)功能: PWM設置
// 入口參數(shù): 頻率設置值,占空比設置值
// 出口參數(shù): 無
// 破壞寄存器: r1,r2
//======================================================
.public F_Pwm;
F_Pwm: .proc
// push bp to [sp];
// bp=sp+3
// r1=[bp+1];
[P_TimerA_Data]=r1;
// r2=[bp+2];
[P_TimerA_Ctrl]=r2;
r1=0x0000;
[P_FeedBack]=r1; //設置IOB8口為APWMO端口
// pop bp from [sp];
retf
.endp
.public AlertMetal
AlertMetal: .proc
WR_8279_CONTROL 0xD000
?LOP:
nop
RD_8279_STATUS //讀狀態(tài)REG,比較是否清除完成
TEST R1,0x8000
JNZ ?LOP
call Hex2Dec
SET_IOA_IN
R1 = [P_IOA_Data]
R2 = 0x00C0
r1 = R1|R2
r3 = r1
SET_IOA_OUT
[P_IOA_Data]= R3
r1 = 0x000f
l:
r1 -= 1
CALL delay
cmp r1,0
jne l
r1 = [P_TimerB_Data]
r2 = 4
mr = r1* r2,us
call Hex2Dec
R2 = 0xff3f
r1 = R1&R2
r3 = r1
SET_IOA_OUT
[P_IOA_Data]= R3
//////////
retf
.endp
.public TestObject
TestObject: .proc
r1 = [P_IOB_Data]
r1 = r1 & 0x3000
cmp r1,0x3000 //左障
je LeftObject
cmp r1,0x0000 //右障
je RightObject
cmp r1,0x2000 //正前方
je MidObject
pc = exit_TestObject
LeftObject:
r1 = 1
[TestObjectFlag] = r1
pc = exit_TestObject
RightObject:
r1 = 2
[TestObjectFlag] = r1
pc = exit_TestObject
MidObject:
r1 = 3
[TestObjectFlag] = r1
// pc = exit_TestObject
exit_TestObject:
retf
.endp
.public gogogo
gogogo: .proc
r4 = 0
[B2C] = r4
call TurnLeft
r4 = 0x021f
golop:
r4 -= 1
call delay
CLEAR_WATCHDOG
cmp r4,0
jne golop
call Forward
r4 = 0x0215
golop2:
r4 -= 1
call delay
CLEAR_WATCHDOG
cmp r4,0
jne golop2
call TurnRight
r4 = 0x01b3
golop3:
r4 -= 1
call delay
CLEAR_WATCHDOG
cmp r4,0
jne golop3
call Forward
r4 = 0x023f
golop4:
r4 -= 1
call delay
CLEAR_WATCHDOG
cmp r4,0
jne golop4
r1 = 0
[P_INT_Ctrl] = r1
r1 = [Time]
r2 = 2
mr = r1 * r2,us
call Hex2Dec
lop:
call Stop
//call TestLightSensor
CLEAR_WATCHDOG
jmp lop
retf
.endp
.public Forward1
Forward1: .proc
retf
.endp
.public TurnLeft1
TurnLeft1: .proc
push r1,r2 to [sp]
SET_IOA_IN;
r1 = 0x000f
r2 = [P_IOA_Data]
r1 = r1 | r2
r2 = r1 & 0xfff5
// r2 = r2 & r1
SET_IOA_OUT
[P_IOA_Data] = R2
r1 = 0x0500
r2 = 0x0300
call F_Pwm
// call delay_1
pop r1,r2 from [sp]
retf
.endp
.public TurnRight1
TurnRight1: .proc
push r1,r2 to [sp]
SET_IOA_IN;
// r2 = C_CAR_TurnRight1
// r2 = 0xfff5
r1 = 0x000f
r2 = [P_IOA_Data]
r1 = r1 | r2
R2 = r1 & 0xFFFA
SET_IOA_OUT
[P_IOA_Data] = R2
r1 = 0x0500
r2 = 0x0300
call F_Pwm
pop r1,r2 from [sp]
retf
.endp
.public TestLightSensor
TestLightSensor: .proc
SET_IOA_IN
R1 = [P_IOA_Data]
Test r1,0x0020 /////////光敏上口
Jz NoLight /////有光時傳感器狀態(tài)????
BackLop:
R1= [P_IOA_Data]
Test r1,0x0010 ///////光敏下口
Jnz DeadLop
BackLop1:
Call Backward
R1 = [P_IOA_Data]
TEST R1,0x0010
Jz BackLop1
DeadLop:
R1 = 0
[P_INT_Ctrl] = r1
r1 = [TimeB2C]
r2= 2
mr = r1*r2,us
call Hex2Dec
Call Stop
CLEAR_WATCHDOG
JMP DeadLop
NoLight:
Call LastTurnRight
Retf
.endp
.public Stop5Sec
Stop5Sec: .proc
R1 = [Time5Sec]
R1+=1
Cmp r1,50
Je ClearFlag
Pc = In5Sec
ClearFlag:
R1 = 0
[Time5SecFlag]= r1
r1 = [LastIntCtrlStatus] ///
[P_INT_Ctrl] = r1
pc = Stop5SecExit
In5Sec:
[Time5Sec]=r1
r1 = 0x0040
[P_INT_Ctrl] = r1
call Stop
SET_IOA_IN
R2=[P_IOA_Data]
Test r2,0x00c0
Jnz Clear
R2=R2|0x00c0
SET_IOA_OUT
[P_IOA_Data] = R2
pc = Stop5SecExit
Clear:
R2=R2&0xff3f
SET_IOA_OUT
[P_IOA_Data] = R2
Stop5SecExit:
Retf
.endp
.END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -