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