📄 basicmainl.asm
字号:
;************************************************************************
BCAN_SET_BANDRATE:
MOV A,R7 ;判断波特率的值是否存在
CLR CY
SUBB A,#13 ;
SETB F0
JNC BCAN_SETBR_QUIT ;输入的值大于12则不正确
CLR F0
MOV A,R7
RL A
MOV DPTR,#BCAN_SETBR ;查表找出相应的预设第一个值
MOVC A,@A+DPTR
MOV R5,A ;将数据保存
MOV A,R7 ;找出第二个值
RL A
INC A
MOVC A,@A+DPTR
MOV R6,A ;保存值
MOV R0,#REG_BTR0 ;装入波特率预设值,同步跳转宽度
;位宽度
MOV A,R5
MOVX @R0,A
SETB F0
NOP
MOVX A,@R0
XRL A,R5 ;判断写入是否正确
JNZ BCAN_SETBR_QUIT ;不正确
CLR F0
INC R0
MOV A,R6
MOVX @R0,A
SETB F0
NOP
MOVX A,@R0
XRL A,R6 ;判断写入是否正确
JNZ BCAN_SETBR_QUIT
CLR F0
BCAN_SETBR_QUIT:
RET
BCAN_SETBR:
DB 053H, 02FH ;20KBPS的预设值
DB 087H, 0FFH ;40KBPS的预设值
DB 047H, 02FH ;50KBPS的预设值
DB 083H, 0FFH ;80KBPS的预设值
;DB 043H, 02fH ;100KBPS的预设值
DB 042H, 02FH ;100KBPS的预设值 12MHZ晶振
DB 03H, 01cH ;125KBPS的预设值
DB 081H, 0faH ;200KBPS的预设值
DB 01H, 01cH ;250KBPS的预设值
DB 080H, 0faH ;400KBPS的预设值
DB 00H, 01cH ;500KBPS的预设值
DB 080H, 0b6H ;666KBPS的预设值
DB 00H, 016H ;800KBPS的预设值
DB 00H, 014H ;1000KBPS的预设值
;************************************************************************
;*子程序: BCAN_SET_OBJECT *
;*应用资源: R0,ACC,R6,R7,F0 *
;* R7:存放验收代码寄存器(ACR)的参数设置 *
;* R6:存放接收屏蔽寄存器(AMR)的参数设置 *
;*返回值: F0,存放返回值 *
;* 0 ;通信对象设置成功 *
;* 1 ;通信对象设置失败 *
;* *
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
;* 允许接收的报文,是由AMR和ACR共同决定的. *
;* 满足以下条件的ID号的报文才可以被接收 *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
;* 该子程序只能用于复位模式 * *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #0AAH ;;只允许接收ID号高8位为'10101010'*
;* MOV R6, #00H ;; *
;* LCALL BCAN_SET_OBJECT ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_SET_OBJECT:
MOV R0,#REG_ACR ;写ACR寄存器
MOV A,R7
MOVX @R0,A
NOP
NOP
MOVX A,@R0
SETB F0
XRL A,R7 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
INC R0 ;写AMR寄存器
MOV A,R6
MOVX @R0,A
NOP
NOP
MOVX A,@R0
SETB F0
XRL A,R6 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
BCAN_SETO_QUIT:
RET
;************************************************************************
;*子程序: BCAN_SET_OUTCLK *
;*应用资源: R0,ACC,R6,R7,F0,B *
;* R7:存放输出寄存器(OCR)的参数设置 *
;* R6:存放时钟分品寄存器(REG_CDR)的参数设置 *
;*返回值: F0,存放返回值 *
;* 0 ;设置成功 *
;* 1 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 * *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #0AAH ;;输出为正常模式 *
;* MOV R6, #048H ;;禁止CLKOUT,BasicCAN模式 *
;* LCALL BCAN_SET_OUTCLK ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_SET_OUTCLK:
MOV R0,#REG_OCR ;写OCR寄存器
MOV A,R7
MOVX @R0,A
MOV B,A
NOP
NOP
MOVX A,@R0
SETB F0
CJNE A,B,BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
MOV R0,#REG_CDR ;写CDR寄存器
MOV A,R6
MOVX @R0,A
MOV B,A
MOVX A,@R0
SETB F0
CJNE A,B,BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
BCAN_SETOC_QUIT:
RET
;************************************************************************
;*函数: BCAN_CMD_PRG *
;*应用资源: DPTR,ACC,R7,F0 *
;*参数说明: R7,存放命令字 *
;* 0x01 ;//发送请求命令 *
;* 0x02 ;//夭折发送命令 *
;* 0x04 ;//释放接收缓冲区 *
;* 0x08 ;//清除超载状态 *
;* 0x10 ;//进入睡眠状态命令 *
;* *
;*返回值: F0,存放返回值 *
;* 0 ; 执行命令成功 *
;* 1 ; 执行命令失败 *
;* *
;*说明:本子程序为SJA1000的命令执行程序 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #01H ;;发送请求命令 *
;* LCALL BCAN_CMD_PRG ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_CMD_PRG:
MOV A, R7
CJNE A, #01, BCAN_CMD1
;发送请求命令
MOV R0, #REG_COMMAND; 地址指向命令寄存器
MOVX @R0, A ;写入命令字
CLR F0
RET
BCAN_CMD1:
CJNE A, #02, BCAN_CMD2
;;//夭折发送命令
MOV R0, #REG_STATUS ;地址指向状态寄存器
MOVX A, @R0 ;判断是否有正在发送的状态
SETB F0
JB ACC.5, BCAN_CMD_QUIT
CLR F0
BCAN_CMD_QUIT:
RET
BCAN_CMD2:
CJNE A, #04, BCAN_CMD3
;释放接收缓冲区
MOV R0, #REG_COMMAND; 地址指向命令寄存器
MOVX @R0, A ;写入命令字
NOP
NOP
MOV R0, #REG_STATUS ;判断是否释放成功
MOVX A, @R0
SETB F0
JB ACC.0, BCAN_DB_QUIT ;不成功跳转
CLR F0
BCAN_DB_QUIT:
RET
BCAN_CMD3:
CJNE A, #08, BCAN_CMD4
;清除超载状态
MOV R0, #REG_COMMAND; 地址指向命令寄存器
MOVX @R0, A ;写入命令字
NOP
NOP
MOV R0, #REG_STATUS ;判断清除超载是否成功
MOVX A, @R0
SETB F0
JB ACC.1, BCAN_DOVER_QUIT ;不成功跳转
CLR F0
BCAN_DOVER_QUIT:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -