背景:
最近在回顾51单片机相关基础知识,看了几本书,总是有种蜻蜓点水的感觉,一开始也是用C51写几个程序,又感觉不能找到单片机的感觉,觉得还是在写PC版本的程序。后来仔细想想,还是有必要用汇编直写程序,因为汇编更能体验控制硬件的过程,才能找到与单片机亲密接触的感觉,更能深入了解单片机的每一部分,更灵活地掌控它,为后面编写复杂的程序奠定基础。
后来在网上发现《单片机C语言程序设计实训100例基于8051+Proteus仿真》发布的Proteus仿真文件,正好可以拿这些仿真练手,将它用C写的效果,通过汇编语言实现,自我感觉主意不错,马上行动,即开始了这一系列之旅……
入正题:
题目描述:用程序实现一个7段数码管(共阴极)循环显示0~F这16个数字(16进制),Proteus仿真图如下所示:
由上图易看出通过P0口来控制数码管,数码管为共阴极,低电平亮。
代码文件main.asm
;; 单个数码管循环显示0~F数字
ORG 000H
START:
MOV R4,#0 ;循环显示10次
LOOP: ;循环显示数字,R4递增
MOV A,R4
MOV DPTR,#NTABLE
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY
INC R4
CJNE R4,#16,LOOP ;R4递增到16时结束循环
JMP START
;; 数码管显示编码表
NTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,76H
DELAY: ;延时500ms
MOV R1,#50
D1: MOV R2,#20
D2: MOV R3,#248
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
END
注:
1)此汇编程序涉及到延时小程序,以及MOV,MOVC,CJNE以及数据表的用法 ,注意体会汇编的思想方式,以及运行过程。
2)通过Keil编译生成Hex文件,并在Proteus里让51单片机读取到,运行仿真即可看到循环显示0~F的效果,相关代码和Proteus文件请下载相关附件。
另附上7段数码管共阴和共阳的两种编码:
单片机LED共阳极段码表【0-F】
DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H ;[0-7]
DB 80H,90H,88H,83H,0c6H,0a1H,86H,8eH ;[8-F]
单片机LED共阴极段码表【0-F】
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;[0-7]
DB 7FH,6FH ,77H,7CH,39H,5EH,79H,71H,76H ;[8-F]