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

📄 ps2.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
字号:
;PS2

C8279	EQU	0F239H				;8279命令口
D8279	EQU	0F238H				;8279数据口
DAT		EQU	P1.1				;数据串口
CLOCK	EQU	P1.0				;时钟脉冲

		ORG 	0000H
		LJMP	MAIN	
	
MAIN:	MOV		SP,#20H			;堆栈设置
		LCALL	INIT8279	 	;8279初始化
		LCALL	INT0			;内存初始化
MAIN1:	LCALL	DIS0			;等待显示
		LCALL	READDATA		;读取键码
		JNB		01H,MAIN2
		LCALL	DIS10			;十位键码显示
		SJMP	MAIN4
MAIN2:	JNB		02H,MAIN3
		LCALL	DIS5			;五位键码显示
		SJMP	MAIN4
MAIN3:	LCALL	DISP			;显示
MAIN4:	LCALL	DELAY			;延时
		SJMP	MAIN1
		
;8279初始化子程序
INIT8279:                       
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        MOV    DPTR,#C8279
        MOV    A,#00H		    ;置8279工作方式
        MOVX   @DPTR,A
        MOV    A,#2FH	        ;置键盘扫描速率
        MOVX   @DPTR,A
        MOV    A,#0C1H	        ;清除 LED 显示
        MOVX   @DPTR,A
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET	
        
;内存单元初始化       
INT0:	
		MOV		R0,#30H			;存储单元设初值
		MOV		R7,#30H
		MOV		A,#00H
IN00:	MOV		@R0,A		
		INC		R0
		DJNZ	R7,IN00
		MOV		56H,#11H		;初始显示送显示缓冲区
		MOV		57H,#11H
		MOV		55H,#11H
		MOV		54H,#11H
		MOV		53H,#11H
		MOV		52H,#11H
		MOV		51H,#11H
		MOV		50H,#11H
		RET

;读键码子程序	
READDATA:	
		MOV		R7,#00H			;数据信号‘1’计数器
		CLR		00H				;清出错标志	
		CLR		01H				;十位键码显示标志
		CLR		02H				;五位键码显示标志
		MOV		R0,#30H	
		LCALL	READ			;读取第一个键码
		JB		00H,DATERR		;判是否出错?	
		MOV		A,30H
		CJNE	A,#0E0H,PDATA1	;判第一个键码是否为“E0”?
		SJMP	DATA50
DATERR:	LJMP	DATERROR	
PDATA1:	CJNE	A,#0E1H,DATA3	;判第一个键码是否为“E1”?
		MOV		R3,#07H			;读取“PAUSE”键的情况
		MOV		R0,#31H
		MOV		R7,#00H
		SJMP	DATA2		
DATA50:
		MOV		R0,#31H
		MOV		R7,#00H
		LCALL	READ			;读取第二个键码
		JB		00H,DATERROR	;判是否出错?
		MOV		A,31H
		CJNE	A,#12H,DATA5	;判第二个键码是否为“12”?		
		MOV		R3,#08H			;读取“PRNT SCRN”的情况
		MOV		R0,#32H
		MOV		R7,#00H	
		SJMP	DATA2
DATA5:
		MOV		R3,#03H			;读取五个键码的情况
		MOV		R0,#32H
		MOV		R7,#00H
		SJMP	DATA2				
DATA3:
		MOV		R3,#02H			;读取三个键码的情况
		MOV		R0,#31H
		MOV		R7,#00H
DATA2:
		LCALL	READ
		JB		00H,DATERROR	;读键码	
		INC		R0
		MOV		R7,#00H	
		DJNZ	R3,DATA2		
		MOV		A,30H
		CJNE	A,#0E1H,STATUS0	;判第一个键码是否为“E1”?		
		LCALL	PAUSEBREAK		;"PAUSE"键显示处理
		SJMP	RETEND		
STATUS0:CJNE	A,#0E0H,STATUS1	;判第一个键码是否为“E0”?		
		MOV		A,31H
		CJNE	A,#12H,STATUS2	;判第二个键码是否为“12”?
		LCALL	PRNTSCRN		;"PRNT SCRN"键显示处理
		SJMP	RETEND
STATUS1:LCALL	DATA3CODE		;三个键码显示处理
		SJMP	RETEND
STATUS2:LCALL	DATA5CODE		;五个键码显示处理
		SJMP	RETEND
DATERROR:						;出错显示‘ERROR’
		MOV		52H,#0EH
		MOV		53H,#0AH
		MOV		54H,#0AH
		MOV		55H,#00H
		MOV		56H,#0AH			
RETEND:	RET

;三个键码显示处理			
DATA3CODE:
		MOV		A,31H
		CJNE	A,#0F0H,DATERROR;判第二个键码是否为“F0”?
		MOV		A,30H
		XRL		A,32H
		JNZ		DATERROR		;判第一 、第三个键码是否相等
		MOV		R2,#03H
		MOV		R0,#30H
		MOV		R1,#50H		
		LCALL	DEAL			;显示处理
		RET

;五个键码显示处理				
DATA5CODE:
		MOV		R2,#05H
		MOV		R0,#30H
		MOV		R1,#50H
		LCALL	DEAL
		SETB	02H			;置标志
		RET

;“PAUSE”键显示处理
PAUSEBREAK:
		MOV		68H,#12H	;末尾显示“NONE”
		MOV		69H,#00H
		MOV		6AH,#12H
		MOV		6BH,#0EH
		MOV		6CH,#11H
		MOV		R2,#08H
		MOV		R0,#30H	
		MOV		R1,#50H
		SETB	01H			;置标志
		LCALL	DEAL
		RET	

;“PRNT SCRN”键显示处理		
PRNTSCRN:
		MOV		R2,#0AH		
		MOV		R0,#30H	
		MOV		R1,#50H
		SETB	01H			;置标志
		LCALL	DEAL
		RET	

;显示处理				
;R2键码个数
;R0键码存储单元
;R1显示缓冲区
DEAL:	MOV		A,@R0			;显示处理
		ANL		A,#0F0H
		SWAP	A
		MOV		@R1,A
		INC		R1
		MOV		A,@R0
		ANL		A,#0FH
		MOV		@R1,A
		INC		R1
		MOV		@R1,#11H
		INC		R1
		INC		R0
		DJNZ	R2,DEAL
		RET
		
;读取一个键码
;R0键码存储单元
;R7数据信号“1”计数器				
READ:	MOV		R2,#08H
		LCALL	TB10			;等待负跳变	
		MOV		C,DAT			;读起始位
		JC		READ			
READ0:	LCALL	TB10			;读取8位数据位
		MOV		C,DAT
		JNC		DATA0	
		INC		R7
DATA0:	MOV	 	A,@R0		
		RRC		A
		MOV		@R0,A
		DJNZ	R2,READ0
		
		LCALL	TB10
		MOV		C,DAT			;读校验位	
		MOV		A,#00H
		RLC		A
		MOV		B,A	
		MOV		A,R7
		ANL		A,#01H
		XRL		A,B
		JZ		ERROR			;奇校验
		LCALL	TB10			;读结束位
		JNB		DAT,ERROR
		RET		
ERROR:	SETB	00H				;置出错标志
		RET	
		
;十位键码动态显示处理
;R2迭代次数
;R6动态显示次数
;R0显示缓冲区
DIS10:
		MOV		R2,#1DH
		MOV		R6,#16H
		MOV		R0,#50H
DISPRINT0:
		LCALL	DISP			;显示
		LCALL   DELAY			;延时
DISPRINT1:						;显示缓冲区迭代
		INC		R0
		MOV		A,@R0
		DEC		R0
		MOV		@R0,A
		INC		R0
		DJNZ	R2,DISPRINT1
		MOV		R0,#50H
		MOV		R2,#1DH
		DJNZ	R6,DISPRINT0
		RET

;五位键码动态显示处理
;R2迭代次数
;R6动态显示次数
;R0显示缓冲区			
DIS5:	MOV		R2,#15H
		MOV		R6,#07H
		MOV		R0,#50H
DIS50:
		LCALL	DISP
		LCALL   DELAY
DIS51:		
		INC		R0
		MOV		A,@R0
		DEC		R0
		MOV		@R0,A
		INC		R0
		DJNZ	R2,DIS51
		MOV		R0,#50H
		MOV		R2,#15H
		DJNZ	R6,DIS50
		RET	

;刷新显示
DIS0:	MOV		57H,#11H		
		MOV		56H,#11H		
		MOV		55H,#11H
		MOV		54H,#11H
		MOV		53H,#11H
		MOV		52H,#11H
		MOV		50H,#11H
		MOV		51H,#11H
		LCALL	DISP
		RET		
		
;显示			
DISP:	PUSH	DPL				
		PUSH	DPH
		PUSH	PSW
		PUSH	ACC					
		MOV		R1,#50H
		MOV		R4,#07H
DIS1:
		MOV		A,@R1
		MOV		R5,A
		LCALL	DISLED
		INC		R1
		DEC		R4
		CJNE	R4,#0FFH,DIS1
		POP		ACC
		POP		PSW
		POP		DPH
		POP		DPL
		RET			

;显示字符子程序
DISLED:							
		PUSH	DPH
		PUSH	DPL
		PUSH	PSW
		PUSH	ACC
		MOV		A,#80H
		ADD		A,R4			;R4显示位置
		MOV		DPTR,#C8279
		MOVX	@DPTR,A
		MOV		DPTR,#LEDSEG
		MOV		A,R5			;R5显示数值
		MOVC	A,@A+DPTR
		MOV		DPTR,#D8279
		MOVX	@DPTR,A
		POP		ACC
		POP		PSW
		POP		DPL
		POP		DPH
		RET
		
;判负跳变子程序
TB10:	JB		CLOCK,TB100		
		SJMP	TB10
TB100:	JB		CLOCK,$
		RET	
			
;延时子程序		
DELAY:                          
        PUSH    2
        PUSH    1
        PUSH    0
        MOV		2,#05H
DELAY1: MOV     1,#00H
DELAY2: MOV     0,#0B2H
        DJNZ    0,$
        DJNZ    1,DELAY2        ;延时100mS
        DJNZ    2,DELAY1		;100ms*R2
        POP     0
        POP     1	
        POP     2
        RET		
		
LEDSEG:	DB	3FH,06H,5BH,4FH,66H,6DH,7DH,07H	;'0,1,2,3,4,5,6,7'
		DB	7FH,6FH,77H,7CH,39H,5EH,79H,71H	;'8,9,A,b,C,d,E,F'
		DB	00H,40H,37H			  			;' ,-,N' 		

		END

⌨️ 快捷键说明

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