📄 第8次小车寻迹.asm
字号:
ORL A,#30H
MOV COM,A
LCALL LCDWRITE
MOV COM,#0B7H
LCALL LCDWRITE
MOV COM,#0D6H
LCALL LCDWRITE
RET
ZZ50M:
SETB P1.0
CLR P1.1
MOV R3,#198
MOV R4,#5
LCALL WRITE_TIME
AAA2: LCALL READ_TIME
LCALL SJ
LCALL FENDIS
LCALL MIAODIS
SETB P0.0
SETB P0.1
LCALL DELAY1
CLR P0.0
CLR P0.1
LCALL DELAY1
DJNZ R3,AAA2
DJNZ R4,AAA2
RET
FZ_160M:
CLR P1.0
SETB P1.1
MOV R3,#0
MOV R4,#8
LCALL WRITE_TIME
AAAD2:LCALL READ_TIME
LCALL SJ
LCALL FENDIS
LCALL MIAODIS
SETB P0.0
SETB P0.1
LCALL DELAY1
CLR P0.0
CLR P0.1
LCALL DELAY1
DJNZ R3,AAAD2
DJNZ R4,AAAD2
RET
DELAY3:MOV R5,#200
DD1: MOV R6,#100
DD2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DD2
DJNZ R5,DD1
RET
DELAY1S:MOV R5,#20
DDC1: MOV R6,#100
DDC2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DDC2
DJNZ R5,DDC1
RET
DELAY05S:MOV R5,#130
DDA1: MOV R6,#200
DDA2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DDA2
DJNZ R5,DDA1
RET
PING: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB1
MOV R3,#2
PING1: LCALL DIS8
DJNZ R3,JS1
POP 03H
RET
JS: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB2
MOV R3,#2
JS1: LCALL DIS8
DJNZ R3,JS1
POP 03H
RET
QJ: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB3
MOV R3,#2
QJ1: LCALL DIS8
DJNZ R3,QJ1
POP 03H
RET
FH: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB3
MOV R3,#2
FH1: LCALL DIS8
DJNZ R3,FH1
POP 03H
RET
CHUXIAN:PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB5
MOV R3,#5
CHUXIAN1:
LCALL DIS8
DJNZ R3,CHUXIAN1
CHUXIAN2:MOV START,#0F8H ;写入命令(11111000)
MOV COM,#88H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB6
MOV R3,#5
CHUXIAN3:
LCALL DIS8
DJNZ R3,CHUXIAN3
CHUXIAN4:
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#90H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB11
MOV R3,#5
CHUXIAN5:
LCALL DIS8
DJNZ R3,CHUXIAN5
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#98H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB12
MOV R3,#5
CHUXIAN6:
LCALL DIS8
DJNZ R3,CHUXIAN6
POP 03H
RET
HT: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB4
MOV R3,#2
HT1: LCALL DIS8
DJNZ R3,HT1
POP 03H
RET
SJ: PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#90H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV DPTR,#TAB8
MOV R3,#3
SJ1: LCALL DIS8
DJNZ R3,SJ1
POP 03H
RET
DIS8: CLR A
MOVC A,@A+DPTR
INC DPTR
MOV COM,A
LCALL LCDWRITE
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV COM,A
LCALL LCDWRITE
RET
TING5S:CLR P0.0
CLR P0.1
MOV R5,#8
DDD1: MOV R6,#00H
DDD2: MOV R7,#00H
DJNZ R7,$
DJNZ R6,DDD2
DJNZ R5,DDD1
RET
TAB1: DB "平衡 "
TAB2: DB "结束 "
TAB3: DB "前进 "
TAB4: DB "后退 "
TAB5: DB "1.静态平衡"
TAB6: DB "3.动寻平衡"
TAB7: DB "返回"
TAB8: DB "时间:"
TAB9: DB "请放重物到AC之间"
TAB10: DB "按任意键继续 "
TAB11: DB "2.小车寻迹"
TAB12: DB "4.动态平衡"
YIMA: PUSH B
MOV R7,A
MOV B,#10
SUBB A,B
JNC YIMA1
MOV A,R7
ORL A,#30H
JMP YIMA2
YIMA1: MOV A,R7
ADD A,#37H
YIMA2: POP B
RET
DL40MS: ;延时子程序
PUSH 00H ;40MS
PUSH 01H
PUSH 02H
MOV R2,#01H
DL_PA: MOV R0,#0FFH
DL_PB: MOV R1,#0FFH
DJNZ R1,$
DJNZ R0,DL_PB
DJNZ R2,DL_PA
POP 02H
POP 01H
POP 00H
RET
NOP
NOP
NOP
RET
DELAY10US:NOP
NOP
NOP
NOP
NOP
RET
AD_DATA:
MOV R0,#ADDR
MOV R1,#1
ACALL RD_AD
MOV R0, #ADDR
MOV R1,#1;有效转换开始
ACALL RD_AD
RET
RD_AD:
CLR CLK2543; 置CLK为低
SETB CS2543;置CS为高
NOP
NOP
CLR CS2543;置CS为低,转换开始
MOV R4,#08; 8位控制字移入TLC2543,高8位;结果移出TLC2543
MOV A,R1; 控制字装入A中
ADLOP1:
MOV C,DOUT;?移出一位结果进入C
RLC A; C中结果从A的最低位进入,控制字最;高位移入C
MOV DIN, C; 1位控制字移入TLC2543
SETB CLK2543
NOP
NOP
NOP
NOP
CLR CLK2543
DJNZ R4,ADLOP1;?是否移完?
MOV R2, A; 结果的高8位装入R2
MOV A, #0
MOV R4, #04;读取低4位转换结果
ADLOP2:
MOV C, DOUT
RLC A
SETB CLK2543
NOP
NOP
NOP
NOP
CLR CLK2543
DJNZ R4, ADLOP2
MOV R3, A; 低4位转换结果装入R3
SETB CS2543
RET
DISK1: PUSH 02H
PUSH 03H
MOV START,#0F8H ;写入命令(11111000)
MOV COM,#80H ;设定显示位置
LCALL LCDWRITE
MOV START,#0FAH
MOV A,R2
SWAP A
ANL A,#0FH
LCALL YIMA
MOV COM,A
LCALL LCDWRITE
MOV A,R2
ANL A,#0FH
LCALL YIMA
MOV COM,A
LCALL LCDWRITE
MOV A,R3
SWAP A
ANL A,#0FH
LCALL YIMA
MOV COM,A
LCALL LCDWRITE
MOV A,R3
ANL A,#0FH
LCALL YIMA
MOV COM,A
LCALL LCDWRITE
POP 03H
POP 02H
RET
LCDRESET:
LCALL DL1MS ;延时等待内部复位
MOV START,#0F8H ; 写入命令(11111000)
MOV COM,#30H ;使用基本指令集
LCALL LCDWRITE
MOV COM,#0CH
LCALL LCDWRITE ;整体显示ON
MOV COM,#01H ;清屏
LCALL LCDWRITE
MOV COM,#06H
LCALL LCDWRITE
LCALL DL1MS
RET
LCDWRITE: ;模块写入子程序
MOV A,COM ;送待发数据命令A
ANL A,#0F0H ;屏蔽低4位
MOV HDATA,A ;将高4位送HDATA单元
MOV A,COM ;取低4位
SWAP A ;高低4位互换
ANL A,#0F0H
MOV LDATA,A ;将低4位送LDATA单元
MOV A,START ;取起始字节
LCALL SENDBIT ;发送
LCALL DL1MS ;延时1ms
MOV A,HDATA
LCALL SENDBIT
LCALL DL1MS
MOV A,LDATA
LCALL SENDBIT
LCALL DL1MS
RET
SENDBIT: ;串行字节数据发送子程序
MOV R7,#08H ;发送8位
SEND_1: RLC A
MOV STD,C ;数据送数据线
CLR SCLK ;产生同步时钟
SETB SCLK
DJNZ R7,SEND_1 ;未发送完8位继续
RET
DL1MS: ;延时子程序
PUSH 00H ;0.1MS
PUSH 01H
PUSH 02H
MOV R2,#01H
WA_PA: MOV R0,#01H
WA_PB: MOV R1,#0fH
DJNZ R1,$
DJNZ R0,WA_PB
DJNZ R2,WA_PA
POP 02H
POP 01H
POP 00H
RET
NOP
RET
WRITE_TIME:
MOV DS_ADDR,#0AH
MOV A,#20H
LCALL WRITE_DS
MOV DS_ADDR,#0BH
MOV A,#22H
LCALL WRITE_DS
MOV DS_ADDR,#0
MOV A,#0
LCALL WRITE_DS
MOV DS_ADDR,#2
MOV A,#0
LCALL WRITE_DS
RET
READ_TIME:
MOV DS_ADDR,#0AH
LCALL READ_DS
JBC ACC.7,READ_TIME ;更新标志
MOV DPTR,#0
MOVX A,@DPTR
MOV MIAO,A
MOV DPTR,#2
MOVX A,@DPTR
MOV FEN,A
RET
READ_DS:
MOV DPH,#0H
MOV DPL,DS_ADDR
MOVX A,@DPTR
RET
WRITE_DS:
MOV DPH,#0H
MOV DPL,DS_ADDR
MOVX @DPTR,A
RET
SEND_DATE: LCALL SEND ;发送DATA_OUT中命令
LCALL MIDDLE_DELAY ;两字节间要有25us延时
MOV DATA_OUT,DATA_OUT1 ;将DATA_IN中数据发送给DATA_OUT
LCALL SEND
SETB CS
RET
;发送一个字节到HD7279 ,高位再前
SEND: PUSH 07H
MOV R7,#8 ;设定位计数器
CLR CS ;设CS为低电平
LCALL LONG_DELAY ;长延时
SEND_LOOP: MOV C,DATA_OUT.7
MOV DAT,C
SETB CLK ;设CLK为高电平
MOV A,DATA_OUT ;待发数据左移
RL A
MOV DATA_OUT,A
LCALL SHORT_DELAY ;短延时
CLR CLK ;设CLK为低电平
LCALL SHORT_DELAY ;短延时
DJNZ R7,SEND_LOOP ;检查是否8位均发送完毕
CLR DAT ;发送完毕返回
POP 07H
RET
;从HD7279接收一个字节,高位在前
RECEIVE: PUSH 07H
MOV R7,#8 ;设定位计数器
SETB DAT ;置DATA口为高电平
LCALL LONG_DELAY ;长延时
RECEIVE_LOOP:SETB CLK ;置CLK为高电平
LCALL SHORT_DELAY ;短延时
MOV A,DATA_IN ;数据左移
RL A
MOV DATA_IN,A
MOV C,DAT ;读取一位数据
MOV DATA_IN.0,C
CLR CLK
LCALL SHORT_DELAY
DJNZ R7,RECEIVE_LOOP ;检查是否8位均发送完毕
CLR DAT ;重设DAT为低电平
POP 07H
RET
WAIT: JB KEY,WAIT
MOV DATA_OUT,#00010101B ;读键值命令
CALL SEND
CALL RECEIVE
SETB CS
WAIT1: JNB KEY,WAIT1
RET
LONG_DELAY:PUSH 06H
MOV R6,#12 ;延时50US
DELAY_LOOP:DJNZ R6,DELAY_LOOP
POP 06H
RET
MIDDLE_DELAY:PUSH 06H ;延时25US
MOV R6,#4
DELAY_LOOP1:DJNZ R6,DELAY_LOOP
POP 06H
NOP
RET
SHORT_DELAY: NOP
NOP ;延时8US
NOP
NOP
RET
DELAY25MS: PUSH 06H ;延时25MS
PUSH 07H
MOV R6,#31
DE25MS1:MOV R7,#0F5H
DE25MS2:DJNZ R7,DE25MS2
DJNZ R6,DE25MS1
POP 07H
POP 06H
RET
DELAY: PUSH 02H
PUSH 03H
PUSH 04H
LOOP3: MOV R4,#8
LOOP2: MOV R3,#0C8H
LOOP1: MOV R2,#0E6H
LOOP4: DJNZ R2,LOOP4
DJNZ R3,LOOP1
DJNZ R4,LOOP2
POP 04H
POP 03H
POP 02H
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -