六位8段数码管(共阴极)动态显示“123456”
2022-04-19,51单片机学习笔记
硬件连接图如下:
代码如下:
;适用于51单片机开发板,数码管动态扫描显示“123456”
;P0--连接两个锁存器数据输入端口,两个锁存器输出端口分别连接数码管段显和位显
;P2.6--段显控制信号,P2.7--位显控制信号,连接对应锁存器,作为片选信号
ADDR_SEG BIT P2.6 ;段显锁存器片选信号
ADDR_BIT BIT P2.7 ;位显锁存器片选信号
ORG 0000H ;程序起始地址
LJMP MAIN ;跳转到主函数
ORG 0030H ;主函数起始地址
MAIN:
MOV 70H,#6 ;在70H~75H这段地址空间存放字形编码索引
MOV 71H,#5 ;高位地址存放高位数据,当前显示效果为‘123456’
MOV 72H,#4 ;显示内容 “0 1 2 3 4 5 6 7 8 9 A b C d E F . 空”
MOV 73H,#3 ;10进制索引“0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17”
MOV 74H,#2 ;16进制索引“0 1 2 3 4 5 6 7 8 9 0A 0B 0C 0D 0E 0F 10 11”
MOV 75H,#1
MOV R0,#70H ;初始化为 段显数据首地址
MOV R2,#0DFH ;初始化为 1101 1111B ,为0时点亮
LP:
MOV A,R2 ;送入当前位显
MOV P0,A ;选中位使能
SETB ADDR_BIT ;位显有效
CLR ADDR_BIT ;位显锁定
RR A ;位显循环右移一位(便于下一位使能)
MOV R2,A ;存放当前位显
MOV DPTR,#TAB ;送入段显数据表的首地址
MOV A,@R0 ;段显编码偏移地址索引
MOVC A,@A+DPTR ;段显编码物理地址索引
MOV P0,A ;选中段使能
SETB ADDR_SEG ;段显有效
CLR ADDR_SEG ;段显锁定
ACALL DELAY ;延时
INC R0 ;段显数据地址更新,准备下一个段显内容
CJNE R0,#76H,LP ;若段显地址没有溢出,本次扫描没有结束(还没有到最低位数码管),跳转到LP,继续扫描下一位数码管
MOV R0,#70H ;否则,重新装载段显数据首地址
MOV R2,#0DFH ;重新装载位显数据首地址(返回最高位的数码管)
SJMP LP ;返回LP,进入下一次扫描
DELAY: ;当前调用一次延时2ms
MOV R6,#4 ;Delay=4*250*2us=2000us=2ms
DP1:MOV R7,#250 ;
DJNZ R7,$ ;f=12MHz, T=1/f=1us, delta t(DJNZ)=2*T=2 us
DJNZ R6,DP1 ;DJNZ执行一次占用2个指令周期,f=12M时,指令周期T=1us
RET
TAB: ;8段共阴极数码管字形编码表 00H~11H(0~17)共18个字形
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH ;0 1 2 3 4 5
DB 7DH, 07H, 7FH, 6FH, 77H, 7CH ;6 7 8 9 A b
DB 39H, 5EH, 79H, 71H, 80H, 00H ;C d E F dp 无
END
写在最后:
本文仅为个人学习笔记,纰漏之处,欢迎斧正!