📄 code.txt
字号:
;从机程序
ORG 0000H
LJMP START
DELAY: MOV R7,#0
DELAYLOOP: DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
LEDMAP: ;共阴极八段管0~9的显示码
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
START: MOV SP,#70H ;设置堆栈指针
MOV PCON,#00H ;设置SMOD=0
MOV TMOD,#20H ;定时器T1设置为方式2
MOV TH1,#0FDH ;设置波特率为9600bps
MOV TL1,#0FDH
SETB TR1 ;启动T1
MOV SCON,#0F0H ;串口工作于方式3,允许接收,TB8=0
AA: CLR RI ;清接收中断标志
JNB RI,$ ;等待主机呼叫
MOV A,SBUF ;主机呼叫的从机地址送A
CJNE A,#01H,AA ;是本机地址?否,跳到AA,继续等待主机呼叫
MOV SBUF,#01H ;是,返回本机地址,回应主机
MOV P1,#06H ;显示“1”,告知从机用户发送数据
CLR P2.0
MOV R6,#0 ;调用延时程序
LCALL DELAY
LCALL SENTER ;调用发送子程序
MOV R4,#30 ;设置刷新的次数
DISAGAIN: LCALL DISPLAYLED ;调用显示子程序
DJNZ R4,DISAGAIN
SETB SM2 ;准备下一次接收主机呼叫
SETB REN ;从机允许再次接收数据
SJMP AA ;跳到AA,再次等待主机呼叫
SENTER: MOV R0,#30H ;设置数据块存放始地址
MOV 70H,#0 ;校验和初始化为零
MOV R2,#0 ;将存放数据个数的寄存器R2清零
KEY: SETB P2.7 ;设置OK键
CLR P2.6
MOV R0,#0F8H ;屏蔽码及P1口控制字
MOV P1,R0 ;个行接地,P1.3~P1.5为输入
MOV A,P1 ;读入列信息
CJNE A,#0F8H,WAIT ;根据扫描结果判断有无键按下?有,跳到WAIT
SJMP KEY ;无,跳回KEY,开始新一轮扫描
WAIT: MOV R6,#1
LCALL DELAY ;按键延时消抖
MOV R0,#0F8H ;屏蔽码及P1口控制字
MOV P1,R0 ;个行接地,P1.3~P1.5为输入
MOV A,P1 ;读入列信息
CJNE A,#0F8H,SCAN ;再根据扫描结果判断有无键按下?有,跳到SCAN
SJMP KEY ;无,跳回KEY,开始新一轮的扫描
SCAN: MOV R1,#03H ;列数为3
MOV 20H,#0FEH ;初始化扫描字
MOV 10H,#01H ;初始化键号
BEGIN: MOV A,20H
MOV P1,A ;扫描第一行
MOV A,P1 ;输入列信息
CJNE A,20H,FL ;第一行有键按下?有,找到列值
MOV A,20H ;无,调整扫描字
RL A
MOV 20H,A
MOV A,R1
ADD A,20H ;键号加列数
MOV 20H,A
SJMP BEGIN ;继续扫描
FL: MOV A,P1 ;读取列信息
JNB ACC.3,DO ;第一列为零?是,跳到DO
INC 10H ;否,键号加1
JNB ACC.4,DO ;第二列为零?是,跳到DO
INC 10H ;否,键号加1
JNB ACC.5,DO
DO: INC R2 ;记录数据个数
MOV A,10H
MOV DPTR,#LEDMAP
MOVC A,@A+DPTR ;数值转换为显示码
MOV @R0,A ;显示码存入数据缓冲区
INC R0
MOV A,R2 ;设置传送数据的最大个数即最多传送10个数据
CLR C
SUBB A,#0AH
JZ TT ;达到最大值?是,跳到TT
JB P2.7,KEY ;否,OK键按下?否,跳到KEY,继续输入数据
TT: MOV A,R2
MOV SBUF,A ;发送数据个数
CLR TI
JNB TI,$ ;等待一个字节发送完
MOV R0,#30H ;设置数据块存放始地址
MOV 70H,#0 ;校验和初始化为零
SENTERAGAIN: MOV A,@R0
MOV SBUF,A ;发送当前的数据
ADD A,70H ;计算校验和
MOV 70H,A ;存放校验和
INC R0 ;准备下个要发送的数据的存放地址
ADD A,70H ;计算接收数据的校验和
MOV 70H,A ;暂存校验和
CLR TI
JNB TI,$ ;等待一个字节的数据发送完
DJNZ R2,SENTERAGAIN ;所有数据接收完?否,跳到SENTERAGAIN
MOV A,70H ;发送校验和
CLR RI
JNB RI,$ ;等待主机接收的结果标志位
CJNE A,#00H,SENTERAGAIN ;主机接收正确?否,返回到SENTERAGAIN再次发送数据
RET
DISPLAYLED: MOV R0,#30H
DISPLAY: MOV R1,#4 ;共四个八段管
MOV R3,#11111110B ;从左边开始显示
LOOP: MOV P2,#0FH ;关所有八段管
MOV P1,R0 ;显示一位八段管
MOV P2,R3
MOV R6,#1
LCALL DELAY ;调用延迟子程序
MOV A,R3 ;显示下一位
RL A
MOV R3,A
INC R0
DEC R2 ;数据块长度减1
DJNZ R1,LOOP ;四位显示完?否,跳到LOOP
MOV A,R2 ;将R2中的值给A
JNZ DISPLAY ;数据块都显示完?否,跳到DISPLAY
RET ;是,返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -