📄 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 + -