📄 f310kz4.29.asm
字号:
;LJMP PCA_INT ;PCA中断
;ORG 63H
;LJMP CP0_INT ;比较器零中断
;ORG 6BH
;LJMP CP1_INT ;比较器1中断
;ORG 13H
;RETI ;外部中断1
;ORG 2BH
;LJMP T2OVER ;T2溢出
ORG 100H
FREST_ISR: ;
;##############################################
;系统设置
;##############################################
NOP
OSC_WAIT0:
mov OSCICN,#83H ;内部振荡器允许
MOV A,OSCICN
JNB ACC.6,OSC_WAIT0
mov clksel,#0
MOV PCON,#00H ;电源配置
ORL VDM0CN,#80H ;VDD监视器使能
MOV SP,#50H
MOV RSTSRC,#06H ;VDD 复位使能
MOV REF0CN,#04H ;VDD使能为参考电源
anl pca0md,#10111111b
;*********************************
; I/O配置
;*********************************
CLR P0.5
CLR P0.4
;所有引脚均为数字I/O
MOV P0MDIN,#11111111B
MOV P1MDIN,#0FFH
MOV P2MDIN,#0FFH
MOV P3MDIN,#0FH
;除I2C外,所有引脚均为推挽输出
MOV P0MDOUT,#01111111b
MOV P1MDOUT,#0FCH
MOV P2MDOUT,#0F7H
MOV P3MDOUT,#0FH
;XTAL1 XTAL2,跳过交叉开关 ;外部中断口CAN_INT跳过交叉开关
MOV P0SKIP,#10001100B
MOV P1SKIP,#00H
MOV P2SKIP,#00H
MOV XBR0,#07H
MOV XBR1,#40H
SETB P0.5
SETB P0.4
MOV SP,#50H
CLR P2.1
SETB P2.1
SETB P2.2
SETB P1.6
SETB P1.7
CLR P2.0
lcall tdelay1ms
lcall tdelay1ms
lcall tdelay1ms
lcall tdelay1ms
RAM_RST: ;RAM区初始化
MOV R0,#00H
CLR A
MOV R1,#0FFH
RAM_LOOP:
MOV @R0,A
INC R0
DJNZ R1,RAM_LOOP
ORL RST_DATA,#01H
CODE_RST: ;CODE区初始化
MOV DPTR,#BELAY
CLR A
MOV AL,#21
MOV BL,#0
MOV BH,#0
CODE_LOOP:
MOV A,BH
MOVC A,@A+DPTR
MOV B,A
MOV A,BL
ADD A,B
MOV BL,A
INC BH
DJNZ AL,CODE_LOOP
MOV A,BL
CJNE A,#210,FREST1
ORL RST_DATA,#02H
SJMP ISP_RST
RET
FREST1: LJMP FREST_ISR
RET
ISP_RST:
MOV IT01CF,#01110000B ;中断初始化
MOV IE,#04H
MOV IP,#01H
MOV EIE1,#00H
MOV EIP1,#00H
SETB EA
SETB EA
ORL RST_DATA,#04H
ACALL T3_RST
ACALL I2C_RST
ACALL SPI_RST
CAN_TEST2:
ACALL CAN_RST0;
ACALL CAN_TEST0
MOV A,CAN_TEST
CJNE A,#01, CAN_TEST2
LOP:
LCALL can_send1
LOP1:
CLR P1.6
MOV SPI0DAT,#0A0H
JNB TXBMT,$
JNB SPIF,$
CLR SPIF
MOV SPI0DAT,#0A0H
JNB TXBMT,$
JNB SPIF,$
CLR SPIF
MOV A,SPI0DAT
SETB P1.6
JB ACC.2,LOP1
SJMP LOP
;ACALL T3_RST
;LCALL T2_RST
LCALL UART0_RST
;SETB STO
MESSAGE_RET:
ACALL SMBus_TEST
;SJMP MESSAGE_RET
lcall tdelay1ms
lcall tdelay1ms
lcall tdelay1ms
lcall tdelay1ms
;ORL RST_DATA,#10H
;SJMP MESSAGE_RET
;LCALL UART0_TEST
;ORL RST_DATA,#20H
;LCALL CAN_RST
;LCALL CAN_TEST
;ORL RST_DATA,#40H
MAIN:
JB SM_BUSY,$
;LCALL UART0_EIR
LCALL SMBUS_EIR
;LCALL STATE_EIR
SJMP MAIN
;#########################################
; SMB0/I2C 串行通讯程序段
;#########################################
I2C_RST:
MOV SMB0CN, #00H
MOV SMB0CF, #10011001B
ORL SMB0CF, #80H
MOV R1,#80
ORL EIE1, #01H
CLR SM_BUSY
MOV NUM,#1
RET
SMBus_SEND:
PUSH ACC
SMBus_SEND0:
MOV A,SMB0CF
JB ACC.5,SMBus_SEND0 ; 等待SMBus空闲
SETB STA
CLR RW
MOV EH,#00H ; RW = 0 (写)
ORL SMB0CF,#20H
setb sm_busy
MOV A,SLA_ADD ; 将SLA_ADD + WRITE保存到WRI_ADD
ORL A,#WRITE
MOV WRI_ADD,A
POP ACC
RET
SMBus_RECEIVE:
PUSH ACC
setb sm_busy
SETB RW
MOV EH,#01H ; RW = 1 (读)
MOV A, SLA_ADD
ORL A, #WRITE ; 保存SLA_ADD + WRITE到WRITE_ADD
MOV WRI_ADD, A
MOV A, #0A0H
ORL A, #READ
MOV READ_ADD, A ; 保存SLA_ADD + READ到READ_ADD
SETB STA
MOV R0,#80H
POP ACC
RET
SMBus_TEST:
;CLR STO
MOV SLA_ADD ,#0A0H
MOV TRANSMIT_BYTE,#7FH
MOV TEST_COUNT,#01H
ACALL SMBus_SEND
LCALL TDELAY1MS
LCALL TDELAY1MS
LCALL TDELAY1MS
LCALL TDELAY1MS
LCALL TDELAY1MS
SMBUS_TEST0:
MOV A,RECEIVE_BYTE
;CJNE A,#7FH,SMBUS_TEST
;sjmp $
NOP
MOV TEST_COUNT,#00H
RET
SMBus_ISR:
PUSH PSW ;
PUSH ACC ;
PUSH DPH
PUSH DPL ;
PUSH ACC
MOV A,SMB0CN
JB ACC.7,SMBUS_LOOP3
JNB ACC.6,SMBUS_LOOP2
SJMP SMBUS_STOP
SMBUS_LOOP2:
JB ACC.4,SMBUS_LOOP23 ;从接收
JNB ACC.5,SMBUS_LOOP21
JNB ACC.3,SMBUS_LOOP20
JB ACC.2,SMBUS_LOOP20
MOV A,SMB0DAT
MOV B,A
MOV TEST_COUNT,A
CJNE A,#01H,SMBUS_LOOP22
MOV A,B
CJNE A,#0B0H,SMBUS_LOOP20
SETB AA
CLR STA
SJMP SMBUS_LOOP20
SMBUS_LOOP22:
MOV A,B
CJNE A,#0A0H,SMBUS_LOOP20
SETB AA
CLR STA
SJMP SMBUS_LOOP20
SMBUS_LOOP23:
CLR STO
CLR SM_BUSY
;SETB STA
ANL SMB0CF,#11011111B
SMBUS_LOOP20:
SJMP SMBUS_STOP
SMBUS_LOOP21:
JB ACC.4,SMBUS_LOOP23
JNB ACC.3,SMBUS_LOOP20
JB ACC.2,SMBUS_LOOP20
MOV A,SMB0DAT
MOV RECEIVE_BYTE,A
SETB AA
SJMP SMBUS_STOP
SMBUS_LOOP3:
MOV A,SMB0CN
JNB ACC.6,SMBUS_STOP
JNB ACC.5,SMBUS_LOOP31
CLR STA
MOV SMB0DAT,WRI_ADD
SJMP SMBUS_STOP
SMBUS_LOOP31:
JB ACC.1,SMBUS_LOOP30
CLR STO
SETB STA
SJMP SMBUS_STOP
SMBUS_LOOP30:
MOV A,NUM
JZ SMBUS_LOOP32
DEC NUM
MOV SMB0DAT,TRANSMIT_BYTE
SJMP SMBUS_STOP
SMBUS_LOOP32:
ANL SMB0CF,#11011111B
SETB STO
SETB SM_BUSY
MOV NUM,#1
SJMP SMBUS_STOP
SMBUS_STOP:
CLR SI
POP ACC
POP DPL
POP DPH
POP ACC
POP PSW
RETI
SMBUS_STOP0:
NOP
SJMP SMBUS_STOP
T2_RST:
MOV TMR2CN,#00H
MOV TMR2RLL,#0DCH
MOV TMR2RLH,#07H
MOV TMR2L,#0DCH
MOV TMR2H,#07H
SETB ET2
SETB TR2
RET
T2OVER_ISR:
PUSH PSW
CLR STO
MOV SLA_ADD ,#0A0H
MOV TRANSMIT_BYTE,#7FH
ACALL SMBus_SEND
POP PSW
RETI
SMBUS_EIR:
MOV A,SMB0CF
JB ACC.5,SMBUS_S
CLR STO
MOV SLA_ADD,#0A0H
MOV TRANSMIT_BYTE,#7FH
ACALL SMBus_SEND
SMBUS_S:
RET
T3_RST:
MOV TMR3CN,#00H
MOV TMR3RLL,#00H
MOV TMR3RLH,#00H
MOV TMR3L,#00H
MOV TMR3H,#00H
ORL EIE1,#80H
;ORL TMR3CN,#04H
RET
;#####################################################3
; UART串行通讯程序段
;#####################################################
UART0_RST:
MOV TMOD,#00100001B
MOV SCON0,#00H
MOV CKCON,#11110000B
MOV TL1,#060H; B0H ;计数器1计数初始化;作为UART波特率时钟用
MOV TH1,#060H
SETB TR1
SETB ES0
RET
UART0_TEST:
MOV B,#0FFH
MOV SBUF0,#0FFH
CLR UART0_TR
JNB UART0_TR,$
CLR UART0_TR
JNB UART0_TR,$
CJNE A,B,UART0_TEST
RET
UART0_INT0_ISR:
PUSH PSW
JNB TI0,UART_RI
CLR TI0
SETB UART0_TR
SJMP UART0_STOP0
UART_RI:
MOV A,SBUF0
CLR RI0
SETB UART0_TR
UART0_STOP0:
POP PSW
RETI
UART0_EIR:
CLR P1.6
MOV A,RST_DATA
JNB ACC.7,UART0_STOP1
MOV SBUF0,GDI
CLR UART0_TR
JNB UART0_TR,$
MOV A,GDV
MOV SBUF0,A
CLR UART0_TR
JNB UART0_TR,$
ANL RST_DATA,#7FH
SETB P1.6
UART0_STOP1:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -