📄 89c51communication.txt
字号:
DJNZ R6, C1
NOP
NOP
DJNZ R5, C0
RET
;------------------
DELAY02: MOV R6, #6
D52: MOV R7, #18h
D62: DJNZ R7, D62
DJNZ R6, D52
RET
clear_screen:setb RESET
setb PSB
CLR RW
LCALL INITIL ;调用系统初始化程序
MOV A, #0CH ;开显示,关游标
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
LCALL INPUT
LCALL DELAY01
ret
DEADD: PUSH DPH ;地址转换子程序
PUSH DPL
PUSH A
MOV DPTR,#LINE_ADD ;LINE-ADD为地址表指针
MOV A,FIRST_LIN
MOVC A,@A+DPTR
ADD A,FIRST_ADD
MOV START_ADD,A
POP A
POP DPL
POP DPH
RET
LINE_ADD:
DB 00H,80H,90H,88H,98H,00H
INITIL: LCALL DELAY ;延时
;首先选择基本指令集
MOV A, #30H ;30---基本指令操作
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;指令#01H为:清除屏幕文字,把地址指针指向00H单元
LCALL INPUT ;
LCALL DELAY01
MOV A, #06H ;指定在资料写入或读取时,设定游标的移动方向及指定显示的移位
LCALL INPUT
LCALL DELAY01
RET
RDY_NUM_DISP:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV word_WID,#01H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
NUM_DISP:
setb RESET
setb PSB
CLR RW
NQIU1: LCALL INITIL ;调用系统初始化程序
MOV A, #0CH ;开显示,关游标
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
LCALL INPUT
LCALL DELAY01
;-------------------------
NNUM_DISP:LCALL RDY_NUM_DISP
MOV R1,WORD_WID
NWORD10: LCALL DEADD ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
LCALL INPUT
NWORD11: ;因为要连续输入机内码高位(区码)、低位(位码)
MOV A,NUM_SBUF ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL DISPL ;DATA INPUT
LCALL DELAY01
mov a,#0h
lcall displ
DJNZ R1,NWORD11
MOV R1,WORD_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ WORD_LIN,NWORD10
ret
;******************************
;**********发送************
;*******************************
;************************
send:acall send_success
acall fasongqiandao
acall send1
acall jieshouqiandao
clr tr0
MOV TL0,#0H
MOV TH0,#0H;定时为0.6s
jb f0,lll
acall rom_disp
acall long
acall chongxinglink_disp
clr f1
acall rom_disp
ajmp send_ret
lll: acall rom_disp
acall long
acall quweishuru
acall long
clr f0
ajmp send_ret
;***********************
send1:acall long
acall d20ms
acall d20ms
acall d20ms
acall d20ms
acall delay01
mov sbuf,#27h
wtb:jnb ti,wtb
clr ti
acall delay01
mov sbuf,han_counter
wtb7:jnb ti,wtb7
clr ti
acall delay01
mov sbuf,counter
wtb1:jnb ti,wtb1
clr ti
mov r1,#hanzi_sbuf
loop: acall delay01
mov sbuf,@r1
wt0: jnb ti,wt0
clr ti
inc r1
acall delay01
mov sbuf,@r1
wt1:jnb ti,wt1
clr ti
inc r1
djnz han_counter,loop
ret
send_ret:ret
send_success:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #send_success_disp ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
quweishuru:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #quweishuru_disp ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
chongxinglinK_DISP: MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #chongxin_link ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
rdy_chaoshi_disp:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #chaoshi_disp ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
fasongqiandao:mov sbuf,#31H ;fa song qian dao shi 0h
LINK_WT:JNB TI,LINK_WT
CLR TI
DJNZ R3,fasongqiandao
MOV R3,#05H
RET
jieshouqiandao:
MOV R7,#07H;定时器的条用次数
SETB tr0;开启定时器
MOV R4,#0H
R_LINK:
JB F1,R_RET ;定时已到,但还没有建立连接
JNB RI,R_LINK
CLR RI
MOV A,SBUF
CJNE A,#30H,jieshouqiandao
INC R4
CJNE R4,#05H,R_LINK
MOV R4,#0H
R_RET: RET
dingshiqi:mov tl0,#0h
mov TH0,#0H
DJNZ R7,D_RETI
ACALL RDY_chaoshi_disp
setb f1;超时连接的标志位
clr f0;清连接标志位
D_RETI: RETI
long: mov r5,#20h
rrr:acall d20ms
acall d20ms
djnz r5,rrr
ret
;******************************
key_pc:acall rdy_pc_link ;等待微机的命令
acall rom_disp
acall long
acall rdy_try_link
acall rom_disp
acall pc_link
JB 20H.2 ,NEXT7
AJMP KEY_PC;连接到连上为止
NEXT7: acall fasongqiandao
mov dptr,#link_success_disp
MOV R2,#08h
pc_SEND_WORD_11:CLR A
MOVC A,@A+DPTR
MOV SBUF,A
pc_TWT21:JNB TI,pc_TWT21
CLR TI
INC DPTR
DJNZ R2,pc_SEND_WORD_11
AJMP KEY_RET
;----------------------------------
pc_link:acall PC_jieshouqiandao
pwt0: jnb ri,PWT0
CLR RI
MOV A,SBUF
XRL A,#0FFH
JNZ PC_LINK
SETB 20H.2
RET
PC_jieshouqiandao:MOV R4,#0H
WT7: JNB RI,WT7
CLR RI
MOV A,SBUF
CJNE A,#30H,PC_jieshouqiandao
INC R4
CJNE R4,#05H,wt7
MOV R4,#0H
RET
;-----------------------------
REC_PC:
acall pc_jieshouqiandao
PWT1:JNB RI,PWT1
CLR RI
MOV A,SBUF
XRL A,#35H
JZ SHOUCHISHOU
MOV A,SBUF
XRL A,#39H
JZ SHOUCHIFA
ajmp rec_pc
;-------手持发 ---------------------
shouchifa: acall rdy_shouchifa_disp;手持发模式提示
acall rom_disp
acall shouchifahuifu
acall fasong
ret
;-------------------------------
shouchifahuifu:acall fasongqiandao
pcSEND_WORD1 :mov dptr,#shouchifatishi_tab
MOV R2,#08h
pcSEND_WORD_11:CLR A
MOVC A,@A+DPTR
MOV SBUF,A
pcTWT21:JNB TI,pcTWT21
CLR TI
INC DPTR
; ACALL DELAY01
DJNZ R2,pcSEND_WORD_11
ret
fasong:
mov sbuf,counter
pc_wtb7:jnb ti,pc_wtb7
clr ti
acall delay01
mov sbuf,#04
pc_wtb1:jnb ti,pc_wtb1
clr ti
acall delay
mov sbuf,#01
acall delay01
mov r1,#hanzi_sbuf
loop0: mov sbuf,@r1
pc_wt0: jnb ti,pc_wt0
clr ti
inc r1
mov sbuf,@r1
pc_wt1:jnb ti,pc_wt1
clr ti
inc r1
djnz han_counter,loop0
ret
shouchishou:acall rdy_shouchishou_disp
acall rom_disp1
acall shouchishouhuifu
acall jieshou
acall ram1_disp
ajmp pc_rec_ret
;-------------------------------------------
shouchishouhuifu:ACALL fasongqiandao
pcSEND_WORD :mov dptr,#shouchishoutishi_tab
MOV R2,#08h
pcSEND_WORD_1:CLR A
MOVC A,@A+DPTR
MOV SBUF,A
pcTWT2:JNB TI,pcTWT2
CLR TI
INC DPTR
DJNZ R2,pcSEND_WORD_1
ret
jieshou:acall pc_jieshouqiandao
wt8: jnb ri,wt8
clr ri
mov rec_num,sbuf
ppwt0:jnb ri,ppwt0
clr ri
mov word_wid,sbuf
ppwt1:jnb ri,ppwt1
clr ri
mov word_lin,sbuf
pc_REC_HANZI:MOV R2,REC_NUM
MOV R0,#HANZI_SBUF
WT31: JNB RI,WT31
CLR RI
MOV @R0,SBUF
INC R0
DJNZ R2,WT31
acall rdy_pc_rec_hanzi
ret
pc_rec_ret:ret
ram1_DISP:setb RESET
setb PSB
CLR RW
WQIU1: LCALL INITIL ;调用系统初始化程序
MOV A, #0CH ;开显示,关游标
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
LCALL INPUT
LCALL DELAY01
;-----------------
;汉字显示子程序
;---------------
WWORD_DISP:
MOV R1,WORD_WID
WWORD10: LCALL DEADD ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
LCALL INPUT
WWORD11: CLR A ;因为要连续输入机内码高位(区码)、低位(位码)
MOV A, @r0 ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL DISPL ;DATA INPUT
INC r0 ;显示地址会自动加一,如果连续写就不用再输入地址,空白可用某空白汉字或字符代替
CLR A
MOV A, @r0
LCALL DISPL ;DATA INPUT
LCALL DELAY01
INC r0
DJNZ R1,WWORD11
MOV R1,WORD_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ WORD_LIN,WWORD10
ret
rdy_pc_link:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV dptr,#pc_lnk ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
ret
rdy_pc_rec_hanzi:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV R0,#hanzi_sbuf ;需要显示汉字机内码数据表
MOV START_ADD,#00H
ret
rdy_shouchishou_disp: MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV dptr,#shouchishoutishi_tab ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
ret
rdy_shouchifa_disp:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV dptr,#shouchifatishi_tab ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
ret
;*********************************
send_success_disp:db 0b7h,0a2h,0cbh,0cdh,0b3h,0c9h,0b9h,0a6h;发送成功
link_success_disp:db 0c1h,0ach,0bdh,0d3h,0b3h,0c9h,0b9h,0a6h;连接成功
CHAOSHI_DISP:DB 0b3h,0ach,0cah,0b1h,0b3h,0f6h,0b4h,0edh;超时出错
chongxin_link:DB 0d6h,0d8h,0d0h,0c2h,0c1h,0ach,0bdh,0d3h;重新连接
try_link:db 0bdh,0a8h,0c1h,0a2h,0c1h,0ach,0bdh,0d3h;建立连接
start_disp:db 0bbh,0b6h,0d3h,0adh,0cah,0b9h,0d3h,0c3h;欢迎使用
quweishuru_disp:db 0c7h,0f8h,0ceh,0bbh,0cah,0e4h,0c8h,0ebh ;区位输入
anjiantishi_disp:db 0b0h,0b4h,0c1h,0ach,0bdh,0d3h,0bch,0fch;按连接键
pc_lnk:db 0CEH,0A2H,0BBH,0FAH,0cdh,0a8h,0d0h,0c5h;微机模式
shouchishoutishi_tab:db 0CEH,0A2H,0BBH,0FAH,0B7H,0A2H,0cbh,0cdh;微机发送
shouchifatishi_tab:db 0CEH,0A2H,0BBH,0FAH,0BDH,0D3H,0CAH,0D5H ;微机接受
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -