1、新建项目,做好准备。
2、数码管段选表。
3、延时函数。
4、uchar i变量i;wk = 1打开位选,P0 = 0xf71111 0111第4位数码管显示,wk = 0关闭位选。
5、while(1) //死循环效果{} 。
6、dk = 1 //打开段选,P0 = leddata[i],dk = 0 //关闭段选,delay(100)//延时效果。
7、选择效果,限制i值的循环范围。
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)