/**=============发送==================**/
KEYB EQU 20H.0 ;按键标致(为1时有键按下)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
/* MOV SP,#60H
MOV TMOD,#20H
MOV TL1,#0E6H
MOV TH1,#0E6H
MOV SCON,#50H
MOV PCON,#80H ;
SETB TR1
*/
BEGIN: ACALL KEY ;调用键盘扫描
JB KEYB,BEGIN_ ;判断是否有键按下
JMP BEGIN
BEGIN_: CLR KEYB
MOV R0,#80H
MOV A,R4
MOV @R0,A
MOV P0,A
/*
;发送联络信号
ITX4: MOV SBUF,#33H ;发给从机1
ITX2: JBC TI,ITX1
JMP ITX2 ;等待发送
ITX1: JBC RI,ITX3 ;等待二号机回答
JMP ITX1
ITX3: MOV A,SBUF ;接收联络信号
XRL A,#33H ;异或,等于33H的话,A就为0
JNZ ITX4 ;二号机未准备好,继续联络
;串行发送
CK2: MOV R0,#80H ;开始读取,数据传送
START: MOV A,@R0
MOV SBUF,A
WAIT: JBC TI,CONT
JMP WAIT
CONT: JMP BEGIN */
SJMP BEGIN
;********键盘扫描********调用键盘扫描以后会返回一个键值存于R4中,和一个标致位KEYB
KEY: MOV A,#0FH ;查询是否有键按下
MOV P1,A
MOV A,P1
CJNE A,#0FH,KEYY
CLR KEYB
AJMP NEXT
KEYY: ACALL DEL ;去抖动
MOV A,P1
CJNE A,#0FH,GO
MOV R4,#10H ;若有抖动,则返回无效键值
CLR KEYB
AJMP NEXT
GO: SETB KEYB ;置按键标致位
MOV R2,A ;R2中存放着行信息
X1: CJNE R2,#0EH,X2 ;若为第一行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A ;R3中存放着列信息
Y0: CJNE R3,#0E0H,Y1 ;若为第一列
MOV R4,#00H ;R4中存放要返回的键值
AJMP NEXT
Y1: CJNE R3,#0D0H,Y2 ;若为第二列,Yn表示16个键对应的操作
MOV R4,#01H
AJMP NEXT
Y2: CJNE R3,#0B0H,Y3 ;若为第三列
MOV R4,#02H
AJMP NEXT
Y3: CJNE R3,#70H,X2 ;若为第四列
MOV R4,#03H
AJMP NEXT
X2: CJNE R2,#0DH,X3 ;若为第二行
MOV A,#0F0H
MOV P1,A
MOV A,P1
MOV R3,A
Y4: CJNE R3,#0E0H,Y5 ;若为第一列
MOV R4,#04H
AJMP NEXT
Y5: CJNE R3,#0D0H,Y6 ;若为第二列
MOV R4,#05H
AJMP NEXT
Y6: CJNE R3,#0B0H,Y7
MOV R4,#06H
AJMP NEXT
Y7: CJNE R3,#70H,X3
MOV R4,#07H
AJMP NEXT
X3: CJNE R2,#0BH,X4 ;若为第三行
MOV A,#0F0H
MOV P1,A
[1] [2] [3] 下一页
本文关键字:通信 51单片机,单片机-工控设备 - 51单片机