单片机怎么控制led数码管?

如题所述

1、 数码管显示演示程序: 在8个LED数码管上依次显示1,2,3,4,5,6,7,8。引用端口:数码管数据p0,数码管控制p2;

DIS_DIGIT EQU   40H
;位选通值, 传送到P2口用于选通当前数码管的数值,
; 如等于0xfe时, 选通P2.0口数码管
DIS_INDEX DATA   41H
;显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
DIS_BUF DATA   50H
;显于缓冲区起始地址
ORG  0000H
AJMP   MAIN
ORG   000BH
AJMP  INTT0
ORG   0100H
MAIN:MOV  P0,#0FFH; 初始化I/O口
MOV  P2,#0FFH
MOV   TMOD, #02H;定时器0在模式2下工作 
MOV   TL0, #38H; 每200μs产生一次溢出
MOV   TH0, #38H;自动重装初值
SETB   ET0 ;使能定时器0中断
SETB  TR0;启动定时
SETB  EA ;使能总中断
MOVDPTR, #DIS_CODE; 设定显示初值为1-8
MOVA,#1;初值为1,以后顺序加1
MOVC A,@A+DPTR
MOV  DIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOV  DIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOV  DIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOV  DIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOV  DIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOV  DIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOV  DIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOV  DIS_BUF+07H,A
DISPLAY:MOV  DIS_DIGIT,#0FEH; 初始从第一个数码管开始扫描
MOV  DIS_INDEX,#0
SETB TR0; 启动定时器0,开始动态扫描显示
MAIN_LP:NOP
; 主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容
SJMP MAIN_LP
;=====================================================
INTT0:
; 定时器0中断服程序, 用于数码管的动态扫描

PUSH ACC
PUSH PSW
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; 
MOVA,DIS_DIGIT
; 位选通值左移, 下次中断时选通下一位数码管
RL    A
MOVDIS_DIGIT,A
INCDIS_INDEX
; DIS_INDEX加1, 下次中断时显示下一位
ANLDIS_INDEX,#0x07
; 当DIS_INDEX等于8(0000 1000B)时, 清0
POP  PSW
POP  ACC
RETI 
DIS_CODE: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB 20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的数码管显示代码
 
END

温馨提示:答案为网友推荐,仅供参考
相似回答