如何用汇编语言点亮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开始。
效果图: