51单片机数码管显示函数分享(8051汇编)
目录
电路图
源代码
代码直接显示效果
变量解释
函数使用
函数主要框架
其余函数介绍
电路图

标号相同的位置是相连的,也可以直接用线相连接,数码管为共阳极
源代码
ORG 00HSMGPTR DATA 30HDISDATA DATA 31H//DISDATA: 31H - 36H (DATA Arr)SMGBIN DATA 40HTEMP1 DATA 41HTEMP2 DATA 42HTEMP3 DATA 43HLOOP:MOV DISDATA+0,#2MOV DISDATA+1,#3MOV DISDATA+2,#4MOV DISDATA+3,#5MOV DISDATA+4,#6MOV DISDATA+5,#7LCALL DISPLAYSJMP LOOP/////////////////////////DISPLAY:MOV SMGBIN,#01111111BMOV SMGPTR,#0DIS1:MOV A,SMGBINRL AMOV SMGBIN,AMOV P2,SMGBIN //BIT CHOICEMOV A,SMGPTRADD A,#DISDATAMOV R0, AMOV TEMP1,@R0 //DATA CHOICEMOV DPTR,#TABMOV A,TEMP1MOVC A,@A+DPTRMOV P0,ALCALL DELAYINC SMGPTRMOV A,SMGPTRCJNE A,#6,DIS1RET/////////////////////////TESTDISPLAY:MOV P2,#11111101BMOV A,#5MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ARET/////////////////////////TESTDISPLAY1:MOV SMGBIN,#01111111BMOV SMGPTR,#0MOV A,SMGBINRL AMOV SMGBIN,AMOV P2,A //BIT CHOICEMOV A,SMGPTRADD A,#DISDATAMOV R0, AMOV TEMP1, @R0 //DATA CHOICEMOV DPTR,#TABMOV A,TEMP1MOVC A,@A+DPTRMOV P0,ARET/////////////////////////DELAY:MOV R5,#1 //1->10ms X3:MOV R6,#20X2:MOV R7,#248X1:DJNZ R7,X1DJNZ R6,X2DJNZ R5,X3RET ////////////////////////TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND
代码直接显示效果

变量解释
DISDATA->数组,从31H到36H六位分别存放数码管六位各个位的显示数字
SMGPTR->存放数组指针,用于在循环里作为DISDATA数组的索引,通过SMGPTR从0变到5,找到DISDATA[0]到DISDATA[5]并且分别显示到数码管上
SMGBIN->数码管位选,通过赋初始值0111 1111B,将其通过RL操作符向左循环移位,获得1111 1110B显示第一位,1111 1101B显示第二位,一直到显示完成六位数码管
TEMP1~3作为临时变量,在函数中作为中转的中间变量
TAB->存放数码管0~9的显示,TAB[0]对应0,TAB[1]对应1...一直到TAB[9]对应9,这里还有一位TAB[10]对应的是空,即什么都不显示。

函数使用
使用比较简单,如上:只要MOV DISDATA+2,#4,就可以访问并且赋值DISDATA[2](即DISDATA数组以及数码管的第三位)。使用时就按照这种格式写就行。
如果要让某位什么都不显示,直接赋值10就行,对应码表里面就是空
然后在赋值完成之后就LCALL DISPLAY调用DISPLAY函数就行

函数主要框架
主要框架就是用SMGPTR作为计数器循环六次,然后每次都进行数码管的位选+段选+延时10ms显示,完成六个数码管的分别显示,显示完成六个数码管就退出函数

其余函数介绍
DISPLAY:数码管六位循环显示的函数
TESTDISPLAY:数码管显示第一位,并且显示5的最简单代码
TESTDISPLAY1:运用DISPLAY函数框架写的一次函数显示DISDATA第0位,数码管第一位的代码
DELAY:10ms的延时函数
