📄 zhujiasm.asm
字号:
T_RSTATE EQU P1.7
ORG 0000H
LJMP START
ORG 0100H
;**********************************************************
;
;系统初始化
;
;**********************************************************
START:MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
MOV SCON,#0D0H
MOV PCON,#80H
ACALL INIT_LCD
ACALL SCAN_SENSOR
ACALL STRING_DISPLAY
;**********************************************************
;
;发送请求信号
;
;**********************************************************
MAIN_LOOP:
STEP1:SETB T_RSTATE
CJNE R0,#00H,MODE_1;是否选择模式0(循环显示模式)
INC R1;循环模式的从机号
MOV A,R1
CJNE A,38H,MODE_0
MOV R1,#00H
MODE_0:
; MOV A,R1;从机号加一
; ANL A,#03H;预设有4个从机
; MOV R1,A
SETB TB8;表明传送的是地址数据
MOV SBUF,R1
JNB TI,$;等待发送完成
CLR TI
CLR T_RSTATE
JNB RI,$;等待从机应答
CLR RI
SETB T_RSTATE
MOV A,SBUF
MOV 39H,R1
CJNE A,39H,RESET1
CLR TB8
MOV SBUF,#00H
JNB TI,$
CLR TI
CLR T_RSTATE
JNB RI,$
CLR RI
MOV R3,SBUF
AJMP STEP2
RESET1:
MOV SBUF,#0FFH
JNB TI,$
CLR TI
MOV 3AH,#01H;40H为显示错误状态的标志
AJMP STEP2
MODE_1:
CLR C;清借位
MOV A,38H
DEC A
SUBB A,R2;比较从机数和选择的机号的大小
JC INPUT_ERROR;若从机数小于选择的机号,就跳转
SETB TB8;表明传送的是地址数据
MOV SBUF,R2;将自选模式的从机号发出
JNB TI,$;等待发送完成
CLR TI
CLR T_RSTATE
JNB RI,$
CLR RI
SETB T_RSTATE
MOV A,R2
CJNE A,SBUF,RESET2;若接收到的地址不符合发送地址,则发送复位
CLR TB8
MOV SBUF,#00H
JNB TI,$
CLR TI
CLR T_RSTATE
JNB RI,$
CLR RI
MOV R3,SBUF
AJMP STEP2
RESET2:
MOV SBUF,#0FFH
JNB TI,$
CLR TI
MOV 3AH,#01H
AJMP STEP2
INPUT_ERROR:
MOV 3AH,#01H
;**********************************************************
;
;接收数据并显示
;
;**********************************************************
STEP2:
ACALL DISPLAY_NO;显示接收的数据
MOV R7,#02H
ACALL DELAY_S;延迟2秒
AJMP MAIN_LOOP
;**********************************************************
;
;延时子程序
;
;**********************************************************
DELAY_MS:
DEL_MS2:
MOV 37H,#0F9H
DEL_MS1:
NOP
NOP
DJNZ 37H,DEL_MS1
DJNZ R5,DEL_MS2
RET
DELAY_S:
DEL_S2:
MOV 36H,#0AH
DEL_S1:
MOV R5,#64H
ACALL DELAY_MS
ACALL SCAN_KEYBOARD
DJNZ 36H,DEL_S1
DJNZ R7,DEL_S2
RET
;**********************************************************
;
;液晶初始化子程序
;
;**********************************************************
INIT_LCD:
MOV R5,#0FAH
ACALL DELAY_MS;延时,等待液晶进入工作状态
MOV 31H,#01H
ACALL WRITE_COMM;显示清零
MOV 31H,#02H
ACALL WRITE_COMM;光标复位
MOV 31H,#38H
ACALL WRITE_COMM;设置显示状态
MOV 31H,#0CH
ACALL WRITE_COMM;开显示,无光标
MOV 31H,#18H
ACALL WRITE_COMM;移动显示的文字
MOV 31H,#01H
ACALL WRITE_COMM;显示清零
RET
;**********************************************************
;
;从机存在扫描子程序
;
;**********************************************************
SCAN_SENSOR:
MOV 31H,#86H
ACALL WRITE_COMM
MOV 32H,#06H;字符串长度为6个字节
MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP1:
MOV A,33H
MOV DPTR,#STRING_SYSTEM
MOVC A,@A+DPTR
MOV 31H,A
ACALL WRITE_DATA
INC 33H
DJNZ 32H,DISPLAY_LOOP1
MOV 31H,#0C2H
ACALL WRITE_COMM
MOV 32H,#0CH;字符串长度为12个字节
MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP2:
MOV A,33H
MOV DPTR,#STRING_INITIALIZE
MOVC A,@A+DPTR
MOV 31H,A
ACALL WRITE_DATA
INC 33H
DJNZ 32H,DISPLAY_LOOP2
SETB TB8
MOV 33H,#01H
SCAN:
MOV SBUF,32H;32H作为扫描发出的从机号
JNB TI,$
CLR TI
MOV R5,#01H
ACALL DELAY_MS
JNB RI,OUT_SCAN
INC 32H
CLR RI
MOV A,33H
SJMP JUDGE_SCAN
OUT_SCAN:
MOV 38H,32H;将从机数保存在38H中
MOV 33H,#00H;33H作为结束扫描的标志
MOV A,33H
JUDGE_SCAN:
CJNE A,#00H,SCAN
MOV R7,#02H
ACALL DELAY_S
RET
STRING_SYSTEM:DB 'S','Y','S','T','E','M'
STRING_INITIALIZE:DB 'I','N','I','T','I','A','L','I','Z','I','N','G'
;**********************************************************
;
;显示字符串子程序
;
;**********************************************************
STRING_DISPLAY:
MOV 31H,#01H
ACALL WRITE_COMM;显示清零
MOV 31H,#80H
ACALL WRITE_COMM;设置输入字符串的首地址
MOV 32H,#10H;字符串长度为16个字节
MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP3:
MOV A,33H
MOV DPTR,#STRING
MOVC A,@A+DPTR
MOV 31H,A
ACALL WRITE_DATA
INC 33H
DJNZ 32H,DISPLAY_LOOP3
MOV 31H,#87H
ACALL WRITE_COMM
MOV A,38H
ADD A,#30H;将从机数转化为相应的ASCII码
MOV 31H,A
ACALL WRITE_DATA
RET
STRING:DB 'N','O',' ',' ','o','f',' ',' ',' ','s','e','n','s','o','r','s'
;**********************************************************
;
;液晶显示调用子程序库
;
;**********************************************************
WRITE_COMM:
MOV P0,31H
CLR P1.4
CLR P1.3
CLR P1.2
ACALL READ_BUSY
SETB P1.2
RET
WRITE_DATA:
MOV P0,31H
SETB P1.4
CLR P1.3
CLR P1.2
ACALL READ_BUSY
SETB P1.2
RET
READ_BUSY:
PUSH DPH
PUSH DPL
WAIT:MOV P0,#0FFH
CLR P1.4
SETB P1.3
CLR P1.2
MOV R5,#02H
ACALL DELAY_MS
SETB P1.2
MOV DPTR,#0FFFFH
MOVX A,@DPTR
JB ACC.7,WAIT
POP DPL
POP DPH
RET
;**********************************************************
;
;接收的数据显示程序
;
;**********************************************************
DISPLAY_NO:
MOV A,3AH
CJNE A,#01H,DISPLAY_CORRECT
MOV 31H,#82H
ACALL WRITE_COMM
MOV 31H,' '
ACALL WRITE_DATA
MOV 31H,#0C4H
ACALL WRITE_COMM
MOV 32H,#08H;字符串长度为8个字节
MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP4:
MOV A,33H
MOV DPTR,#STRING_ERROR
MOVC A,@A+DPTR
MOV 31H,A
ACALL WRITE_DATA
INC 33H
DJNZ 32H,DISPLAY_LOOP4
MOV 3AH,#00H
AJMP DISPLAY_END
DISPLAY_CORRECT:
MOV 31H,#82H
ACALL WRITE_COMM;设置液晶写入的地址
CJNE R0,#00H,DISPLAY_MODE1;判断是否为循环显示模式
MOV A,R1
ADD A,#30H
MOV 31H,A
ACALL WRITE_DATA;将从机号显示出来
AJMP DISPLAY_DATA;跳转到采集的数据显示
DISPLAY_MODE1:
MOV A,R2
ADD A,#30H
MOV 31H,A
ACALL WRITE_DATA
DISPLAY_DATA:
MOV 31H,#0C4H
ACALL WRITE_COMM;第二行显示数据时的地址
MOV 34H,#08H;数据向左循环的次数
MOV 35H,R3;接收到的数据给35H
DISPLAY_LOOP5:
MOV A,35H
RL A
MOV 35H,A
ANL A,#01H
ADD A,#30H
MOV 31H,A
ACALL WRITE_DATA
DJNZ 34H,DISPLAY_LOOP5
DISPLAY_END:
RET
STRING_ERROR:DB ' ','E','R','R','O','R','!',' '
;**********************************************************
;
;键盘扫描子程序
;返回值R2(按键编号)或R0(显示模式)
;
;**********************************************************
SCAN_KEYBOARD:
MOV R6,#0EFH
MOV P2,#0FH
MOV A,P2
ANL A,#0FH
CPL A
ANL A,#0FH
JZ EXIT_SCAN
MOV R5,#05H
ACALL DELAY_MS
MOV A,P2
ANL A,#0FH
CPL A
ANL A,#0FH
JZ EXIT_SCAN
SCAN_LOOP:
MOV A,R6;行扫描输出
CPL A
ANL A,#0FEH
JZ EXIT_LOOP
MOV P2,R6
MOV A,P2
ANL A,#0FH
CPL A
ANL A,#0FH;查看是否是这一行有键按下
JZ NEXT
MOV A,P2
MOV R4,A;将键盘码缓存在R4中
AJMP EXIT_LOOP
NEXT:MOV A,R6
RL A
MOV R6,A;扫描输出值变换
AJMP SCAN_LOOP
EXIT_LOOP:
ACALL COMMAND_TRANSLATION
EXIT_SCAN:
RET
COMMAND_TRANSLATION:
KEY1:CJNE R4,#0E7H,KEY2
MOV R2,#01H
AJMP EXIT_TRANSLATION
KEY2:CJNE R4,#0EBH,KEY3
MOV R2,#02H
AJMP EXIT_TRANSLATION
KEY3:CJNE R4,#0EDH,KEY4
MOV R2,#03H
AJMP EXIT_TRANSLATION
KEY4:CJNE R4,#0D7H,KEY5
MOV R2,#04H
AJMP EXIT_TRANSLATION
KEY5:CJNE R4,#0DBH,KEY6
MOV R2,#05H
AJMP EXIT_TRANSLATION
KEY6:CJNE R4,#0DDH,KEY7
MOV R2,#06H
AJMP EXIT_TRANSLATION
KEY7:CJNE R4,#0B7H,KEY8
MOV R2,#07H
AJMP EXIT_TRANSLATION
KEY8:CJNE R4,#0BBH,KEY9
MOV R2,#08H
AJMP EXIT_TRANSLATION
KEY9:CJNE R4,#0BDH,KEY0
MOV R2,#09H
AJMP EXIT_TRANSLATION
KEY0:CJNE R4,#7BH,KEY_MODE_0
MOV R2,#00H
AJMP EXIT_TRANSLATION
KEY_MODE_0:
CJNE R4,#77H,KEY_MODE_1
MOV R0,#00H
AJMP EXIT_TRANSLATION
KEY_MODE_1:
CJNE R4,#7DH,EXIT_TRANSLATION
MOV R0,#01H
EXIT_TRANSLATION:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -