实验二 数码管显示Word下载.docx
《实验二 数码管显示Word下载.docx》由会员分享,可在线阅读,更多相关《实验二 数码管显示Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
对数字万用表来说,红色表笔连接表内部电池正极,黑色表笔连接表内部电池负极,当把数字万用表置于二极管档时,其两表笔间开路电压约为1.5V,把两表笔正确加在发光二极管两端时,可以点亮发光二极管。
如下图所示,将数字万用表置于二极管挡,红表笔接在①脚,然后用黑表笔去接触其他各引脚,假设只有当接触到⑨脚时,数码管的a段发光,而接触其余引脚时则不发光。
由此可知,被测数码管为共阴极结构类型,⑨脚是公共阴极,①脚则是数码管的a段.接下来再检测各段引脚,仍使用数字万用表二极管档,将黑表笔固定接在⑨脚,用红表笔依次接触②、③、④、⑤、⑥、⑦、⑧、⑩引脚时,数码管的其他段先后分别发光,据此便可绘出该数码管的内部结构和引脚排列图。
检测中,若被测数码管为共阳极类型,则需将红、黑表笔对调才能测出上述结果,在判别结构类型时,操作时要灵活掌握,反复试验,直到找出公共端为止,大家只要懂得了原理,检测出各个引脚便不在是问题了。
数码管静态显示
当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那么它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。
从电路图可以看出,本开发板使用的是共阴极数码管,在每段数码管端加上一个限流电阻。
C程序:
/*******************************************************************************
*实验名:
静态数码管实验
*使用的IO:
数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3
*实验效果:
按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键,
*显示加1。
*******************************************************************************/
#include<
reg51.h>
intrins.h>
#defineGPIO_DIGP0
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
sbitK1=P3^1;
sbitK2=P3^0;
sbitK3=P3^2;
sbitK4=P3^3;
unsignedcharcodeDIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示0~9的值
voidDelay10ms();
//延时10ms
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
voidmain(void)
{
unsignedinti,j;
LSA=0;
LSB=0;
LSC=0;
while
(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay10ms();
//消除抖动
if(K1==0)
{
j=0;
}
while((i<
50)&
&
(K1==0))//检测按键是否松开
Delay10ms();
i++;
}
i=0;
}
if(K2==0)//检测按键K2是否按下
if(K2==0)
j=9;
(K2==0))
}
if(K3==0)//检测按键K3是否按下
if(K3==0)
j--;
if(j>
9)
j=9;
(K3==0))
}
if(K4==0)//检测按键K4是否按下
if(K4==0)
j++;
j=0;
}
(K4==0))
GPIO_DIG=DIG_CODE[j];
}
}
Delay10ms
延时函数,延时10ms
voidDelay10ms(void)//误差0us
unsignedchara,b,c;
for(c=1;
c>
0;
c--)
for(b=38;
b>
b--)
for(a=130;
a>
a--);
汇编程序:
ORG00H
LJMPINIT
ORG30H
DB03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH
;
*************;
主程序;
INIT:
CLRP2.2
CLRP2.3
CLRP2.4
MOVR1,#00H
START:
MOVA,R1
MOVDPTR,#30H
MOVCA,@A+DPTR
MAIN:
MOVP3,#0FFH
MOVP0,A
JNBP3.1,K1
JNBP3.0,K2
JNBP3.2,K3
JNBP3.3,K4
SJMPMAIN
*************************;
K1按键按下处理程序;
K1:
ACALLDELAY10MS;
延时消抖
JBP3.1,MAIN
MOVR1,00H
MOVR2,#030H
KEY1_UP:
ACALLDELAY10MS
DJNZR2,KEY1_UP;
按键延时
LJMPSTART
K2按键按下处理程序;
K2:
ACALLDELAY10MS
JBP3.0,MAIN
MOVR1,#09H
KEY2_UP:
DJNZR2,KEY2_UP
K3按键按下处理程序;
K3:
JBP3.2,MAIN
DECR1
KEY3_UP:
DJNZR2,KEY3_UP
CJNER1,#0FFH,KEY3
KEY3:
K4按键按下处理程序;
K4:
JBP3.3,MAIN
INCR1
KEY4_UP:
DJNZR2,KEY4_UP
CJNER1,#00AH,KEY4
KEY4:
延时程序;
DELAY10MS:
MOVR6,#015H
DE1:
MOVR7,#0F8H
DE2:
DJNZR7,DE2
DJNZR6,DE1
RET
END
动态数码管
1.动态扫描的原理
在实际的单片机系统中,往往需要多位显示。
动态显示是一种最常见的多位显示方法,应用非常广泛。
所有数码管段选都连接在一起的时候,怎么让数码管显示不一样的数字呢?
动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。
首先我们来看一下开发板上的电路原理图:
本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。
*实验名:
动态显示数码管实验
数码管使用P0,P2.2,P2.3,P2.4
数码管显示76543210。
*注意:
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharDisplayData[8];
//用来存放要显示的8位数的值
voidDigDisplay();
//动态显示函数
unsignedchari;
for(i=0;
i<
8;
i++)
DisplayData[i]=DIG_CODE[i];
}
DigDisplay();
DigDisplay
使用数码管显示
voidDigDisplay()
unsignedintj;
switch(i)//位选,选择点亮的数码管,
case(0):
LSA=0;
LSB=0;
LSC=0;
break;
//显示第0位
case
(1):
LSA=1;
//显示第1位
case
(2):
LSB=1;
//显示第2位
case(3):
//显示第3位
case(4):
LSC=1;
//显示第4位
case(5):
//显示第5位
case(6):
//显示第6位
case(7):
//显示第7位
GPIO_DIG=DisplayData[i];
//发送段码
j=10;
//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;
//消隐
在用C语言编程时,编码定义方法如下:
unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字,code即表示编码的意思。
需要注意的是,单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间中,编译后编码占用的是程序存储空间,而非内存空间。
LJMPINIT
DB03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H
;
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
DAT0EQU30H;
要显示的八位数
DAT1EQU31H
DAT2EQU32H
DAT3EQU33H
DAT4EQU34H
DAT5EQU35H
DAT6EQU36H
DAT7EQU37H
LSAEQUP2.2
LSBEQUP2.3
LSCEQUP2.4
GPIO_DIGEQUP0
MOVDAT0,#03FH
MOVDAT1,#006H
MOVDAT2,#05BH
MOVDAT3,#04FH
MOVDAT4,#066H
MOVDAT5,#06DH
MOVDAT6,#07DH
MOVDAT7,#007H
CLRLSA;
显示第一位
CLRLSB
CLRLSC
MOVGPIO_DIG,DAT0
ACALLDELAY;
显示持续时间
MOVGPIO_DIG,#000H;
消隐
SETBLSA;
显示第二位
CLRLSC
MOVGPIO_DIG,DAT1
ACALLDELAY;
MOVGPIO_DIG,#000H
显示第三位
SETBLSB
MOVGPIO_DIG,DAT2
MOVGPIO_DIG,#00H
显示第四位
MOVGPIO_DIG,DAT3
MOVGPIO_DIG,#00H
显示第五位
SETBLSC
MOVGPIO_DIG,DAT4
MOVGPIO_DIG,#00H
显示第六位
SETBLSC
MOVGPIO_DIG,DAT5
显示第七位
MOVGPIO_DIG,DAT6
MOVGPIO_DIG,DAT7
LJMPMAIN
DELAY:
MOVR7,#0FFH
DJNZR7,$