📄 89c51communication.txt
字号:
程 序 清 单
****************************************************
***********从机程序清单****************************
***************************************************
****************************************************
FIRST_COL EQU 30H ;定义字符/汉字显示起始行
FIRST_ROW EQU 31H ;定义字符/汉字显示起始列
WORD_WID EQU 32H ;定义字符/汉字显示长度
WORD_LIN EQU 33H ;定义字符/汉字显示行数
FIRST_ADD EQU 34H ;定义字符/汉字显示起始位置
START_ADD EQU 35H ;起始位置缓存单元
FIRST_LIN EQU 36h
;**********************************************
;********************************************
;********************************************
hanzi_counter EQU 38H ;要发送的字节数
REC_HANZi_SBUF EQU 80H ;接受到的汉字存储起始单元
counter equ 39h
RS EQU P3.3
RW EQU P3.4
E EQU P3.5
PSB EQU P3.6
RESET EQU P3.7
ORG 0000H
AJMP ALL_START
ORG 0050H
;------------------------------------
ALL_START:MOV EA ,#0H
MOV SCON ,#01010000B;方式2,允许接受
ANL PCON,#7FH;SMOD=0
MOV TMOD,#20H;定时器1,模式2
MOV TH1,#0E6H
MOV TL1,#0E6H;波特率为1200
SETB TR1
MOV SP,#60H
;f0=1,ram;f0=0,rom
mov r3,#05h
mov r4,#0h
;-------------------------------------
;**********************************************
START:ACALL rdy_START_DISP;启动开启显示
acall disp
;************************************************8
MAIN:acall jieshouqiandao
wt1:jnb ri,wt1
clr ri
mov a,sbuf
xrl a,#50h
jz link
mov a,sbuf
xrl a,#27h
jz next1
ajmp main
next1:acall rec_hanzi
next11:acall disp
ajmp main
;-----------------------------------
;--------------------------------
REC_HANZI:jnb ri,rec_hanzi
clr ri
mov hanzi_counter,sbuf
wt4:jnb ri,wt4
clr ri
mov counter,sbuf
mov r2,counter
MOV R0,#REC_HANZI_SBUF
WT3: JNB RI,WT3
CLR RI
MOV @R0,SBUF
INC R0
DJNZ R2,WT3
ACALL fasongqiandao
ACALL RDY_HANZI_DISP
AJMP REC_RET
;-----------------------------
link:acall fasongqiandao
acall rdy_link_success
ajmp next11
;---------------------------------------
jieshouqiandao:MOV R4,#0H
R_LINK:JNB RI,R_LINK
CLR RI
MOV A,SBUF
CJNE A,#31H,jieshouqiandao
INC R4
CJNE R4,#05H,R_LINK
MOV R4,#0H
RET
;----------------------------------------
fasongqiandao:mov sbuf,#30H ;fa song qian dao shi 0h
LINK_WT:JNB TI,LINK_WT
CLR TI
ACALL DELAY01
DJNZ R3,fasongqiandao
MOV R3,#05H
RET
;-----------------------------------------------------
REC_RET:RET
;*************************************************
;***************************************************8
;************显示准备*******************
rdy_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
clr f0
RET
RDY_HANZI_DISP:MOV FIRST_ADD,#00H ;设定字符/汉字显示起始位置为第一个显示单元
MOV FIRST_LIN,#01H ;设定字符/汉字显示起始位置为第一行
MOV R0,#REC_hanzi_SBUF ;需要显示汉字机内码数据表
MOV word_WID,#04H ;每行显示汉字个数
MOV word_LIN,#01H ;显示行数
MOV START_ADD,#00H
setb f0
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
clr f0
RET
;*************************************
;**************************************8
DISP:jb f0,next2
ajmp rom_disp
next2:ajmp ram_disp
;------------------------
ram_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,hanzi_counter
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
acall long
acall clear_screen
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
;-----------------
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
;-----------------
;SEARCH ADDRESS
;目的是为了转换地址单元为DDRAM地址单元,以方便
;定义显示位置
;汉字显示DDRAM位置为:第一行:80H----87H
; 第二行:90H----97H
;-----------------
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
;--------------------------------------
CHK_BUSY: CLR RS ;读忙状态子程序
SETB RW
SETB E
HEHE1: JB P1.7,HEHE1
CLR E
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
;----------------------
;DELAY TIME
;---------------------
DELAY: MOV R5,#03H
C0: MOV R6, #0FFH
C1: MOV R7, #0FFH
C2: DJNZ R7, C2
DJNZ R6, C1
NOP
NOP
DJNZ R5, C0
RET
DELAY01: MOV R6, #6
D5: MOV R7, #08h
D6: DJNZ R7, D6
DJNZ R6, D5
RET
;------------------
DELAY02: MOV R6, #6
D52: MOV R7, #18h
D62: DJNZ R7, D62
DJNZ R6, D52
RET
;---------------------------------
DISP_RET:RET
;***************************************
;*************rom_disp*************
ROM_DISP: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_DISP1:
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
CLR F0;清rom显示标志位
acall short
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
D20MS:mov r7,#14h
loop1:mov r6,#0ffh
loop2:nop
nop
djnz r6,loop2
djnz r7,loop1
ret
;------------------------
short:mov r5,#10h
ppp:acall d20ms
acall d20ms
djnz r5,ppp
acall clear_screen
ret
long:mov r5,#20h
eee:acall d20ms
acall d20ms
djnz r5,eee
acall clear_screen
ret
;*************************************
start_disp:DB 0bbh,0b6h,0d3h,0adh,0cah,0b9h,0d3h,0c3h;欢迎使用
link_success_disp:db 0c1h,0ach,0bdh,0d3h,0b3h,0c9h,0b9h,0a6h;连接成功
end
****************************************************
***********主机程序清单****************************
***************************************************
****************************************************
qm_1 equ 38h
qm_2 equ 39h
wm_1 equ 3ah
wm_2 equ 3bh
jnm1_sbuf equ 3ch
jnm2_sbuf equ 3dh
qw_counter equ 3eh
num_sbuf equ 3fh
qw_num equ 40h
han_counter equ 41h
counter equ 42h
stor equ 43h
rec_num equ 44h
hanzi_sbuf equ 80h
;********************
FIRST_COL EQU 30H ;定义字符/汉字显示起始行
FIRST_ROW EQU 31H ;定义字符/汉字显示起始列
WORD_WID EQU 32H ;定义字符/汉字显示长度
WORD_LIN EQU 33H ;定义字符/汉字显示行数
FIRST_ADD EQU 34H ;定义字符/汉字显示起始位置
START_ADD EQU 35H ;起始位置缓存单元
FIRST_LIN EQU 36h
RS EQU P3.3
RW EQU P3.4
E EQU P3.5
PSB EQU P3.6
RESET EQU P3.7
ORG 0000H
AJMP all_start
org 000bh
ajmp dingshiqi
ORG 0050H
all_start:MOV IE ,#10000010B;开定时器0的中断
MOV SCON ,#01010000B;方式2,允许接受
ANL PCON,#7FH;SMOD=0
MOV TMOD,#21H;定时器1,模2,定时器0。模式1
MOV TH1,#0E6H
MOV TL1,#0E6H;波特率为1200
setb TR1
MOV SP,#60H
mov 20h,#0h
clr f0
clr f1
MOV TL0,#0H
MOV TH0,#0H;定时为0.6s
mov r3,#05h
mov r4,#0h
mov r1,#hanzi_sbuf
mov qw_counter,#0h
mov han_counter,#0h
mov counter,#0h
;******************************
start:
lcall rdy_start_disp
lcall rom_disp1
lcall long
lcall quweishuru
lcall rom_disp1
lcall long
lcall del
main:acall key
shanzhuan0:jnb 20h.2,shanzhuan ; pc模式
acall link_success
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -