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

📄 13简易秒表的制作.asm

📁 学习单片机的程序与电路
💻 ASM
字号:
		BANK0_REG	EQU	00H	;选择第0组寄存器
		BANK1_REG	EQU	08H	;选择第1组寄存器
		BANK2_REG	EQU	10H	;选择第2组寄存器
		BANK3_REG	EQU	18H	;选择第3组寄存器
		LED_MAX_BITS	EQU	06H	;LED最大位数
	
		LED_SCL		EQU	P1.0
		LED_SDA		EQU	P1.1
		HD_K1		EQU	P1.2
		HD_K2		EQU	P1.3
		HD_K3		EQU	P1.4
		HD_CBP		EQU	P1.5
		
		K1_FLAG		EQU	00H
		K2_FLAG		EQU	01H
		K3_FLAG		EQU	02H
		
		LED_DIS_BUF	EQU	30H
		
		ORG	0000H
		LJMP	START
		ORG	000BH
		LJMP	TIMER0_INT
START:
		MOV	SP,#0DFH
		MOV	PSW,#BANK0_REG
		MOV	TMOD,#01H		;定时器0方式1
		MOV	TH0,#0D8H		;定时器0置初值
		MOV	TL0,#0F0H
		
		MOV	R0,#30H
		MOV	R7,#80H-20H
		LCALL	PUB_CLEAR_RAM1		;清0RAM单元
		
		LCALL	LED_CLR_FULL
		LCALL	LED_DISP_DATA
START_A:
		LCALL	KEY_TEST
		JNC	START_A
RETEST:	
		LCALL	KEY_SCAN
		JB	K1_FLAG,PRO_K1
		JB	K2_FLAG,PRO_K2
		JB	K3_FLAG,PRO_K3
		SJMP	START_A
PRO_K1:						;启动
		SETB	TR0
		SETB	TR1
		SETB	ET0
		SETB	EA
		LJMP	START_A
PRO_K2:						;停止
		CLR	EA
		CLR	ET0
		CLR	TR1
		CLR	TR0
		LJMP	START_A
PRO_K3:						;清零
		CLR	EA
		LJMP	START
;---------------------------------------
;定时器0中断服务程序
;---------------------------------------
TIMER0_INT:	
		PUSH	PSW
		PUSH	ACC
		MOV	PSW,#BANK3_REG
		MOV	TH0,#0D8H
		MOV	TL0,#0F0H
		
		MOV	A,LED_DIS_BUF+2
		ADD	A,#1
		DA	A
		MOV	LED_DIS_BUF+2,A
		
		MOV	A,LED_DIS_BUF+1
		ADDC	A,#0
		DA	A
		MOV	LED_DIS_BUF+1,A
		CJNE	A,#60H,TIMER0_END
		MOV	LED_DIS_BUF+1,#00H
		
		MOV	A,LED_DIS_BUF
		ADD	A,#1
		DA	A
		MOV	LED_DIS_BUF,A
TIMER0_END:	
		LCALL	LED_DISP_DATA
		POP	ACC
		POP	PSW
		RETI
;--------------------------------------------------
;测键入子程序
;功能:判断是否有键输入
;入口:按键 
;出口:A
;--------------------------------------------------
KEY_TEST:
		JNB	P1.2,KEY_TEST_OK
		JNB	P1.3,KEY_TEST_OK
		JNB	P1.4,KEY_TEST_OK
		CLR	C
		RET
KEY_TEST_OK:
		SETB	C
		RET

;--------------------------------------------------
;键盘扫描程序
;--------------------------------------------------
KEY_SCAN:
		CLR	K1_FLAG
		CLR	K2_FLAG
		CLR	K3_FLAG
		
		JNB	P1.2,KEY_SCAN_K0
		JNB	P1.3,KEY_SCAN_K1
		JNB	P1.4,KEY_SCAN_K2
		SJMP	KEY_SCAN_END
KEY_SCAN_K0:
		SETB	K1_FLAG
		JNB	P1.2,$
		SJMP	KEY_SCAN_END
KEY_SCAN_K1:
		SETB	K2_FLAG
		JNB	P1.3,$
		SJMP	KEY_SCAN_END
KEY_SCAN_K2:
		SETB	K3_FLAG
		JNB	P1.4,$
		SJMP	KEY_SCAN_END
KEY_SCAN_END:
		RET
;------------------------------------
;清除指定的RAM单元
;入口:	R0:源地址 R7:长度
;------------------------------------
PUB_CLEAR_RAM1:
		CJNE 	R7,#0,PUB_CLEAR_RAM1_1
		SJMP 	PUB_CLEAR_RAM1_E
PUB_CLEAR_RAM1_1:
		MOV 	@R0,#0
		INC 	R0
		DJNZ 	R7,PUB_CLEAR_RAM1_1
PUB_CLEAR_RAM1_E:
		RET
;--------------------------------
;发送一字节数据
;入口:ACC
;--------------------------------
LED_DISP_BYTE:
		PUSH	ACC
		CLR	LED_SCL
		MOV	R7,#8
LED_DISP_BYTE1:	
		RLC	A
		MOV	LED_SDA,C
		NOP
		NOP
		SETB	LED_SCL
		NOP
		NOP
		CLR	LED_SCL
		DJNZ	R7,LED_DISP_BYTE1
		POP	ACC
		RET
;-----------------------------------
;发送LED_MAX_BIT字节
;入口:LED_DIS_BUF:起始地址
;-----------------------------------
LED_DISP_DATA:
		PUSH	PSW
		PUSH	ACC
		PUSH	DPH
		PUSH	DPL
		MOV	PSW,#BANK2_REG
		MOV	A,#LED_DIS_BUF
		ADD	A,#LED_MAX_BITS/2-1
		MOV	R0,A
		MOV	R6,#LED_MAX_BITS/2
		MOV	DPTR,#DIS_TAB
LED_DISP_DATA_A:
		MOV	A,@R0
		ANL	A,#0FH
		MOVC	A,@A+DPTR
		LCALL	LED_DISP_BYTE
		MOV	A,@R0
		SWAP	A
		ANL	A,#0FH
		MOVC	A,@A+DPTR
		LCALL	LED_DISP_BYTE
		DEC	R0
		DJNZ	R6,LED_DISP_DATA_A
		POP	DPL
		POP	DPH
		POP	ACC
		POP	PSW
		RET
;------------------------------------
;清除LED上的显示内容
;------------------------------------
LED_CLR_FULL:
		PUSH	PSW
		PUSH	ACC
		PUSH	DPH
		PUSH	DPL
		MOV	PSW,#BANK2_REG
		MOV	R6,#6
LED_CLR_A:
		MOV	A,#0FFH
		LCALL	LED_DISP_BYTE
		DJNZ	R6,LED_CLR_A
		POP	DPL
		POP	DPH
		POP	ACC
		POP	PSW
		RET
;----------------------------------------------------------------------
DIS_TAB:	;字形表
		DB	0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH	;共阳极LED
NOP9:
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		RET
	END

⌨️ 快捷键说明

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