📄 28sf040a.asm
字号:
;------------------------------
;通过串口发送一个存储在外部RAM的定长字符串
;入口: [DPTR,R7,XRAM_BLOCK_BIT]
;出口: [C=1 500ms发送超时,C=0 正确]
;使用: [ACC,DPTR,C]
;------------------------------
COM_SEND_STRING:
LCALL HD_SELECT_XRAM
LCALL HD_XRAM_PAGE_SEL
CSS_1:
MOVX A,@DPTR
LCALL COM_SEND_BYTE
JNC CSS_3
RET
CSS_3:
INC DPTR
DJNZ R7,CSS_1
CLR C
RET
;------------------------------
;通过串口限时接收一个字节
;入口: [无]
;出口: [Acc, C=1 500ms接收超时,C=0 正确]
;使用: [ACC,DPH,DPL,SBUF,C,RI]
;------------------------------
COM_RECV_BYTE:
PUSH DPH
PUSH DPL
CRB_03:
MOV DPH,#250
CRB_06:
MOV DPL,#250 ;2US
CRB_09:
NOP ;1
NOP ;1
NOP ;1
NOP ;1
JBC RI,CRB_15 ;2US
DJNZ DPL,CRB_09 ;2US
DJNZ DPH,CRB_06 ;2US
CRB_12:
SETB C ;TIMEOUT=(8*250+4)*250 us=500ms
LJMP CRB_18
CRB_15:
MOV A,SBUF
PUSH ACC
MOV A,#4
LCALL HD_FLUSH_A_LED
POP ACC
CLR C
CRB_18:
POP DPL
POP DPH
RET
;------------------------------
;通过串口限时发送一个字节
;入口: [Acc]
;出口: [C=1 500ms发送超时,C=0 正确]
;使用: [ACC,DPH,DPL,SBUF,C,TI]
;------------------------------
COM_SEND_BYTE:
PUSH DPH
PUSH DPL
CLR TI
MOV SBUF,A
PUSH ACC
MOV A,#5
LCALL HD_FLUSH_A_LED
POP ACC
CSB_03:
MOV DPH,#250
CSB_06:
MOV DPL,#250 ;2US
CSB_09:
NOP ;1
NOP ;1
NOP ;1
NOP ;1
JBC TI,CSB_15 ;2US
DJNZ DPL,CSB_09 ;2US
DJNZ DPH,CSB_06 ;2US
CSB_12:
SETB C ;TIMEOUT=(8*250+4)*250 us=500ms
LJMP CSB_18
CSB_15:
CLR C
CSB_18:
POP DPL
POP DPH
RET
;--------------------------------------------
;入口:[无]
;出口:[无]
;使用:[Acc,TR1,TH1,TL1,TMOD,PCON,SCON]
;串口初始化程序: 9600,8,1,n(f=11.0592MHz)
;--------------------------------------------
COM_INIT_SET:
PUSH ACC
CLR TR1
MOV A,TMOD
ANL A,#0FH
ORL A,#20H
MOV TMOD,A
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV PCON,#00H
MOV SCON,#50H
CLR RI
CLR TI
SETB TR1
POP ACC
RET
;==========================================================
;硬件操作模块
;--------------------------------
;延时100us
;--------------------------------
PUB_DELAY_100us:
PUSH ACC
CLR A
PD100_0:
INC A
CJNE A,#27,PD100_0
POP ACC
NOP
NOP
RET
;------------------------------------------------------------------------------
;入口 [无]
;出口 [无]
;使用 [A]
;------------------------------------------------------------------------------
PUB_DELAY_1ms:
PUSH ACC
CLR A
PD1_0:
INC A
NOP
CJNE A,#228,PD1_0
POP ACC
RET
;------------------------------------------------------------------------------
;入口 [A]
;出口 [无]
;使用 [A]
;------------------------------------------------------------------------------
PUB_DELAY_100ms:
PUSH ACC
MOV A,#100
PD250:
LCALL PUB_DELAY_1ms
DEC A
JNZ PD250
POP ACC
RET
;-------------------------------
;测试如果是出错应答则红灯闪烁三次
;-------------------------------
PUB_JUDGE_GIVE_RED:
CJNE A,#OPERATE_SUCCESS,JGR_0
RET
JGR_0:
LCALL PUB_FLUSH_RED_TRHEE
RET
;-------------------------------
;开机时灯的测试
;灯全部关闭,依次点亮,依次关闭
;-------------------------------
HD_LED_TEST_START:
LCALL HD_LED_ALL_OFF
LCALL PUB_DELAY_100ms
SETB LED_GRE_PIN
LCALL PUB_DELAY_100ms
SETB LED_YEL_PIN
LCALL PUB_DELAY_100ms
SETB LED_RED_PIN
LCALL PUB_DELAY_100ms
SETB LED_IC1_PIN
LCALL PUB_DELAY_100ms
SETB LED_IC2_PIN
LCALL PUB_DELAY_100ms
CLR LED_GRE_PIN
LCALL PUB_DELAY_100ms
CLR LED_YEL_PIN
LCALL PUB_DELAY_100ms
CLR LED_RED_PIN
LCALL PUB_DELAY_100ms
CLR LED_IC1_PIN
LCALL PUB_DELAY_100ms
CLR LED_IC2_PIN
RET
;-------------------------------
;红灯闪烁三次
;入口:[无]
;出口:[无]
;使用:[Acc,PUB_DELAY_100ms]
;-------------------------------
PUB_FLUSH_RED_TRHEE:
SETB LED_RED_PIN
LCALL PUB_DELAY_100ms
CLR LED_RED_PIN
LCALL PUB_DELAY_100ms
SETB LED_RED_PIN
LCALL PUB_DELAY_100ms
CLR LED_RED_PIN
LCALL PUB_DELAY_100ms
SETB LED_RED_PIN
LCALL PUB_DELAY_100ms
CLR LED_RED_PIN
RET
;-------------------------------
;闪烁一个指定的灯
;入口:[Acc=1,2,3,4,5表示绿/黄/红/IC1/IC2灯]
;出口:[无]
;使用:[Acc,PUB_DELAY_100us]
;-------------------------------
HD_FLUSH_A_LED:
CJNE A,#1,HFAL_2
SETB LED_GRE_PIN
LCALL PUB_DELAY_100us
LCALL PUB_DELAY_100us
CLR LED_GRE_PIN
RET
HFAL_2:
CJNE A,#2,HFAL_3
SETB LED_YEL_PIN
LCALL PUB_DELAY_100us
LCALL PUB_DELAY_100us
CLR LED_YEL_PIN
RET
HFAL_3:
CJNE A,#3,HFAL_4
SETB LED_RED_PIN
LCALL PUB_DELAY_100us
LCALL PUB_DELAY_100us
CLR LED_RED_PIN
RET
HFAL_4:
CJNE A,#4,HFAL_5
SETB LED_IC1_PIN
LCALL PUB_DELAY_100us
LCALL PUB_DELAY_100us
CLR LED_IC1_PIN
RET
HFAL_5:
CJNE A,#5,HFAL_6
SETB LED_IC2_PIN
LCALL PUB_DELAY_100us
LCALL PUB_DELAY_100us
CLR LED_IC2_PIN
HFAL_6:
RET
;-------------------------------
;点亮一个指定的灯
;入口:[Acc=1,2,3,4,5表示绿/黄/红/IC1/IC2灯]
;出口:[无]
;-------------------------------
HD_LIGHT_A_LED:
CJNE A,#1,HLAL_2
SETB LED_GRE_PIN
MOV A,P1_HIGH_3BIT
SETB ACC.6
MOV P1_HIGH_3BIT,A
RET
HLAL_2:
CJNE A,#2,HLAL_3
SETB LED_YEL_PIN
MOV A,P1_HIGH_3BIT
SETB ACC.5
MOV P1_HIGH_3BIT,A
RET
HLAL_3:
CJNE A,#3,HLAL_4
SETB LED_RED_PIN
RET
HLAL_4:
CJNE A,#4,HLAL_5
SETB LED_IC1_PIN
RET
HLAL_5:
CJNE A,#5,HLAL_6
SETB LED_IC2_PIN
HLAL_6:
RET
;-------------------------------
;熄灭一个指定的灯
;入口:[Acc=1,2,3,4,5表示绿/黄/红/IC1/IC2灯]
;出口:[无]
;-------------------------------
HD_SHUT_A_LED:
CJNE A,#1,HSAL_2
CLR LED_GRE_PIN
MOV A,P1_HIGH_3BIT
CLR ACC.6
MOV P1_HIGH_3BIT,A
RET
HSAL_2:
CJNE A,#2,HSAL_3
CLR LED_YEL_PIN
MOV A,P1_HIGH_3BIT
CLR ACC.5
MOV P1_HIGH_3BIT,A
RET
HSAL_3:
CJNE A,#3,HSAL_4
CLR LED_RED_PIN
RET
HSAL_4:
CJNE A,#4,HSAL_5
CLR LED_IC1_PIN
RET
HSAL_5:
CJNE A,#5,HSAL_6
CLR LED_IC2_PIN
HSAL_6:
RET
;-------------------------------
;所有灯都关闭
;入口:[无]
;出口:[无]
;-------------------------------
HD_LED_ALL_OFF:
CLR LED_GRE_PIN
CLR LED_YEL_PIN
CLR LED_RED_PIN
CLR LED_IC1_PIN
CLR LED_IC2_PIN
RET
;-------------------------------
;所有灯都打开
;入口:[无]
;出口:[无]
;-------------------------------
HD_LED_ALL_ON:
SETB LED_GRE_PIN
SETB LED_YEL_PIN
SETB LED_RED_PIN
SETB LED_IC1_PIN
SETB LED_IC2_PIN
RET
;-------------------------------------
;对FLASH操作的逻辑地址加1
;输入:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;输出:[LADD_H3BIT,LADD_8TF,LADD_0T7,LADD_OVERFLOW_BIT=1 OVERFLOW]
;使用:[ACC,C]
;-------------------------------------
F_INC_LADD:
CLR C
MOV A,#1
ADDC A,LADD_0T7
MOV LADD_0T7,A
MOV A,LADD_8TF
ADDC A,#0
MOV LADD_8TF,A
MOV A,LADD_H3BIT
ADDC A,#0
SETB LADD_OVERFLOW_BIT
JBC ACC.3,FIL_RESET_ADD
CLR LADD_OVERFLOW_BIT
FIL_RESET_ADD:
MOV LADD_H3BIT,A
RET
;-------------------------------
;设置P1端口和DPTR的值
;输入:[FADD_PAGE,FADD_HIGH,FADD_LOW]
;输出:[P1_DATA,DPTR]
;使用:[ACC,B,P1_HIGH_3BIT]
;-------------------------------
F_GET_P1_DATA_AND_DPTR:
MOV A,FADD_PAGE
ANL A,#1FH
MOV FADD_PAGE,A
MOV A,P1_HIGH_3BIT
ANL A,#0E0H
ORL A,FADD_PAGE
MOV P1_DATA,A
MOV DPH,FADD_HIGH
MOV DPL,FADD_LOW
RET
;-----------------------------------
;将FLASH的逻辑操作地址转换为芯片工作地址
;入口:[LADD_H3BIT,LADD_8TF,LADD_0T7]
;出口:[FADD_PAGE,FADD_HIGH,FADD_LOW]
;使用:[ACC,B]
;-----------------------------------
F_LADD_TO_FADD:
MOV FADD_LOW,LADD_0T7
MOV B,LADD_8TF
MOV A,LADD_H3BIT
JBC B.7,FLTF_2
CLR ACC.7
LJMP FLTF_3
FLTF_2:
SETB ACC.7
FLTF_3:
JBC B.6,FLTF_5
CLR ACC.6
LJMP FLTF_6
FLTF_5:
SETB ACC.6
FLTF_6:
SETB B.6
MOV FADD_HIGH,B
RL A
RL A
MOV FADD_PAGE,A
RET
;-------------------------------
;操作P1口,进行外部RAM的块的选择
;入口:[XRAM_BLOCK_BIT=0/1(2块)]
;出口:[无]
;-------------------------------
HD_XRAM_PAGE_SEL:
JB XRAM_BLOCK_BIT,SEL_PAGE1
SEL_PAGE0:
CLR P1.4
RET
SEL_PAGE1:
SETB P1.4
RET
;-------------------------------
;使外部RAM的使能有效
;入口:[无]
;出口:[无]
;-------------------------------
HD_SELECT_XRAM:
CLR P2.6
CLR P2.7
RET
;-------------------------------
;使外部ROM(flash)的使能有效
;入口:[无]
;出口:[无]
;-------------------------------
HD_SELECT_FLASH:
HD_SELECT_XROM:
SETB P2.6
CLR P2.7
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -