📄 89c51communication.txt
字号:
acall rom_disp
acall long
acall rec_pc
clr 20h.2
ajmp main
shanzhuan:jnb 20h.4,sz_next1;是删除键
lcall del
clr 20h.4
ajmp main
sz_next1:jnb 20h.7,sz_next2;是发送键
jnb f0,sed
lcall send
clr 20h.7
acall clear_screen
acall quweishuru
acall rom_disp
acall long
acall del
ajmp main
sed:acall rdy_try_link
acall rom_disp
acall long
acall anjiantishi
acall rom_disp
acall long
clr 20h.7
ajmp main
sz_next2:jnb 20h.6,f_main;是连接键
lcall link
clr 20h.6
ajmp main
f_main:acall zhuanhuan
acall wb_disp;显示汉字
ajmp main
;******************************
;******************************
;*****************************
;********键扫描***********
;***********************
KEY:MOV P2,#0FH
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,next
;-------------------------------
;yan shi hou zai pan duan
NEXT:ACALL D20MS
MOV P2,#0FH
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,KEY_adjust
ajmp key
;-------------------------------
KEY_ADJUST:MOV P2,#01111111b
JNB P2.3,KEY1;等于1 ,不是1键
JNB P2.2,KEY2
JNB P2.1,KEY3
JNB P2.0,KEY4
MOV P2,#10111111b
JNB P2.3,KEY5
JNB P2.2,KEY6
JNB P2.1,KEY7
JNB P2.0,KEY8
MOV P2,#11011111b
JNB P2.3,Key9
JNB P2.2,Key0
JNB P2.1,Key_de
jnb p2.0,key_lin
MOV P2,#11101111b
JNB P2.3,Key_sen
jnb p2.0,ky_pc
AJMP KEY
;-------------------------------
;--------------------------------------------
KEY1:acall key_shifang
MOV NUM_SBUF,#30H
mov qw_num ,#00h
AJMP qw_adjust
KEY2:acall key_shifang
MOV NUM_SBUF,#31H
mov qw_num,#01h
AJMP qw_adjust
KEY3:acall key_shifang
MOV NUM_SBUF,#32H
mov qw_num,#02h
AJMP qw_adjust
KEY4:acall key_shifang
MOV NUM_SBUF,#33H
mov qw_num,#03h
AJMP qw_adjust
KEY5:acall key_shifang
MOV NUM_SBUF,#34H
mov qw_num,#04h
AJMP qw_adjust
KEY6:acall key_shifang
MOV NUM_SBUF,#35H
mov qw_num,#05h
AJMP qw_adjust
KEY7: acall key_shifang
MOV NUM_SBUF,#36H
mov qw_num,#06h
AJMP qw_adjust
KEY8:acall key_shifang
MOV NUM_SBUF,#37H
mov qw_num,#07h
AJMP qw_adjust
KEY9:acall key_shifang
MOV NUM_SBUF,#38H
mov qw_num,#08h
AJMP qw_adjust;区位码数判断
KEY0:acall key_shifang
MOV NUM_SBUF,#39H
mov qw_num,#09h
ajmp qw_adjust
key_de:ajmp key_del
key_lin:ajmp key_link
key_sen:ajmp key_send
ky_pc:ajmp key_pc
;***********************************
qw_adjust: inc qw_counter
mov a,qw_counter
cjne a,#01h,next00
mov qm_1,qw_num
acall qw_disp
ajmp key
next00:mov a,qw_counter
cjne a,#02h,next10
mov qm_2,qw_num
lcall qw_disp
ajmp key
next10: mov a,qw_counter
cjne a,#03h,next20
mov wm_1,qw_num
lcall qw_disp
ajmp key
next20: mov a,qw_counter
cjne a,#04h,next30
mov qw_counter,#0h
inc han_counter
mov wm_2,qw_num
lcall qw_disp
ajmp key_ret
next30:ajmp key_ret
;**************************************
key_del: setb 20h.4
acall key_shifang
ajmp key_ret
key_link:setb f0
setb 20h.6
;acall rdy_link_tishi
acall key_shifang
ajmp key_ret
key_send:
setb 20h.7
acall key_shifang
ajmp key_ret
key_ret:ret
;*************连接**********************
link:acall link_success
acall fasongqiandao
acall link1
acall jieshouqiandao
clr tr0
MOV TL0,#0H
MOV TH0,#0H;定时为0.6s
jnb f1,KKK
acall rom_disp
acall long
acall chongxinglink_disp
acall rom_disp
clr f1
RET
KKK:acall rom_disp
ret
;**********************
link1:mov sbuf,#50h
wt3:jnb ti,wt3
clr ti
ret
;***********************
link_success:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #link_success_disp;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
rdy_try_link:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #try_link ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
rdy_start_disp:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #start_disp ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
anjiantishi:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV DPTR, #anjiantishi_disp;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
RET
;**************************************
;**************************************
;**********转换************************
zhuanhuan :mov a,qm_1
mov b,#10d ;vx10
mul ab
MOV B,qm_2
add a,B
mov b,#16d ;chu 16
DIV ab
swap a
orl a,b
ADD A,#20H
ADD A,#80H
mov jnm1_sbuf,a
mov a,wm_1
mov b,#10d ;vx10
mul ab
MOV B,wm_2
add a,B
mov b,#16d ;chu 16
DIV ab
swap a
orl a,b
ADD A,#20H
ADD A,#80H
;***********
mov jnm2_sbuf,a
mov @r1,jnm1_sbuf
inc r1
mov @r1,jnm2_sbuf
inc r1
mov a,counter
add a,#02h
mov counter,a
zhuanhuan_ret:ret
;**************************
;***********显示-RAM*********************
wb_disp:mov a,han_counter
cjne a,#01h,next2_wb
mov a,#90h
lcall input
loop3: ;因为要连续输入机内码高位(区码)、低位(位码)
MOV A,jnm1_sbuf ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL DISPL ;DATA INPUT
MOV A,jnm2_sbuf
LCALL DISPL ;DATA INPUT
LCALL DELAY01
ajmp disp_ret
next2_wb:mov a,han_counter
cjne a,#02h,next3_wb
mov a,#91h
lcall input
ajmp loop3
next3_wb:mov a,han_counter
cjne a,#03h,next4_wb
mov a,#92h
lcall input
ajmp loop3
next4_wb:mov a,han_counter
cjne a,#04h,next5_wb
mov a,#93h
lcall input
ajmp loop3
next5_wb:mov a,han_counter
cjne a,#05h,next6_wb
mov a,#88h
lcall input
AJMP LOOP3
next6_wb:mov a,han_counter
cjne a ,#06h,next7_wb
mov a,#89h
lcall input
ajmp loop3
next7_wb:mov a,han_counter
cjne a,#07h,next8_wb
mov a,#8ah
lcall input
ajmp loop3
next8_wb:mov a,han_counter
cjne a,#08h,next9_wb
mov a,#8bh
lcall input
ajmp loop3
next9_wb:mov a,han_counter
cjne a,#09h,next10_wb
MOV A,#98H
LCALL INPUT
next10_wb:mov a,han_counter
cjne a,#0Ah,next11_wb
mov a,#99h
lcall input
ajmp loop3
next11_wb:mov a,han_counter
cjne a,#0Bh,next12_wb
mov a,#9ah
lcall input
ajmp loop3
next12_wb:mov a,han_counter
cjne a,#0Ch,next13_wb
mov a,#9bh
lcall input
ajmp loop3
next13_wb:ret
disp_ret:ret
qw_disp:
mov a,#80h
lcall input
mov a,num_sbuf
lcall displ
lcall delay01
ret
DISPL: LCALL CHK_BUSY ;P3--CONTRAL I/O
NOP ;P3=11111001B RS=1 WRITE DATA
SETB RS
CLR RW
SETB E ;E=E(I/O)
MOV P1, A ;P1=DATA(I/O)
LCALL DELAY01
NOP
CLR E
NOP
MOV P1,#0FFH
RET
DELAY01: MOV R6, #6
D5: MOV R7, #08h
D6: DJNZ R7, D6
DJNZ R6, D5
RET
CHK_BUSY: CLR RS ;读忙状态子程序
SETB RW
SETB E
HEHE1: JB P1.7,HEHE1
CLR E
RET
D20MS:mov r7,#14h
loop1:mov r6,#0ffh
loop2:nop
nop
djnz r6,loop2
djnz r7,loop1
ret
KEY_shifang:mov P2,#0FH
MOV A,P2
ANL A,#0FH
CJNE A,#0FH,KEY_shifang
ret
INPUT: LCALL CHK_BUSY ;以确保上一指令/数据模块已经接收处理完
;P3--CONTRAL I/O
NOP ;P3=11111000B RS=0 WRITE INSTRUTION
CLR RS
CLR RW
SETB E ;E=E(I/O)
MOV P1, A ;P1=DATA(I/O)
LCALL DELAY01
NOP
CLR E
NOP
MOV P1,#0FFH
RET
del:lcall clear_screen
mov qw_counter,#0h
mov han_counter,#0h
clr f0
mov 20h,#0h
mov counter,#0h
mov r1,#hanzi_sbuf
del_ret:ret
RoM_DISP1:setb RESET
setb PSB
CLR RW
ROM_QIU1: LCALL INITIL ;调用系统初始化程序
MOV A, #0CH ;开显示,关游标
LCALL INPUT
LCALL DELAY01
MOV A, #01H ;DDRAM清零,DDRAM地址计数器到00H
LCALL INPUT
LCALL DELAY01
;-------------------------
ROM_DISP:
MOV R1,WORD_WID
ROM_NWORD10: LCALL DEADD ;调用调整地址单元子程序
MOV A, START_ADD ;设定DDRAM地址,显示位置地址
LCALL INPUT
ROM_NWORD11:CLR A ;因为要连续输入机内码高位(区码)、低位(位码)
MOVC A,@A+DPTR ;所以要输入两次数据,如果是字符就是输入两个字符字符代码可以看说明书
LCALL DISPL
CLR A ;DATA INPUT
INC DPTR
movC A,@A+DPTR
lcall displ
LCALL DELAY01
INC DPTR
DJNZ R1,ROM_NWORD11
MOV R1,WORD_WID ;调整显示长度
INC FIRST_LIN ;跳到下一行
DJNZ WORD_LIN,ROM_NWORD10
ret
DELAY: MOV R5,#03H
C0: MOV R6, #0FFH
C1: MOV R7, #0FFH
C2: DJNZ R7, C2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -