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

📄 led.asm

📁 LED动态扫描.采用74164做为显示数据输出,使I/O口减少至两个,并且可做为驱动,是小系统LED显示的最佳方法
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;		串行口传输通用显示程序
;;		版本:	V1.0
;;		作者:	朱勇士
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SIM		equ	0 		;条件汇编(0=实际,1=模拟)

;;;;;;;;;;;;;;;;;;;;;;;;;常数定义;;;;;;;;;;;;;;;;;;;;;;;;;;
SP_INI		equ	30H		;堆栈起始指针
TIME_SET	equ	21H		;设置定时器1为常数自动装入的8位定时器
					;设置定时器0为16位定时器
TIME0H		EQU	0F4H
TIME0L		EQU	047H		;12MHz,3mS

;;;;;;;;;;;;;;;;;;;;;;;;;内存定义;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP_BUF3	equ	7FH		;显示缓冲区3
DISP_BUF2	equ	7EH		;显示缓冲区2
DISP_BUF1	equ	7DH		;显示缓冲区1
DISP_BUF0	equ	7CH		;显示缓冲区0
LED_COM		equ	7BH		;段选通寄存器(0:小数位,1:个位,2:十位,3:百位)

;;;;;;;;;;;;;;;;;;;;;;;;;位定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;I/0口定义;;;;;;;;;;;;;;;;;;;;;;;;;
LED3		bit	P1.2		;百位
LED2		bit	P1.4		;十位
LED1		bit	P1.3		;个位
LED0		bit	P1.5		;小数位

LED_CLK		bit	P3.0		;LED时钟口
LED_DATA	bit	P3.1		;LED数据口

;;;;;;;;;;;;;;;;;;;;;;;中断向量表;;;;;;;;;;;;;;;;;;;;;;;;
ORG	00H
SJMP	BEGIN

ORG	03H
RETI					;外部中断0

ORG	0BH
LJMP	CTC0_PRG			;定时器T0

ORG	13H
RETI					;外部中断1

ORG	1BH
RETI					;定时器T1

ORG	23H
RETI					;串行口中断

ORG	2BH
RETI					;定时器T2

ORG	030H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化;;;;;;;;;;;;;;;;;;;;;;;
BEGIN:
CLR	A
MOV	SP,#SP_INI			;置堆栈指针
MOV	IE,A				;禁止全部中断
MOV	PSW,A				;
MOV	TCON,A
MOV	TMOD,#TIME_SET
MOV	TH0,#TIME0H
MOV	TL0,#TIME0L
MOV	IP,#00001000B			;定时器1为最高优先级

SETB	ET0				;开定时器0中断
SETB	TR0				;运行定时器0
SETB	EA				;开中断

SJMP	$				;等待中断响应

;;;;;;;;;;;;;;;;;;;;定时中断程序(主程序);;;;;;;;;;;;;;;;;;;
CTC0_PRG:
MOV	TL0,#TIME0L			;装入定时常数
MOV	TH0,#TIME0H

MOV	R3,#1
MOV	R2,#1
ACALL	S_DATA				;显示前的数据处理,并发送到显示缓冲区
ACALL	S_DISP				;显示

RETI


;**********************************************************
;;;;;;;;;;;;;;;;;;;;;;显示数据处理;;;;;;;;;;;;;;;;;;;;;;;;;
;;入口:	R3R2()
;;出口:	DISP_BUF3-0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S_DATA:
MOV	DPTR,#LED_CODE
MOV	A,R3
ANL	A,#0F0H
SWAP	A
MOVC	A,@A+DPTR
MOV	DISP_BUF3,A

MOV	A,R3
ANL	A,#0FH
MOVC	A,@A+DPTR
MOV	DISP_BUF2,A

MOV	A,R2
ANL	A,#0F0H
SWAP	A
MOVC	A,@A+DPTR
MOV	DISP_BUF1,A

MOV	A,R2
ANL	A,#0FH
MOVC	A,@A+DPTR
MOV	DISP_BUF0,A
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;入口:	DISP_BUF(7FH,7EH,7DH)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
S_DISP:
MOV	A,LED_COM
JNZ	S_DISP1				;不是小数位,转
SETB	LED3
SETB	LED2
SETB	LED1
SETB	LED0				;开小数位
MOV	A,DISP_BUF0			;取出小数位数据
ACALL	SERIAL_OUT			;串行输出
SETB	LED3
SETB	LED2
SETB	LED1
CLR	LED0				;开小数位
INC	LED_COM				;段位指向十位
RET

S_DISP1:
CJNE	A,#1,S_DISP2			;不是个位,转
SETB	LED3
SETB	LED2
SETB	LED1				;开个位
SETB	LED0
MOV	A,DISP_BUF1			;取出个位数据
ACALL	SERIAL_OUT			;串行输出
SETB	LED3
SETB	LED2
CLR	LED1
SETB	LED0				;开小数位
INC	LED_COM				;段位指向十位
RET

S_DISP2:
CJNE	A,#2,S_DISP3			;不是十位,转
SETB	LED3
SETB	LED2				;开十位
SETB	LED1
SETB	LED0
MOV	A,DISP_BUF2			;取出十位数据
ACALL	SERIAL_OUT			;串行输出
SETB	LED3
CLR	LED2
SETB	LED1
SETB	LED0				;开小数位
INC	LED_COM				;段位指向十位
RET

S_DISP3:
CJNE	A,#3,S_DISP4			;不是百位,转
SETB	LED3				;开百位
SETB	LED2
SETB	LED1
SETB	LED0
MOV	A,DISP_BUF3			;取出百位数据
ACALL	SERIAL_OUT			;串行输出
CLR	LED3
SETB	LED2
SETB	LED1
SETB	LED0				;开小数位

S_DISP4:
MOV	LED_COM,#0			;段位指向小数位
RET

;;;;;;;;;;;;;;;;;显示数据串行输出处理;;;;;;;;;;;;;;;;;;;;;;
;;入口:	A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SERIAL_OUT:
CLR	C
MOV	R7,#8
SERIAL_OUT1:
RLC	A
CLR	LED_CLK
MOV	LED_DATA,C
SETB	LED_CLK
DJNZ	R7,SERIAL_OUT1
RET


LED_CODE:				;不带小数点
DB	077H				;0
DB	041H				;1
DB	03BH				;2
DB	06BH				;3
DB	04DH				;4
DB	06EH				;5
DB	07EH				;6
DB	047H				;7
DB	07FH				;8
DB	06FH				;9
DB	05FH				;A
DB	07DH				;B
DB	036H				;C
DB	079H				;D
DB	03EH				;E
DB	01EH				;F
DB	008H				;-
DB	000H				;无

LED_CODE1:				;带小数点
DB	0F7H				;0.
DB	0C1H				;1.
DB	0BBH				;2.
DB	0EBH				;3.
DB	0CDH				;4.
DB	0EEH				;5.
DB	0FEH				;6.
DB	0C7H				;7.
DB	0FFH				;8.
DB	0EFH				;9.
DB	088H				;-
DB	000H				;无

END

⌨️ 快捷键说明

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