数码管模块的使用(静态显示与动态显示)
原理图
原理图显示CT107D上的数码管模块共有八个数码管,采用共阳接法,八个数码管采用2个74HC573锁存器对单片机P0口的输入信号进行锁存,其中Y7C控制的锁存器输入是段选,Y6C控制的锁存器输入是位选。
根据数码管的显示原理,单个数码管共有8个字段:dp g f e d c b a, 控制数码管的显示实际上就是控制数码管字段的高低电平显示,通过控制字段的发光来表示字符。
故:
- 单个数码管的显示步骤为:先控制Y6C进行位选(选择哪一位显示字符),再控制Y7C进行段选(需要显示的字符对应的字符码),然后延时显示即可;
- 多个数码管同时点亮时,只需要再单个数码管显示的基础上,控制延时的时间,达到人眼分辨不出切换的频率,达到动态扫描效果即可。
单个数码管显示代码
#include "reg52.h"
#include "intrins.h"
void Delay50ms() //@12.000MHz
{
unsigned char i, j;
i = 98;
j = 67;
do
{
while (--j);
} while (--i);
}
//数码管
void main()
{
while(1)
{
P2 = P2 & 0x1f | 0xc0;
P0 = 0x01;
P2 = P2 & 0x1f | 0xe0;
P0=0XFF;
P0 = 0xc0;
Delay50ms();
P0=0XFF;
P2 = P2 & 0x1f ; //数码管消影
}
}
多个数码管显示“22-01-06”代码
#include <reg52.h> //引用芯片头文件
#include "intrins.h" //延时函数所需要的头文件
void Delay500us();
void Display_right(long int number);
void Display_left(long int number);
void Digital_Tube(unsigned char Position,unsigned char Typeface);
void Delay500us() //@12.000MHz
{
unsigned char i, j;
i = 6;
j = 211;
do
{
while (--j);
} while (--i);
}
void Digital_Tube(unsigned char Position,unsigned char Typeface) //Position是数码管第几位(从左到右,0开始),Typeface是显示的字样
{
unsigned char Bit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char SMG_NoDot[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff}; //0-9、A-F、'-'、'.'
P2 = P2 & 0x1f | 0xc0;
P0=Bit[Position];
P2 = P2 & 0x1f | 0xe0;
P0=SMG_NoDot[Typeface];
Delay500us();
P0=0XFF;
P2 = P2 & 0x1f ; //数码管消影
}
/*************************************************
Function: // void Display_right(char number)
Description: // 数码管数字靠右显示
Calls: // void Digital_Tube(unsigned char Position,unsigned char Typeface)
Input: // 输入需要显示的大于0的数字(首个数字不能为0)
*************************************************/
void Display_right(long int number)
{
long int i,a,b;
for(i=0;i<8;i++)
{
a=number%10;
Digital_Tube(7-i,a);
b=number/10;
if(b==0) break;
number=b;
}
}
/*************************************************
Function: // void Display(char number)
Description: // 数码管数字靠左显示
Calls: // void Digital_Tube(unsigned char Position,unsigned char Typeface)
Input: // 输入需要显示的大于0的数字(首个数字不能为0)
Output: // 对 Digital_Tube函数的调用
*************************************************/
void Display_left(long int number)
{
long int i,a,b;
long int len = 0,x=number;
while(x>=10)
{
x = x/10;
len++;
}
for(i=0;i<8;i++)
{
a=number%10;
Digital_Tube(len-i,a);
b=number/10;
if(b==0) break;
number=b;
}
}
int main()
{
while(1)
{
Display_left(22);
Digital_Tube(2,16);
Digital_Tube(3,0);
Digital_Tube(4,1);
Digital_Tube(5,16);
Digital_Tube(6,0);
Display_right(6);
}
}
74HC138译码器的原理及真值表可以看这位老兄的:
嵌入式硬件入门——74HC138译码器(三个IO实现8选1)
74HC573锁存器的原理及真值表可以看这位老兄的:
单片机 74HC573
数码管原理及驱动(静态与动态)可以参考百度百科