📄 ll.asm
字号:
/*题目:单片机1和单片机2进行全双工通信,单片机1的P1.0用作选单片机2的位,P1.1作为加法键;
单片机2的P1.0用作选单片机1的位,P1.1作为减法键;
编程思路:此题的关键是如何区分接收到的值是按键值还是显示值,因为数码管显示的值是从0到9,不会超过10
所以可以让按键的初始值为9,再设一个与按键值作比较的值,初始值设为10,存放在23H中,当接收到一个值时,
把SBUF中的值与23H中的值作比较,若>=10则接收到的值是按键值,否则为显示值*/
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP ESINTER
MAIN: MOV SP,#60H
MOV R0,#00H ;作为各十位切换显示
MOV R5,#0
MOV 22H,#9 ;按键按一次从9加起
MOV 23H,#10 ;在接收程序里用作和按键值作比较,从而判断接收到的值是按键值还是显示值
MOV 30H,#0
MOV 31H,#0 ;发送显存初始化
MOV 40H,#0
MOV 41H,#0 ;本机数码管显存初始化
CALL INIT
LOOP: CALL DISP
CALL KEY
CALL DELAY
AJMP LOOP
INIT: SETB ES
MOV TMOD,#20H
MOV TH1,#(-3)
MOV TL1,#(-3) ; 波特率设置
MOV SCON,#50H
SETB TR1
SETB EA ;开总中断
RET
ESINTER:
PUSH PSW
PUSH ACC
JB TI,FASONG ;判断是发送还是接收引起的中断
CALL RECEIVE
AJMP OVER2
FASONG: CLR TI
OVER2: POP ACC
POP PSW
RETI
RECEIVE:
CLR RI
MOV A,SBUF
MOV 21H,A
CJNE A,23H,BUDENG ;若等,则接收到的值是按键值,若不等,则是显示值
INC 23H ;加1是为了和下一次按键值作比较
MOV B,#3
DIV AB
MOV R5,B ;得到余数,从而可得知下一次接收到的值是个位还是十位
AJMP REOVER
BUDENG: CJNE R5,#1,NO1
MOV 40H,21H
AJMP REOVER
NO1: MOV 41H,21H
REOVER: RET
SEND:
CLR TI
MOV A,@R1 ;把值发送出去
MOV SBUF,A
JNB TI,$ ;等待发完
RET
KEY: JNB P1.0,KEY1
JNB P1.1,KEY2
AJMP KEYOVER
KEY1: JNB P1.0,$
INC 22H ;按一次键加1
MOV R1,#22H
CALL SEND ;把按键值发送出去
AJMP KEYOVER
KEY2: JNB P1.1,$
MOV A,22H
MOV B,#3
DIV AB
MOV A,B
CJNE A,#0,NO00 ;若等于0,一位都没选中
AJMP KEYOVER
NO00: CJNE A,#1,NO11 ;若等于1,选中个位
DEC 30H
MOV A,30H
CJNE A,#0FFH,SONG
MOV 30H,#9
SONG: MOV R1,#30H
CALL SEND ;发送个位
AJMP KEYOVER
NO11: DEC 31H ;选中十位
MOV A,31H
CJNE A,#0FFH,FA
MOV 31H,#9
FA: MOV R1,#31H
CALL SEND ;发送十位
KEYOVER: RET
DISP:
MOV A,R0
CPL A
MOV R0,A
CJNE A,#0FFH,XIANSHI ;判断显个位还是十位
MOV DPTR,#TAB
MOV A,40H
MOVC A,@A+DPTR ;查表
MOV P2,#0
MOV P2,A ;把要显示的值送给P2
CLR P3.7
SETB P3.6 ;关十位,显个位
AJMP OVER
XIANSHI: MOV DPTR,#TAB
MOV A,41H
MOVC A,@A+DPTR ;查表
MOV P2,#0
MOV P2,A
CLR P3.6
SETB P3.7 ;关个位,显十位
OVER: RET
DELAY:
MOV R6,#05H
JIANR6: MOV R7,#0FFH
JIANR7: DEC R7
CJNE R7,#0,JIANR7
DEC R6
CJNE R6,#0,JIANR6
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -