⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ll.asm

📁 用单片机实现两个数码管全双工通信,经过功能验证.
💻 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 + -