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

📄 drivers.asm

📁 基于凌阳61和pwm电机实现的智能车总程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.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


//======================================================
// 函数名称:	F_Pwm
// 实现功能:    PWM设置
// 入口参数:   频率设置值,占空比设置值
// 出口参数:   无
// 破坏寄存器:  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          //读状态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                      /////有光时传感器状态????
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 + -