51单片机汇编语言点亮一位数码管,并计时(超详细分析汇编语言)

如何用汇编语言点亮51单片机上的一位数码管,并让数码管重复计时呢?

数码管选用的是共阳极数码管(及给0就亮)电路如下

因为是共阳极数码管

比如我们要显示数值“0” ,那么在我们应该给ABCDEF 引脚置0 而G和DP(小数点)置1

即 在汇编语言上 这么写

MOV P2,#0C0H

MOV: 意思可以理解为赋值或者传送

P2:因为数码管连接在的是单片机P2的八个引脚下,所以这里填写P2

#0C0H:这个是一个十六进制的立即数,转化成二进制就是 1100 0000

连起来的意思就是:将1100 0000这串二进制信号 赋值给 P2的八个引脚,前两个1分别对应DP和G所连接的P2.7和P2.6引脚,后面六个0分别送到了连接着FEDCBA所连接的P2.5\P2.4\P2.3\P2.2\P2.1\P2.1\引脚

这样 通过单片机给数码管传送不同的二进制信号,就可以点亮我们想点亮的数值了。

(注:在汇编语言中十六进制的立即数有一个规则,当十六进制数是字母开头时要在前面加0,这也就是为什么时#0C0H 而不是 #C0H的原因了)

查看源图像

点亮完了 那如何实现计数的功能呢?

 直接上源代码分析(超详细分析)

TAB:  DB   0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H    ;定义了一个数组
UP0:  
    MOV R7,#10			;等下用来记录循环了次数,因为0-9有10个数,所以赋值为10
    MOV R2,#00H			;用来存储偏移量
    MOV DPTR,#TAB		;将数组的首地址用DPTR来记录
 UP: 
    MOV   A,R2           ;将当前偏移量赋值给变量A
    MOVC  A,@A+DPTR		;MOVC A,@A+DPTR是读取地址为A+DPTR存储单元的内容。
    MOV   P2,A			;读取到的数组内容赋值给P2引脚
    LCALL  DELAY1000MS    ;LCALL的意思是调用,调用DELAY1000MS
    INC     R2			;inc代表加一(偏移量加一)
    DJNZ   R7,UP        ;将R7减一,非0则跳转到UP,为0则执行下一句(可以执行10次)
    SJMP    UP0         ;SJMP是跳转的意思,跳转到UP0的位置

DELAY1000MS:			;这里往下是延时函数的部分,可以理解为执行完下面这这语句用时1秒
	PUSH 30H
	PUSH 31H
	PUSH 32H
	MOV 30H,#8
	MOV 31H,#1
	MOV 32H,#236
NEXT:
	DJNZ 32H,NEXT
	DJNZ 31H,NEXT
	DJNZ 30H,NEXT
	POP 32H
	POP 31H
	POP 30H
	RET
END

 每条语句基本都能理解,但是一连在一起就看不懂了?

大概意思就是,首先创建了一个数组,里面存有0-9 十个数码的共阳极段码,每个段码对应不同的二进制,可以点亮不同的数码管数值。然后在一个大循环里重复执行十次小循环,每次小循环都会显示不同的数码 ,然后延时,然后加1,在循环。最后大循环,将数码又继续从0开始。

 效果图:

猜你喜欢

转载自blog.csdn.net/yvge669/article/details/124522144