📄 bum.asm
字号:
;TCLK=1,强制使用定时器2作为发送的波特率发生器 mov T2MOD,#04h ;定时器2正向溢出(加) mov TH2,#0FFh ;波特率: 115200 bps, 晶振: 22.1184 MHz mov TL2,#0FAh mov RCAP2H,#0FFH mov RCAP2L,#0FAH setb TR2 ;定时器2开始定时 mov pcon,#00h ;波特率倍增 mov scon,#50h ;串口工作在方式1: 8位数据位,1位停止位,无较验 clr SP0_CTS clr SP0_RTS setb ps ;串行中断最高优先级 setb es ;开串行中断 ret;-------------------;打开串口(P1.2/P1.3);-------------------OpenBUM: clr ES1 ;关闭串行中断1 mov tcon,#00h mov tmod,#20h ;定时器1工作在方式2,自动加载计数初值 mov th1,#0ffh ;波特率: 115200 bps, 晶振: 22.1184 MHz mov tl1,#0ffh setb tr1 ;定时器1开始定时 mov WDCON,#80h ;波特率倍增 mov SCON1,#50h ;串口1工作在方式1: 8位数据位,1位停止位,无较验 clr SP1_CTS clr SP1_RTS setb PS1 ;串行中断最高优先级 setb ES1 ;开串行中断1 ret;-------------------------;BlueCore01 中断接收子程序;-------------------------;SP0_WL 写指针低八位地址;SP0_WH 写指针高八位地址;SP0_RL 读指针低八位地址;SP0_RH 读指针高八位地址;(SP0_LH,SP0_LL);... 中断接收缓冲区;(SP0_BH,SP0_BL)-1;-------------------------BC01_INT: jb ri,BC01_GET ;为发送中断,直接返回 retiBC01_GET: clr es clr ea push psw ;PSW,ACC,B,DPL,DPH push acc push b push dpl push dph setb ea mov dptr,#SP0_WL ;取出写指针放入DPTR中 movx a,@dptr mov b,a ;低八位->B mov dptr,#SP0_WH movx a,@dptr ;高八位->A mov dpl,b ;B->DPL mov dph,a ;A->DPH mov a,sbuf ;读出数据->A movx @dptr,a ;保存数据到缓冲区 inc dptr ;写指针下移 mov a,dph cjne a,#SP0_BH,SP0_False ;比较写指针是否指向缓冲区底部 mov dpl,#SP0_LL ;是,修改写指针指向缓冲区顶部 mov dph,#SP0_LHSP0_False: mov b,dph ;DPH->B mov a,dpl ;DPL->A mov dptr,#SP0_WL ;修改写指针低八位 movx @dptr,a mov dptr,#SP0_WH ;修改写指针高八位 mov a,b movx @dptr,a clr ri ;清接收标志位 clr ea pop dph ;DPH,DPL,B,ACC,PSW pop dpl pop b pop acc pop psw setb ea setb es reti;-------------------------;BUM 中断接收子程序;-------------------------;SP1_WL 写指针低八位地址;SP1_WH 写指针高八位地址;SP1_RL 读指针低八位地址;SP1_RH 读指针高八位地址;(SP1_LH,SP1_LL);... 中断接收缓冲区;(SP1_BH,SP1_BL)-1;-------------------------BUM_INT: jb RI_1,BUM_GET ;为发送中断,直接返回 retiBUM_GET: clr ES1 clr ea push psw ;PSW,ACC,B,DPL,DPH push acc push b push dpl push dph setb ea mov dptr,#SP1_WL ;取出写指针放入DPTR中 movx a,@dptr mov b,a ;低八位->B mov dptr,#SP1_WH movx a,@dptr ;高八位->A mov dpl,b ;B->DPL mov dph,a ;A->DPH mov a,SBUF1 ;读出数据->A movx @dptr,a ;保存数据到缓冲区 inc dptr ;写指针下移 mov a,dph cjne a,#SP1_BH,SP1_False ;比较写指针是否指向缓冲区底部 mov dpl,#SP1_LL ;是,修改写指针指向缓冲区顶部 mov dph,#SP1_LHSP1_False: mov b,dph ;DPH->B mov a,dpl ;DPL->A mov dptr,#SP1_WL ;修改写指针低八位 movx @dptr,a mov dptr,#SP1_WH ;修改写指针高八位 mov a,b movx @dptr,a clr RI_1 ;清接收标志位 clr ea pop dph ;DPH,DPL,B,ACC,PSW pop dpl pop b pop acc pop psw setb ea setb ES1 reti;---------------------;将A中的内容发送到BC01;---------------------BC01_PutByte: clr ti mov sbuf,a jnb ti,$ clr ti ret;--------------------;将A中的内容发送到BUM;--------------------BUM_PutByte: clr TI_1 mov SBUF1,a jnb TI_1,$ clr TI_1 mov a,STATUS ret;------------------------------;从BC01的中断缓冲区读出一个字节;入口参数: R0 == 00H 为空不延时; != 00H 为空延时5ms;返回参数: R6 == 00H 读数据成功; != 00H 缓冲区为空; R7 <-读出的数据;------------------------------BC01_GetByte: push acc push psw push dpl push dphBC01_CBUF: mov dptr,#SP0_WL ;取出写指针低八位放入B movx a,@dptr mov b,a mov dptr,#SP0_RL ;取出读指针低八位放入A movx a,@dptr cjne a,b,BC01Get ;(A) != (B) , 缓冲区非空 , 跳至BC01_Get ;低八位相等 mov dptr,#SP0_WH ;取出写指针高八位放入B movx a,@dptr mov b,a mov dptr,#SP0_RH ;取出读指针高八位放入A movx a,@dptr cjne a,b,BC01Get ;(A) != (B) , 缓冲区非空 , 跳至BC01_GetBC01_Wait: cjne r0,#00,BC01_Delay ;接收缓冲区为空 mov r6,#0ffh mov r7,#00h pop dph pop dpl pop psw pop acc retBC01_Delay: lcall Delay5ms mov r0,#00h ljmp BC01_CBUFBC01Get: ;缓冲区非空,取出1个字节 mov dptr,#SP0_RL ;取出读指针低八位->B movx a,@dptr mov b,a mov dptr,#SP0_RH ;取出读指针高八位->DPH movx a,@dptr mov dph,a mov dpl,b ;读出数据 movx a,@dptr ;读出缓冲区数据->R7 mov r7,a mov r6,#00h ;读数据成功(R6=00h) ;读出的单元清零 mov a,#00h movx @dptr,a ;修改读指针 inc dptr ;写指针下移一个单元 mov a,dph cjne a,#SP0_BH,BC01_SaveR ;比较写指针是否指向缓冲区底部 ;读指针指向底部,修改为顶部 mov dpl,#SP0_LL mov dph,#SP0_LHBC01_SaveR: ;修读写指针 mov b,dpl mov a,dph mov dptr,#SP0_RH movx @dptr,a mov dptr,#SP0_RL mov a,b movx @dptr,a pop dph pop dpl pop psw pop acc ret;------------------------------;从BUM的中断缓冲区读出一个字节;入口参数: R0 == 00H 为空不延时; != 00H 为空延时5ms;返回参数: R6 == 00H 读数据成功; != 00H 缓冲区为空; R7 <-读出的数据;------------------------------BUM_GetByte: push acc push psw push dpl push dphBUM_CBUF: mov dptr,#SP1_WL ;取出写指针低八位放入B movx a,@dptr mov b,a mov dptr,#SP1_RL ;取出读指针低八位放入A movx a,@dptr cjne a,b,BUMGet ;(A) != (B) , 缓冲区非空 , 跳至BUM_Get ;低八位相等 mov dptr,#SP1_WH ;取出写指针高八位放入B movx a,@dptr mov b,a mov dptr,#SP1_RH ;取出读指针高八位放入A movx a,@dptr cjne a,b,BUMGet ;(A) != (B) , 缓冲区非空 , 跳至BUM_GetBUM_Wait: cjne r0,#00,BUM_Delay ;接收缓冲区为空 mov r6,#0ffh mov r7,#00h pop dph pop dpl pop psw pop acc retBUM_Delay: lcall Delay5ms mov r0,#00h ljmp BUM_CBUFBUMGet: ;缓冲区非空,取出1个字节 mov dptr,#SP1_RL ;取出读指针低八位->B movx a,@dptr mov b,a mov dptr,#SP1_RH ;取出读指针高八位->DPH movx a,@dptr mov dph,a mov dpl,b ;读出数据 movx a,@dptr ;读出缓冲区数据->R7 mov r7,a mov r6,#00h ;读数据成功(R6=00h) ;读出的单元清零 mov a,#00h movx @dptr,a ;修改读指针 inc dptr ;写指针下移一个单元 mov a,dph cjne a,#SP1_BH,BUM_SaveR ;比较写指针是否指向缓冲区底部 ;读指针指向底部,修改为顶部 mov dpl,#SP1_LL mov dph,#SP1_LHBUM_SaveR: ;修读写指针 mov b,dpl mov a,dph mov dptr,#SP1_RH movx @dptr,a mov dptr,#SP1_RL mov a,b movx @dptr,a pop dph pop dpl pop psw pop acc ret;---------------------;发送一条HCI指令到BC01;指令首地址:DPTR;---------------------BC01_PutCommand: push psw ;PSW,ACC,R6 push acc mov a,r6 push acc mov a,#00h movc a,@a+dptr ;指令长度->APC_Continue: jz PCReturn ;A=0,发送完成返回 inc dptr ;指令指针下移 mov r6,a ;指令长度->R6 mov a,#00h movc a,@a+dptr ;指令内容->A lcall BC01_PutByte ;发送指令内容 mov a,r6 ;指令长度->A dec a ;(指令长度-1)->A sjmp PC_ContinuePCReturn: pop acc ;R6,ACC,PSW mov r6,a pop acc pop psw ret;------------------------------------------------------------------------------------;Bluetooth Host Controller Interface Command;------------------------------------------------------------------------------------;-------------;发送HCI_Reset;-------------HCI_Reset: push acc mov a,#01h lcall BC01_PutByte mov a,#03h lcall BC01_PutByte mov a,#0ch lcall BC01_PutByte mov a,#00h ;Length lcall BC01_PutByte pop acc ret;--------------------;发送HCI_Read_BD_ADDR;--------------------HCI_Read_BD_ADDR: push acc mov a,#01h lcall BC01_PutByte mov a,#09h lcall BC01_PutByte mov a,#10h lcall BC01_PutByte mov a,#00h ;Length lcall BC01_PutByte pop acc ret;---------------------------------;发送HCI_Set_Event_Filter;指令参数:; Filter_Type = R0(02H); Filter_Condition_Type = R1(00H); Condition = R2(02H);---------------------------------HCI_Set_Event_Filter: push acc mov a,#01h lcall BC01_PutByte mov a,#05h lcall BC01_PutByte mov a,#0ch lcall BC01_PutByte cjne r0,#00h,HCI_SEF mov a,#01h ;Length lcall BC01_PutByte mov a,r0 ;Filter_Type(00H) lcall BC01_PutByte pop acc retHCI_SEF: mov a,#03h lcall BC01_PutByte mov a,r0 ;Filter_Type lcall BC01_PutByte mov a,r1 ;Filter_Condition_Type lcall BC01_PutByte mov a,r2 ;Condition lcall BC01_PutByte pop acc ret;-------------------------------------;发送HCI_Write_Page_Scan_Activity;指令参数:; Page_Scan_Interval = (R1,R0)(0040H); Page_Scan_Window = (R3,R2)(0020H);-------------------------------------HCI_Write_Page_Scan_Activity: push acc mov a,#01h lcall BC01_PutByte mov a,#1ch lcall BC01_PutByte mov a,#0ch lcall BC01_PutByte mov a,#04h ;Length lcall BC01_PutByte mov a,r0 ;Page_Scan_Interval lcall BC01_PutByte mov a,r1 lcall BC01_PutByte mov a,r2 ;Page_Scan_Window lcall BC01_PutByte mov a,r3 lcall BC01_PutByte pop acc ret;----------------------------------------;发送HCI_Write_Inquiry_Scan_Activity;指令参数:; Inquiry_Scan_Interval = (R1,R0)(0040H); Inquiry_Scan_Window = (R3,R2)(0020H);----------------------------------------HCI_Write_Inquiry_Scan_Activity: push acc mov a,#01h lcall BC01_PutByte mov a,#1eh lcall BC01_PutByte mov a,#0ch lcall BC01_PutByte mov a,#04h ;Length lcall BC01_PutByte mov a,r0 ;Inquiry_Scan_Interval lcall BC01_PutByte mov a,r1 lcall BC01_PutByte mov a,r2 ;Inquiry_Scan_Window lcall BC01_PutByte mov a,r3 lcall BC01_PutByte pop acc ret;-------------------------;发送HCI_Write_Scan_Enable;指令参数:; Scan_Enable = R0(03H);-------------------------HCI_Write_Scan_Enable: push acc mov a,#01h lcall BC01_PutByte mov a,#1ah lcall BC01_PutByte mov a,#0ch lcall BC01_PutByte mov a,#01h ;Length lcall BC01_PutByte mov a,r0 ;Scan_Enable lcall BC01_PutByte pop acc ret;---------------------------------------;发送HCI_Inquiry;指令参数:; LAP = (R2,R1,R0)(9E8B33H); Inquiry_Length = R3(0AH); Num_Response = R4(08H);---------------------------------------HCI_Inquiry: push acc mov a,#01h lcall BC01_PutByte mov a,#01h lcall BC01_PutByte mov a,#04h lcall BC01_PutByte mov a,#05h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -