2数码管动态显示程序设计
实验2 数码管动态显示程序设计
实验目的
1、理解数码管动态显示原理
2、理解数码管动态显示电路的设计方法
3、掌握数码管动态显示程序的设计方法
实验仪器
单片机开发试验仪、稳压电源、计算机
实验原理
1、数码管的驱动
数码管的显示是靠点亮内部的发光二极管来发光。数码管内部电路如下图所示,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端。公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。
上图展出了常用的两种数码管的引脚排列和内部结构。众所周知,点亮发光二极管就是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。
共阳极数码管其内部8个发光二极管的所有阳极全部连接在一起,电路连接时,公共端接高电平,因此我们要点亮的那个发光管二极管就需要给阴极送低电平,此时显示数字的编
码与共阳极编码是相反的关系。
2、动态数码管驱动原理
首先我们来看一下开发板上的电路原理图:
本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。
实验板连接图:
实验内容:数码管动态显示0~7
/****************************************************************************** * 实验名 : 动态数码管显示试验
* 实验说明 : 8位数码管显示0~7
* 连接方式 : 见连接图
******************************************************************************* #include
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//定义全局变量//
unsigned char code DIG_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的显示码
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
//--声明全局函数--//
void DigDisplay(); //动态显示函数
/****************************************************************************** * 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*****************************************************************************/ void main()
{
unsigned char i;
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[i];
}
while(1)
{
DigDisplay();
}
}
/****************************************************************************** * 函数名 : DigDisplay
* 函数功能 : 使用数码管显示
* 输入 : 无
* 输出 : 无
**************************************************************************/ void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
思考题:
1、根据程序画出流程图
2、如果不进行消隐处理会出现什么现象