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

📄 fasong.asm

📁 实现了单片机间的多种通讯模式
💻 ASM
字号:

Z8279 EQU 0FF82H;
D8279 EQU 0FF80H;
Z8255 EQU 8502H;
A8255 EQU 8500H;
W8255 EQU 10H;控制字,A口方式0输出
LEDCLS EQU 0D1H;
LEDWRO EQU 90H;
LEDFEQ EQU 34H;
LEDMOD EQU 10H;
;---------------------------
    	ORG 0000H
    	AJMP START

	ORG 000BH
	LJMP BREAK
   	ORG 0050H
START:
    	MOV SP,#60H;    8279的初始化
    	LCALL INIT8279
    	LCALL INIT_CPU

       	MOV  TMOD,#21H          ;把定时器1设置在模式2,定时器0工作在模式1
       	MOV SCON,#70H          ;串行口工作在方式1
       	MOV PCON,#80H
	MOV TH1,#0FDH          ;波特率为9.6kbs
       	MOV TL1,#0FDH
       	SETB TR1
;-----------------------------------------------------
;取功能键


KEYBOAR:

	MOV A,#17H;显示欢迎界面hello
      	MOV 37H,A
      	MOV A,#18H
      	MOV 36H,A
      	MOV A,#19H
      	MOV 35H,A
      	MOV A,#19H
      	MOV 34H,A
      	MOV A,#1AH
      	MOV 33H,A
      	MOV A,#00H
      	MOV 32H,A
      	MOV A,#00H
      	MOV 31H,A
      	MOV A,#12H
      	MOV 30H,A
	LCALL DISP_NUM
;----------------------------------------------------------
;输入命令:1 2 3 4 5

FOR:	MOV DPTR,#Z8279;中断返回就在这里
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ KEYBOAR
    
    	MOV DPTR,#D8279
    	MOVX A,@DPTR	
	CJNE A,#02H,GOON;若A=2,则转到二号功能区接收+回复

	MOV 30H,#02H;显示选择的是二号
	LCALL DISP_NUM
	AJMP GOOON
GOON:	CJNE A,#01H,KEYBOAR1;
	MOV 30H,#01H;显示选择的是一号
	LCALL DISP_NUM

	AJMP KEYBOARD;若是1,跳到一号功能区
KEYBOAR1: CJNE A,#03H,KEYBOAR2;
	MOV 30H,#03H;显示选择的是三号
	LCALL DISP_NUM

	AJMP LO
KEYBOAR2: CJNE A,#04H,KEYBOAR3;若是4,跳到四号功能区
	MOV 30H,#04H;显示选择的是四号
	LCALL DISP_NUM
	AJMP NUM4
KEYBOAR3: CJNE A,#05H,KEYBOAR;若是5,进入五号功能区

;----------------------------------------------------------
;五号功能区
	MOV 30H,#05H;显示选择的是五号
	LCALL DISP_NUM

NUM5:	MOV 37H,#13H;初始化显示区域
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H

	MOV DPTR,#Z8279;输入秒数
    	MOVX A,@DPTR
    	ANL A,#0FH
	JZ NUM5
	MOV DPTR,#D8279
    	MOVX A,@DPTR
	
	MOV R3,A;保存秒数
	MOV R6,#14H;1秒的中断次数
	MOV 30H,A
	LCALL DISP_NUM

	MOV R1,#30H
	MOV R4,R1
	MOV R0,#00H
NNN:	MOV DPTR,#Z8279;输入数据
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ NNN
	    	
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
	CJNE A,#05H,MM;若A=5则启动发送
	MOV A,#03H;先发送标志位,来控制接收端的状态(与3号功能是同一段程序)
	MOV SBUF,A
	JNB TI,$
	CLR TI

	MOV	47H,37H
	MOV	46H,36H
	MOV  	45H,35H
	MOV	44H,34H
	MOV	43H,33H
	MOV 	42H,32H
	MOV	41H,31H
	MOV	40H,30H

	MOV TH0,#9CH;计数初值
        MOV TL0,#0B0H

	SETB EA
	SETB ET0
	SETB TR0;启动定时器
	LJMP FOR;返回等待中断

MM:
	MOV @R1,A;把数据存入显示单元
	INC R1
	INC R0
	LCALL DISP_NUM
	AJMP NNN
;中断处理程序
BREAK:	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,R3
	
	DEC R6
	CJNE R6,#00H,RETURN;
	DEC R3;秒数减一
	CJNE R3,#00H,FF
	
	CLR TR0
	MOV A,R0
	MOV SBUF,A;先发送数据个数
	JNB TI,$
	CLR TI
	MOV R1,#40H
LOO3:
		
	MOV A,@R1
	MOV SBUF,A
	JNB TI,$
	CLR TI
	INC R1
	DJNZ R0,LOO3
	
	AJMP RETURN

FF:   
	LCALL DISP_NUM;显示倒计时

RETURN:
	MOV TH0,#3CH;
        MOV TL0,#0B0H;
        RETI
	
;---------------------------------------------------------
;四号功能区,成组发送,第二次按4则启动发送
NUM4:	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H

	MOV R1,#30H
	MOV R4,R1
	MOV R0,#00H
LOOOO:	MOV DPTR,#Z8279
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ LOOOO
    	
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
	CJNE A,#04H,NEE;若A=4则启动发送
	MOV A,#03H;先发送标志位,来控制接收端的状态(与3号功能是同一段程序)
	MOV SBUF,A
	JNB TI,$
	CLR TI


    	MOV A,R0
	MOV SBUF,A;先发送数据个数
	JNB TI,$
	CLR TI
	MOV R1,R4
LOO1:
		
	MOV A,@R1
	MOV SBUF,A
	JNB TI,$
	CLR TI
	INC R1
	DJNZ R0,LOO1
	
	AJMP KEYBOAR
NEE:
	MOV @R1,A;把数据存入显示单元
	INC R1
	INC R0
	LCALL DISP_NUM
	AJMP LOOOO
;-------------------------------------------------------
;3号功能区,指定地址个数
LO:	MOV A,#03H;先发送一个数字3,作为接收端的标志
	MOV SBUF,A
	JNB TI,$
	CLR TI
	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H
	
	MOV R1,#33H

LOO:	MOV DPTR,#Z8279
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ LOO
    
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
	MOV @R1,A;把数据存入显示单元
	LCALL DISP_NUM
	MOV A,R1
	DEC R1
	CJNE A,#30H,LOO;要输入四个数字:首址+个数
	
	MOV A,31H
	SWAP A;左移四位与30H相加得到个数
	ADD A,30H
	MOV R0,A
	MOV A,33H
	SWAP A;33H左移四位与32H相加得到首址(限于内部数据区)
	ADD A,32H
	MOV R1,A
	MOV R4,A
	LCALL SEND;启动发送
	LJMP KEYBOAR

;--------------------------------------------------------------
;1号功能区
KEYBOARD:
	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H

    	MOV DPTR,#Z8279
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ KEYBOARD
    
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
     	CJNE A,#01H,NEXT111;若第二次按下1键,则停止该模式的发送
     
	AJMP KEYBOAR
NEXT111:
    
    
    	MOV 37H,36H
    	MOV 36H,35H
    	MOV 35H,34H
    	MOV 34H,33H
    	MOV 33H,32H
    	MOV 32H,31H
    	MOV 31H,30H
    	MOV 30H,A
    	MOV   SBUF,A
       	JNB   TI,$           ;等待发送结束
       	CLR   TI  
	
  	LCALL DISP_NUM
	KKK:AJMP KEYBOARD

;-------------------------------------------------
;2号功能区,接受+回复
GOOON:
	MOV A,#02H;先发送一个控制接收方式的的标志位
	MOV SBUF,A
	JNB TI,$
	CLR TI

	MOV A,#23H;先发送一个允许继续发送的标志
	MOV SBUF,A
	JNB TI,$
	CLR TI
SENDD:  
	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H

	MOV R1,#30H
	MOV R4,R1;R4保存首址
	MOV R0,#00H
LOOOOO:	MOV DPTR,#Z8279
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ LOOOOO
    	
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
	
	CJNE A,#02H,NET;若A=2则启动发送
	LCALL SEND;发送完自动转入接收状态
	AJMP RELOOP

NET:
	MOV @R1,A;把数据存入显示单元
	INC R1
	INC R0
	LCALL DISP_NUM
	AJMP LOOOOO
        
RELOOP:	JNB RI,$
	CLR RI
	MOV A,SBUF
	CJNE A,#23H,KKK;若不是23则返回初始状态

	JNB RI,$
	CLR RI
	MOV A,SBUF
	MOV R0,A;数据个数存在R0
	MOV R1,#30H
	
	MOV 37H,#13H
	MOV 36H,#13H
	MOV 34H,#13H
	MOV 35H,#13H
	MOV 33H,#13H
	MOV 32H,#13H
	MOV 31H,#13H
	MOV 30H,#13H

L0: 	NOP
	JNB RI,$
	CLR RI
	MOV A,SBUF
    	MOV @R1,A
	INC R1
	DJNZ R0,L0
 	LCALL DISP_NUM

CH1:	MOV DPTR,#Z8279
    	MOVX A,@DPTR
    	ANL A,#0FH
    	JZ CH1
    	
    	MOV DPTR,#D8279
    	MOVX A,@DPTR
	CJNE A,#02H,CH2;若A=2则启动回复
	MOV A,#23H
	MOV SBUF,A
	JNB TI,$
	CLR TI
	AJMP SENDD

CH2:	MOV A,#22H
	MOV SBUF,A
	JNB TI,$
	CLR TI
	AJMP KEYBOAR;若输入的不是2,发送22,转入初始状态
;---------------------------------------------
SEND:  MOV A,R0
	MOV SBUF,A;先发送数据个数
	JNB TI,$
	CLR TI
	MOV R1,R4;首地址送R1
LOOO:
	MOV A,@R1
	MOV SBUF,A
	JNB TI,$
	CLR TI
	INC R1
	DJNZ R0,LOOO
	RET
;--------------------------------------------
INIT_CPU:
      	MOV A,#00H;
      	MOV R0,#30H
      	MOV R2,#08H
INIT_CPU1:
      	MOV @R0,A
      	INC R0
      	DJNZ R2,INIT_CPU1
      	RET
;---------------------------------------------
INIT8279:
      	MOV DPTR,#Z8279
      	MOV A,#LEDCLS
      	MOVX @DPTR,A
INIT82791:
      	MOVX A,@DPTR
      	JB ACC.7,INIT82791
      	MOV A,#LEDMOD
      	MOVX @DPTR,A
      	MOV A,#LEDFEQ 
      	MOVX @DPTR,A
      	MOV A,#LEDWRO
      	MOVX @DPTR,A
      	RET
;-------------------------------------------------
;SHOW
;ENTRANCE 30H-37H FROM THE RIGHT SIDE TO THE LEFT SIDE
DISP_NUM:
      	MOV DPTR,#D8279
      	MOV R0,#30H
      	MOV R2,#08H
DISP_NUM1:
      	MOV A,@R0
      	MOV DPTR,#LEDSEG
      	MOVC A,@A+DPTR
      	MOV DPTR,#D8279
      	MOVX @DPTR,A
      	INC R0
      	DJNZ R2,DISP_NUM1
      	RET
;-------------------------------------------------
;SHOWSEG LIST
LEDSEG: DB 3FH,06H,5BH,4FH,66H;0,1,2,3,4
        DB 6DH,7DH,07H,7FH,6FH,77h;5,6,7,8,9
        DB 7CH,39H,5EH,79H,71H;A--F
        DB 3EH,40H,08H,00H,30H,3FH,73H;10H~16H
	DB 0F6H,0F9H,38H,3FH;HEL0  17H~~1AH
        END
;-----------------------------------------------
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -