本帖最后由 hehung 于 2018-4-1 12:21 编辑
上一次做了一个流水灯,现在还是从基础做起,做一个可以滚动显示的数码管。废话不多说,首先展示一下滚动显示的效果。
由于使用手机自带的gif拍摄的图片,只能拍摄很短的gif图片,所以就多放了几张。
我是向左滚动的滚动的时间大约500ms左右,随便写的,并不准确,会循环连续的滚动,图中不太容易看出效果。
好了,分享教程:
首先打开原理图,可以看到原理图中所有的数码管都是接在J16上的,而J16又是通过译码器连接到J6,单片机上的A,B,C引脚。所以通过A,B,C可以控制数码管得位选。
这里说一下我的数码管的链接引脚:
A === P1.0
B === P1.1
C === P1.2
然后就是J12口是控制段选的,这个不用多做结束,链接的P0引脚。
然后就是编写程序。
程序是通过一小段的延时来达到连续显示的目的,只要显示的频率达到30HZ,基本上就可以看到是连续的了。
#include
#define uchar unsigned char
#define uint unsigned int
#define SMG P0 //定义数码管的段选端口
//下述的A,B,C的信号进过译码器解码后可以控制8个数码管的显示
sbit LA=P1^0;
sbit LB=P1^1;
sbit LC=P1^2;
//下面的数组可以显示0-F
uchar code number={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//函数声明
void delay(int ms);
void change(int what);
//延时函数(短延时)
void delay(int ms)
{
for(;ms>0;ms--);
}
//该函数可以选择某一个数码管显示
void change(int what)
{
switch(what)
{
case 1:LC=0;LB=0;LA=0;break;
case 2:LC=0;LB=0;LA=1;break;
case 3:LC=0;LB=1;LA=0;break;
case 4:LC=0;LB=1;LA=1;break;
case 5:LC=1;LB=0;LA=0;break;
case 6:LC=1;LB=0;LA=1;break;
case 7:LC=1;LB=1;LA=0;break;
case 8:LC=1;LB=1;LA=1;break;
}
}
int main()
{
uchar i;
uchar j=0;
uint time=50;
while(1)
{
for(;time>0;time--)
{
for(i=1;i<=8;i++)
{
change(i);
SMG = number; //使之可以滚动显示的处理
delay(100);
SMG = 0;
delay(50); //消除暗影
}
}
time = 50;
j++;
if(j>17)
j = 0;
}
}
上面的程序可以实现0-F的循环连续滚动显示,有兴趣的伙伴可以试一下。
附件:提供了程序的工程,可以直接下载尝试。
好了,今天的试用就到这里,期望大家支持:)
本帖最后由 hehung 于 2018-4-1 12:21 编辑
上一次做了一个流水灯,现在还是从基础做起,做一个可以滚动显示的数码管。废话不多说,首先展示一下滚动显示的效果。
由于使用手机自带的gif拍摄的图片,只能拍摄很短的gif图片,所以就多放了几张。
我是向左滚动的滚动的时间大约500ms左右,随便写的,并不准确,会循环连续的滚动,图中不太容易看出效果。
好了,分享教程:
首先打开原理图,可以看到原理图中所有的数码管都是接在J16上的,而J16又是通过译码器连接到J6,单片机上的A,B,C引脚。所以通过A,B,C可以控制数码管得位选。
这里说一下我的数码管的链接引脚:
A === P1.0
B === P1.1
C === P1.2
然后就是J12口是控制段选的,这个不用多做结束,链接的P0引脚。
然后就是编写程序。
程序是通过一小段的延时来达到连续显示的目的,只要显示的频率达到30HZ,基本上就可以看到是连续的了。
#include
#define uchar unsigned char
#define uint unsigned int
#define SMG P0 //定义数码管的段选端口
//下述的A,B,C的信号进过译码器解码后可以控制8个数码管的显示
sbit LA=P1^0;
sbit LB=P1^1;
sbit LC=P1^2;
//下面的数组可以显示0-F
uchar code number={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//函数声明
void delay(int ms);
void change(int what);
//延时函数(短延时)
void delay(int ms)
{
for(;ms>0;ms--);
}
//该函数可以选择某一个数码管显示
void change(int what)
{
switch(what)
{
case 1:LC=0;LB=0;LA=0;break;
case 2:LC=0;LB=0;LA=1;break;
case 3:LC=0;LB=1;LA=0;break;
case 4:LC=0;LB=1;LA=1;break;
case 5:LC=1;LB=0;LA=0;break;
case 6:LC=1;LB=0;LA=1;break;
case 7:LC=1;LB=1;LA=0;break;
case 8:LC=1;LB=1;LA=1;break;
}
}
int main()
{
uchar i;
uchar j=0;
uint time=50;
while(1)
{
for(;time>0;time--)
{
for(i=1;i<=8;i++)
{
change(i);
SMG = number; //使之可以滚动显示的处理
delay(100);
SMG = 0;
delay(50); //消除暗影
}
}
time = 50;
j++;
if(j>17)
j = 0;
}
}
上面的程序可以实现0-F的循环连续滚动显示,有兴趣的伙伴可以试一下。
附件:提供了程序的工程,可以直接下载尝试。
好了,今天的试用就到这里,期望大家支持:)