📄 can.asm
字号:
CJNE A,#05,NOMOVEDISPBIT
MOVEDISPBIT:
MOV DISP_POINT,#00
AJMP NEXT_DISPBIT
NOMOVEDISPBIT:
JNC MOVEDISPBIT
NEXT_DISPBIT:
INC SEC_COUNT_L ;单位时间计数器
MOV A,SEC_COUNT_L
CJNE A,#200,T0_QUIT ;判断1/5秒时间是否到
MOV SEC_COUNT_L,#00 ;重新计数
INC SEC_COUNT_H ;单位时间计数器
MOV A,SEC_COUNT_H
CJNE A,#6,T0_QUIT ;判断1秒时间是否到
MOV SEC_COUNT_H,#00 ;重新计数
SETB SEC_FLAG ;置位1秒到标志
INC TEST_DATA ;测试发送的数据,每1秒加1
T0_QUIT:
POP ACC
POP PSW
POP DPL
POP DPH
RETI
;;;;;;;LED 送显处理程序;;;;;;;;;;
DISPLAY_PRG:
MOV DPTR,#KEYLED_BUF
MOV A,#0FFH
MOVX @DPTR,A
ORL P1,#0F8H
;;;;;;;UP IS DISABLE DISPLAY;;;;;;;;;;
MOV A,#DISPLAYBUF0
ADD A,DISP_POINT
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPSEG_TAB
MOVC A,@A+DPTR
MOV DPTR,#KEYLED_BUF
MOVX @DPTR,A
;;;;;;;;UP IS SEND SEG;;;;;
MOV A,DISP_POINT
RL A
MOV DPTR,#DISPBIT_TAB
JMP @A+DPTR
;LED段码译码
DISPSEG_TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ; //0X00--0X07
DB 080H,090H,088H,083H,0c6H,0a1H,086H,08eH ; //0X08--0X0f
DB 0c8H,08cH,0bfH ; //n, p, -
;LED位跳转
DISPBIT_TAB:
JMP DISP_LED0
JMP DISP_LED1
JMP DISP_LED2
JMP DISP_LED3
JMP DISP_LED4
DISP_LED0:
CLR EN_DISPBIT0
JNB FLIGHBIT0,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT0
AJMP DISP_QUIT
DISP_LED1:
CLR EN_DISPBIT1
JNB FLIGHBIT1,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT1
AJMP DISP_QUIT
DISP_LED2:
CLR EN_DISPBIT2
JNB FLIGHBIT2,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT2
AJMP DISP_QUIT
DISP_LED3:
CLR EN_DISPBIT3
JNB FLIGHBIT3,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT3
AJMP DISP_QUIT
DISP_LED4:
CLR EN_DISPBIT4
JNB FLIGHBIT4,DISP_QUIT
JNB FLIGHSYNC,DISP_QUIT
SETB EN_DISPBIT4
DISP_QUIT:
RET
;;;;;;;;;;系统出错时显示
DISP_ERROR:
MOV R0,#DISPLAYBUF0
INC R0
MOV @R0,#0EH
INC R0
MOV @R0,#12H
INC R0
MOV A,ERROR_STATUS
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
MOV A,ERROR_STATUS
ANL A,#0FH
MOV @R0,A
MOV FLIGHDISP,#01FH
RET
;;;;;;;;;;CAN通讯正常时显示
DISP_OK:
CLR A
MOV FLIGHDISP,A
MOV ERROR_STATUS,A
MOV R0,#DISPLAYBUF0+01
MOV @R0,#0
INC R0
MOV @R0,#12H
INC R0
MOV A,RCV_DATA_BUF3
ANL A,#0F0H
SWAP A
MOV @R0,A
INC R0
MOV A,RCV_DATA_BUF3
ANL A,#0FH
MOV @R0,A
RET
;
;$INCLUDE (SJA_BCANCONF.ASM)
;//以下为函数定义
;************************************************************************
;*函数: BCAN_CREATE_COMMUNATION *
;*应用资源: DPTR,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示SJA1000接口正常 *
;* 1 ; 表示SJA1000与处理器接口不正常 *
;* *
;*说明:该函数用于检测CAN控制器的接口是否正常 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_CREATE_COMMUNATION ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;接口不正常跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_CREATE_COMMUNATION:
MOV DPTR, #REG_TEST ;对测试寄存器进行读写测试
MOVX A, @DPTR
MOV A, #0AAH ;写入值0AAH
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR ;读出值
CJNE A, #0AAH,BCAN_CM_QUIT ;测试写入读出是否正确
MOV A, #055H ;再次测试
MOVX @DPTR, A ;写入055H
MOVX A, @DPTR
CJNE A, #055H,BCAN_CM_QUIT ;测试写入读出是否正确
CLR A ;清零测试寄存器
MOVX @DPTR, A
CLR F0 ;接口正确
BCAN_CM_QUIT:
RET
;************************************************************************
;*函数: BCAN_ENTER_RETMODEL *
;*应用资源: DPTR,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示成功进入复位工作模式 *
;* 1 ; 表示不能进入复位工作模式 *
;* *
;*说明:CAN控制器进入复位工作模式 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_ENTER_RETMODEL ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;复位请求不成功跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_ENTER_RETMODEL:
MOV DPTR, #REG_CONTROL ;控制寄存器访问
MOVX A, @DPTR ;
ORL A, #01H ;置位复位请求
MOVX @DPTR, A ;
CLR F0
MOVX A, @DPTR ;验证复位是否写入
JB ACC.0, BCAN_ER_QUIT
SETB F0 ;复位不成功
BCAN_ER_QUIT:
RET
;************************************************************************
;*函数: BCAN_QUIT_RETMODEL *
;*应用资源: DPTR,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示成功退出复位工作模式 *
;* 1 ; 表示不能退出复位工作模式 *
;* *
;*说明:CAN控制器退出复位工作模式,进入工作模式 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_QUIT_RETMODEL ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;不能退出复位模式跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_QUIT_RETMODEL:
MOV DPTR, #REG_CONTROL ; 控制寄存器访问
MOVX A, @DPTR ;
ANL A, #0FEH ;清零复位请求,进入工作状态
MOVX @DPTR, A
CLR F0
MOVX A, @DPTR
JNB ACC.0, BCAN_QR_QUIT ;验证是否退出复位状态
SETB F0
BCAN_QR_QUIT:
RET
;************************************************************************
;*函数: BCAN_DATA_WRITE *
;*应用资源: DPTR,ACC,R0,R7 *
;*参数说明: *
;* R0:存放待发送特定帧各式的数据的首地址 *
;* *
;*返回值: F0,存放返回值 *
;* 0 ; 表示将数据成功的送至发送缓冲区 *
;* 1 ; 表示上一次的数据正在发送, *
;* ; 表示发送缓冲区被锁定,不能写入数据 *
;* ; 表示写入数据错误 *
;* *
;*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
;* SJA1000发送。 *
;* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
;* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
;* *
;*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
;* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否,要向总线发送请在*
;* 本子程序后调用发送命令 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R0, #DATA_BUF0 ;;装入微处理器要发送数据的首地址 *
;* LCALL BCAN_DATA_WRITE ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;写入发送缓冲区错跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_DATA_WRITE:
MOV DPTR, #REG_STATUS ;读取状态寄存器
MOVX A, @DPTR ;判断上次发送是否完成
SETB F0
JNB ACC.3, BCAN_DW_QUIT ;正在发送退出
CLR F0
MOVX A, @DPTR ;判断发送缓冲区是否锁定,
SETB F0
JNB ACC.2, BCAN_DW_QUIT ;锁定则跳出
CLR F0
INC R0 ;
MOV A, @R0 ;ID号的低3位 \RTR位 \数据长度DLC
DEC R0 ;恢复指针指向发送数据的首地址
MOV DPTR, #REG_TxBuffer1;发送缓冲区首地址
JB ACC.4, BCAN_WYB ;远程帧
;数据帧
ANL A, #0FH ;计算发送数据的长度
ADD A, #02H
MOV R7, A
AJMP BCAN_WRTXBUF ;
BCAN_WYB:
MOV R7, #02 ;写入发送缓冲区数据长度为2
BCAN_WRTXBUF:
MOV A, @R0 ;开始写入
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR ;校验写入的是否正确
XRL A, @R0
JNZ BCAN_DW_QUIT ;写入错误退出
CLR F0 ;正确写入继续
INC R0
INC DPTR
DJNZ R7, BCAN_WRTXBUF ;没有写完继续
BCAN_DW_QUIT:
RET
;************************************************************************
;*函数: BCAN_DATA_RECEIVE *
;*应用资源: DPTR,ACC,R0,R7 ,F0 *
;*参数说明: R0,存放微处理器保存数据缓冲区的首地址 *
;*返回值: F0=0;接收成功 *
;* F0=1;接收失败 *
;*说明:CAN控制器接收数据,仅限于接收数据 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -