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

📄 7289.asm

📁 达盛单片机试验箱
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************
;                 ZLG7289 测试演示程序					*
;********************************************************
;
KEY_CS  	BIT     P2.0				;低电平有效
KEY_DAT     BIT     P2.2
KEY_CLK     BIT     P2.1				;上升沿有效
KEY         BIT     P2.3				;低电平有效

KEY_VALUE	DATA    55H
PT			DATA	56H
BLINK		DATA	57H					;存放闪烁的位
DSBUF	  	DATA    58H					;显示缓冲区 58-5F
LAST_SEG	DATA	60H					;熄灭的段地址
SEG_NUM		DATA	61H					;点亮的段地址

TIME_RST	BIT		P1.4
TIME_IO		BIT		P1.3
TIME_SCLK	BIT		P1.2
TIME_REG	EQU		2EH					;读写DS1302时存放地址
TIME_DT		EQU		2FH					;读写DS1302时存放数据	

BUFF     	DATA    50H					;1% 秒缓冲区
SSBUF	  	DATA    51H					;秒缓冲区
MBUF	  	DATA    52H       	      	;分缓冲区
HBUF	  	DATA    53H					;时缓冲区
			ORG     0000H
			
RESET:		AJMP    START
;				
;********************************************************
;				/*主程序*/								*
;********************************************************
;
			ORG     0030H
;				
START:		MOV     SP,#07H
			MOV		P1,#11111111B
			MOV		P2,#11111111B
			MOV		P3,#11111111B

PRPT:		MOV     A,#10100100B 		;发送复位指令 0A4H(纯指令)
			CALL    KEY_SEND
			SETB    KEY_CS
			MOV		DSBUF+0,#1EH		;第1位显示 'P'
			MOV		DSBUF+1,#1FH		;第2位显示 ' '	
			MOV		DSBUF+2,#1FH		;第3位显示 ' '		
			MOV		DSBUF+3,#1FH		;第4位显示 ' '
			MOV		DSBUF+4,#1FH		;第5位显示 ' '
			MOV		DSBUF+5,#1FH		;第6位显示 ' '
			MOV		DSBUF+6,#1FH		;第7位显示 ' '
			MOV		DSBUF+7,#1FH		;第8位显示 ' '
			MOV		BLINK,#01111111B	;第1位闪烁
			MOV		PT,#DSBUF			;显示缓冲区指针

PRPT1:		CALL	DSUP
			JB		KEY,$				;是否有键按下
PRPT2:		CALL	KBS					;读键
			JC		PRPT3
			AJMP	MCMD				;功能键处理
PRPT3:		CALL	CHAG				;数据键处理
			DB	   	11111111B			;第8位显示 DSBUF+7
	   		DB	   	01111111B			;第1位显示 DSBUF
			SJMP	PRPT1
;			
;********************************************************
;			数据键处理子程序							*						
;********************************************************
;				
CHAG:	   	POP	   	DPH
		   	POP	   	DPL
		   	MOV		A,BLINK
	   		SETB	C
			RRC		A
			MOV		BLINK,A
			MOV		R0,PT
			MOV		@R0,KEY_VALUE
			INC		PT
		   	CLR		A
		   	MOVC    A,@A+DPTR
		   	CJNE    A,BLINK,CHAG2		;判断是否是最后一位
		   	INC	   	DPTR
		   	CLR	   	A
		   	MOVC    A,@A+DPTR
		   	MOV		BLINK,A				;是最后一位,BLINK赋初值
		   	MOV		PT,#DSBUF
CHAG1:	   	JNB     KEY,$				;按键是否释放
	   		INC	   	DPTR
	   		PUSH    DPL
	   		PUSH    DPH
	   		RET
CHAG2:	   	INC	   	DPTR
			SJMP    CHAG1
;			
;********************************************************
;		/*功能键处理子程序*/							*
;********************************************************
;
MCMD:		SUBB	A,#11H
			RL		A
			MOV		DPTR,#JPTB1
			JMP		@A+DPTR
JPTB1:		AJMP	PRPT				;11
			AJMP  	PRPT		  		;12
			AJMP  	PRPT		  		;13
			AJMP  	PRPT	  			;14
			AJMP  	PRPT		  		;15
			AJMP  	PRPT	  			;16
			AJMP  	PRPT		  		;17
			AJMP  	HIDE	  			;18
			AJMP  	CYCLED		  		;19
			AJMP	TEST				;1A
			AJMP	SEG_DEMO			;1B
			AJMP	DSTIME				;1C
			
			
;********************************************************
;				/*测试指令演示*/						*
;********************************************************

TEST:		MOV     A,#10111111B		;发送测试指令 BFH
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_3S			;延时
			JMP		PRPT
;		
;********************************************************
;             段寻址指令测试							*
; 点亮的显示段在8只数码管间做往复8字运动				*
;********************************************************
;
SEG_DEMO:	MOV		R3,#02
			MOV     A,#10100100B 		;发送复位指令 0A4H(纯指令)
			CALL    KEY_SEND
			SETB    KEY_CS
			MOV     LAST_SEG,#0FFH
SEG_DEMO1:  MOV     R4,#28				;循环一次共用28个显示段
SEG_LOOP:   MOV     A,R4
			MOV     DPTR,#SEGTB-1		;查表得显示段地址
			MOVC    A,@A+DPTR
			MOV     SEG_NUM,A
			MOV     A,#11100000B		;发段点亮指令点亮当前段
			CALL    KEY_SEND
			MOV     A,SEG_NUM			;发段地址
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL    DELAY_50MS		
			CALL    DELAY_50MS					
			MOV     A,#11000000B		;发段熄灭指令关闭上一显示段
			CALL    KEY_SEND
			MOV     A,LAST_SEG			;上一显示段的段地址
			CALL    KEY_SEND
			SETB	KEY_CS
			CALL    DELAY_50MS		
			MOV     LAST_SEG,SEG_NUM	;保存当前段地址	
			DJNZ    R4,SEG_LOOP			;显示下一显示段		
			DJNZ	R3,SEG_DEMO1
			AJMP	PRPT
;
;*******************************************************
;               循环左/右移测试						   * 		
; 显示缓冲区内容向右运动3次,再向左运动3次			   *
;*******************************************************
;		
CYCLED:		MOV     R4,#23           	;循环右移24次
CR_R:		MOV     A,#10100010B     	;循环右移指令
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			DJNZ    R4,CR_R
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			
			MOV     R4,#23          	;循环左移24次      
CR_L: 		MOV     A,#10100011B     	;循环左移指令
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			DJNZ    R4,CR_L
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			CALL    DELAY_50MS
			AJMP	PRPT			
;
;*******************************************************
;             消隐指令测试;1为显示,0为消隐			   *	
;*******************************************************
;
HIDE:		MOV		DSBUF+0,#00H		;第1位显示 '0'
			MOV		DSBUF+1,#01H		;第2位显示 '1'	
			MOV		DSBUF+2,#02H		;第3位显示 '2'		
			MOV		DSBUF+3,#03H		;第4位显示 '3'
			MOV		DSBUF+4,#04H		;第5位显示 '4'
			MOV		DSBUF+5,#05H		;第6位显示 '5'
			MOV		DSBUF+6,#06H		;第7位显示 '6'
			MOV		DSBUF+7,#07H		;第8位显示 '7'
			MOV		BLINK,#01111111B	;第1位闪烁
			MOV		PT,#DSBUF			;显示缓冲区指针
			CALL	DSUP
			MOV		A,#88H
			CALL	KEY_SEND
			MOV		A,#0FFH
			CALL	KEY_SEND
			SETB	KEY_CS
		
			CALL	DELAY_1S
HIDE1:		MOV     A,#10011000B     	;消隐控制指令98H
			CALL    KEY_SEND
			MOV     A,#11110111B     	;将第4位设为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#11100111B     	;增加第5位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#11100011B     	;增加第3位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#11000011B     	;增加第6位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#11000001B    	;增加第2位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令98H
			CALL    KEY_SEND
			MOV     A,#10000001B     	;增加第7位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令98H
			CALL    KEY_SEND
			MOV     A,#10000000B     	;增加第1位为消隐
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#10000001B     	;将第1位恢复显示
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#10011001B     	;将中间2位恢复显示
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#10111101B     	;将中间4位恢复显示
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
		
			MOV     A,#10011000B     	;消隐控制指令
			CALL    KEY_SEND
			MOV     A,#11111111B     	;全部恢复显示
			CALL    KEY_SEND
			SETB    KEY_CS
			CALL	DELAY_1S
			AJMP	PRPT		
;			
;********************************************************
;			7289 数据发送子程序							*
;********************************************************
;
KEY_SEND:  	PUSH	00H
			CLR     KEY_CS
			MOV     R0,#08H
			CALL    DELAY
KEY_SEND1:  RLC		A
			MOV		KEY_DAT,C
			SETB	KEY_CLK
			CALL	DELAY
			CLR		KEY_CLK
			CALL	DELAY
			DJNZ	R0,KEY_SEND1
			POP		00H
			RET
;			
;********************************************************
;			显示子程序									*
;********************************************************
;
DSUP:		CLR    	KEY_CS
			MOV		R0,#10000111B		;最高位开始放
			MOV		R1,#DSBUF		
			MOV		R7,#08H				;8个数码管
DSUP1:		CJNE	@R1,#10H,DSUP2		;判断显示缓冲区的内容是否大于10H
DSUP2:		JNC		DSUP3							
			MOV		A,R0				;小于10H是0~F中的数字
			ORL		A,#01001000B		;下载数据且按方式1译码
			CALL    KEY_SEND	
			MOV		A,@R1
			CALL    KEY_SEND

⌨️ 快捷键说明

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