4.1 数码管的原理分析
数码管的原理图也是需要数码管的内部原理图的,下面我们先看一下数码管的内部原理图,就以本次的0.36“-3-A的解答,首先看到这个型号第一个0.36代表大小,就是数码管的尺寸。然后3是指有三位,再然后有一个A,这里的A是指共阳极。因为每家的数码管都是不一样的数据不一样的,所以在开发设计时,一定要看一下是哪家的数码管,然后仔细阅读他的数据手册。
上面是我们本次使用的数码管的尺寸图,这个是在供应商的数据手册中截取的,如需要下载的话,可以在右边下面。
这里是有一个原理图的,可以看出来每个笔端都有一个灯珠,共阳极脚位分别对应在8,9,12三个脚位上。三个数码管的A-G以及DP(就是右下角的点)是连接在一起的,然后我们再看最上面我们自己的原理图,可以看出来是通过程序来控制我们点亮的到底是哪个地方的灯珠,我们继续看下面的程序
4.2 数码管点亮一个笔段
/**********************************
包含头文件
**********************************/
#include "main.h"
#include "smgduan.h"
/**********************************
函数名: usleep
传递参数: ms
返回参数: 无
函数作用: 延时1ms函数
**********************************/
void usleep(unsigned int ms)
{
unsigned int m,n;
for(m=ms;m>0;m--)
for(n=110;n>0;n--);
}
/**********************************
函数名: main
传递参数:无
返回参数:无
函数作用:主函数
**********************************/
void main(void)
{
while(1)
{
LSA=0;
LED=0;
}
}
通过控制共阳极和笔端的高低电平可以控制我们数码管的笔端。
4.3 单个数码管点亮
smgduan.c
/**********************************
包含头文件
**********************************/
#include "smgduan.h"
/**********************************
变量定义
**********************************/
uchar code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F的值
/******************************************
* 函 数 名 : DigDisplay
* 传递参数 : wei 位选 dis_num 显示的字符
* 函数功能 : 循环扫描3个数码管显示
*******************************************/
void DigDisplay(uchar wei ,uchar dis_num)
{
switch(wei) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=1;LSC=1; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=1; break;//显示第1位
case(2):
LSA=1;LSB=1;LSC=0; break;//显示第2位
}
P0=~smgduan[dis_num];//发送段码
usleep(2); //间隔一段时间扫描
P0=0xff;//消隐
}
smgduan.h
#ifndef _SMGDUAN_H_
#define _SMGDUAN_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/**********************************
函数声明
**********************************/
void DigDisplay(uchar wei ,uchar dis_num);
#endif
通过控制void DigDisplay(uchar wei ,uchar dis_num);
函数的位选和显示的字符可以让单个数码管显示我们需要的字符。比如
void main(void)
{
while(1)
{
DigDisplay(0,1);
}
}
在第一个位置显示数字1
4.4 多位数码管扫描点亮
smgduan.c
/**********************************
包含头文件
**********************************/
#include "smgduan.h"
/**********************************
变量定义
**********************************/
uchar code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F的值
/******************************************
* 函 数 名 : DigDisplay
* 传递参数 : wei 位选 dis_num 显示的字符
* 函数功能 : 循环扫描3个数码管显示
*******************************************/
void DigDisplay(uchar wei ,uchar dis_num)
{
switch(wei) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=1;LSC=1; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=1; break;//显示第1位
case(2):
LSA=1;LSB=1;LSC=0; break;//显示第2位
}
P0=~smgduan[dis_num];//发送段码
usleep(2); //间隔一段时间扫描
P0=0xff;//消隐
}
/******************************************
* 函 数 名 : DigDisplay
* 传递参数 : dis_num 显示的字符
* 函数功能 : 封装一下显示
*******************************************/
void ThereDisplay(uint dis_num)
{
if(dis_num<10)
{
DigDisplay(2,dis_num);
}
else if(dis_num<100)
{
DigDisplay(1,dis_num/10);
DigDisplay(2,dis_num%10);
}
else if(dis_num<1000)
{
DigDisplay(0,dis_num/100%10);
DigDisplay(1,dis_num/10%10);
DigDisplay(2,dis_num/1%10);
}
}
smgduan.h
#ifndef _SMGDUAN_H_
#define _SMGDUAN_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/**********************************
函数声明
**********************************/
void DigDisplay(uchar wei ,uchar dis_num);
void ThereDisplay(uint dis_num);
#endif
本次主要是封装了显示的函数这样在后续使用中会有很好的效果。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容