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

📄 up51s004.asm

📁 数码管显示
💻 ASM
字号:
;/*******************************************************************************
;*                                                                              *
;*    File       : uP51s004.asm                                                 *
;*    Date       : 2004-9-5                                                     *
;*    Version    : 1.0                                                          *
;*                                                                              *
;*    Author     : kevin           kevin@dz51.com                               *
;*    Company    : Http://www.dz51.com                                          *
;*                                                                              *
;********************************************************************************
;*    Description:                                                              *
;*                 LED数码管显示演示程序                                        *
;*                 在8个LED数码管上依次显示1,2,3,4                              *
;*                                                                              *
;*                                                                              *
;*                                                                              *
;*******************************************************************************/
CODE_SEG	SEGMENT	CODE 

DATA_SEG	SEGMENT	DATA 

	RSEG  DATA_SEG
	
dis_digit:	DS		1
dis_index:	DS		1
dis_buf:	DS		4
stack:		DS		20

;===========================================================

CSEG	AT	00000H				; Reset向量
	LJMP	MAIN

CSEG	AT	0000BH				; 定时器0中断向量

	LJMP	TIMER0


;===========================================================
	RSEG  CODE_SEG	
MAIN:
	MOV	SP,#(stack-1)			; 初始化堆栈指针
	MOV  	P0,#0FFH			; 初始化I/O口
	MOV  	P2,#0FFH
	MOV  	TMOD,#01H			; 初始化timer0
	MOV  	TH0,#0FCH
	MOV  	TL0,#017H
	MOV  	IE,#082H

	MOV	DPTR, #DIS_CODE		; 设定显示初值
	MOV	A,#2
	MOVC	A,@A+DPTR
	MOV  	dis_buf,A
	MOV	A,#3
	MOVC	A,@A+DPTR    
	MOV  	dis_buf+01H,A
	MOV	A,#4
	MOVC	A,@A+DPTR   
	MOV  	dis_buf+02H,A 
	MOV	A,#1
	MOVC	A,@A+DPTR
	MOV  	dis_buf+03H,A  
	MOV	A,#10      
	MOVC	A,@A+DPTR

	MOV  	dis_digit,#0FEH		; 初始从第一个数码管开始扫描
	MOV  	dis_index,A

	SETB 	TR0					; 启动定时器0,开始动态扫描显示

MAIN_LP:					

	; 主程序循环,增加其它代码				

	SJMP 	MAIN_LP

; END OF main


;===========================================================

	USING	0
TIMER0:
; 定时器0中断服程序, 用于数码管的动态扫描
; DIS_INDEX --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
; DIS_DIGIT --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
;		选通P2.0口数码管
; DIS_BUF   --- 显于缓冲区基地址		

	PUSH 	ACC
	PUSH 	PSW
	PUSH 	AR0
	
	MOV  	TH0,#0FCH
	MOV  	TL0,#017H
	
	MOV  	P2,#0FFH		; 先关闭所有数码管
	
	MOV  	A,#DIS_BUF		; 获得显示缓冲区基地址
	ADD  	A,DIS_INDEX		; 获得偏移量
	MOV  	R0,A			; R0 = 基地址 + 偏移量
	MOV  	A,@R0			; 获得显示代码
	MOV  	P0,A			; 显示代码传送到P0口
	
	MOV  	P2,DIS_DIGIT		; 

	MOV	A,DIS_DIGIT		; 位选通值左移, 下次中断时选通下一位数码管
	RL	A
	MOV	DIS_DIGIT,A
	
	INC	DIS_INDEX		; DIS_INDEX加1, 下次中断时显示下一位
	ANL	DIS_INDEX,#0x03		; 当DIS_INDEX等于8(0000 1000)时, 清0

	POP  	AR0
	POP  	PSW
	POP  	ACC
	
	RETI 
; END OF timer0
;===========================================================

	RSEG  CODE_SEG
DIS_CODE:
	DB	0C0H    ;1
	DB	0F9H    ;2
	DB	0A4H    ;3
	DB	0B0H    ;4
	DB	099H    ;4
	DB	092H    ;5
	DB	082H    ;6
	DB	0F8H    ;7
	DB	080H    ;8
	DB	090H    ;9
	DB	0FFH    ;off

	END

⌨️ 快捷键说明

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