arduino学习笔记5 - 数码管实验
数码管介绍数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数数码管和八段数数码管,八段数数码管比七段数数码管多一个发光二极管单元(多一个小数点显示)
发光二极管单元连接方式分为共阳数码管和共阴数码管。共阳数码管是指将所有发光二极管的阳极连接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极PWR接到电源输入PWR上,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管则更好相反,阴极连接到一起形成了公共阴极,阳极是独立分开的。
先来看一下本次实验使用的数码管。
通过查询型号LG5011BSR得知其为0.5"单联共阳数码管,下面是其引脚图。
查看其背后,四个角分别有2个原点和5,10两个标记。分别表示了1,6,5,10针脚。
数码管和发光二极管一样,需要添加限流电阻,因为网上没有查到资料说明该数码管的击穿电压是多大。所以供给电源电压宁可小不可大,所以选择220Ω限流电阻,和3.3V供电。
线路连接图如下
把下面的代码编译后下载到控制板上,看看效果~//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。
int a=7;
int b=6;
int c=5;
int d=11;
int e=10;
int f=8;
int g=9;
int dp=4;
//显示数字1
void digital_1(void)
{
unsigned char j;
digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段
digitalWrite(b,LOW);//点亮b段
for(j=7;j<=11;j++)//熄灭其余段
digitalWrite(j,HIGH);
digitalWrite(dp,HIGH);//熄灭小数点DP段
}
//显示数字2
void digital_2(void)
{
unsigned char j;
digitalWrite(b,LOW);
digitalWrite(a,LOW);
for(j=9;j<=11;j++)
digitalWrite(j,LOW);
digitalWrite(dp,HIGH);
digitalWrite(c,HIGH);
digitalWrite(f,HIGH);
}
//显示数字3
void digital_3(void)
{
unsigned char j;
digitalWrite(g,LOW);
digitalWrite(d,LOW);
for(j=5;j<=7;j++)
digitalWrite(j,LOW);
digitalWrite(dp,HIGH);
digitalWrite(f,HIGH);
digitalWrite(e,HIGH);
}
//显示数字4
void digital_4(void)
{
digitalWrite(c,LOW);
digitalWrite(b,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp,HIGH);
digitalWrite(a,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
}
//显示数字5
void digital_5(void)
{
unsigned char j;
for(j=7;j<=9;j++)
digitalWrite(j,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(dp,HIGH);
digitalWrite(b,HIGH);
digitalWrite(e,HIGH);
}
//显示数字6
void digital_6(void)
{
unsigned char j;
for(j=7;j<=11;j++)
digitalWrite(j,LOW);
digitalWrite(c,LOW);
digitalWrite(dp,HIGH);
digitalWrite(b,HIGH);
}
//显示数字7
void digital_7(void)
{
unsigned char j;
for(j=5;j<=7;j++)
digitalWrite(j,LOW);
digitalWrite(dp,HIGH);
for(j=8;j<=11;j++)
digitalWrite(j,HIGH);
}
//显示数字8
void digital_8(void)
{
unsigned char j;
for(j=5;j<=11;j++)
digitalWrite(j,LOW);
digitalWrite(dp,HIGH);
}
void setup()
{
int i;//定义变量
for(i=4;i<=11;i++)
pinMode(i,OUTPUT);//设置4~11引脚为输出模式
}
void loop()
{
while(1)
{
digital_1();//数字1
delay(2000);//延时2s
digital_2();
delay(2000);
digital_3();
delay(2000);
digital_4();
delay(2000);
digital_5();
delay(2000);
digital_6();
delay(2000);
digital_7();
delay(2000);
digital_8();
delay(2000);
}
}本次试验的效果为数码管1,2,3,4,5,6,7,8这样子循环显示。
http://player.youku.com/player.php/sid/XMjgzNzQ4Mzk2/v.swf
上面的代码使用的是传统的方法来显示1,2,3,4。如果遇到工程量比较大的时候,这种方法就不合适了。这时我们需要使用数组的方法来进行控制。使用数组前,需要先对显示0,1,2,3等情况下,各个端口的开关情况进行统计,统计结果如下图。
请大家把下面的代码输入控制板,看看实验效果,然后对两种代码表达方式进行研究~~看看异同。byte seven_seg_digits = { //设置每个数字所对应的开关数组
{ 1,0,0,0,0,1,0,0 },// = 0
{ 1,0,0,1,1,1,1,1 },// = 1
{ 1,1,0,0,1,0,0,0 },// = 2
{ 1,0,0,0,1,0,1,0 },// = 3
{ 1,0,0,1,0,0,1,1 },// = 4
{ 1,0,1,0,0,0,1,0 },// = 5
{ 1,0,1,0,0,0,0,0 },// = 6
{ 1,0,0,0,1,1,1,1 },// = 7
{ 1,0,0,0,0,0,0,0 },// = 8
{ 1,0,0,0,0,0,1,0 } // = 9
};
void setup() { //4-11号端口设定为输出模式
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void sevenSegWrite(byte digit) {//设置通过数组控制引脚开关,顺序为4-11号端口
byte pin = 4;
for (byte segCount = 0; segCount < 8; ++segCount) {
digitalWrite(pin, seven_seg_digits);
++pin;
}
}
void loop() { //设置显示效果为从9开始倒数
for (byte count = 10; count > 0; --count) {
delay(1000);
sevenSegWrite(count - 1);
}
delay(2000);
}视频效果如下
http://player.youku.com/player.php/sid/XMjg5NjA3NTI4/v.swf
陈冬冬 发表于 2012-1-17 17:23 static/image/common/back.gif
求助!为什么总有个 unsigned char j??为什么要这样定义变量 j 啊
因为如果直接用char的话就是16个字节了,一般来说在 j 数字允许的情况下,尽量用小点的定义,, 管脚能用类似51单片机总线的方式控制吗?:) Dawn 发表于 2011-10-15 22:01 static/image/common/back.gif
管脚能用类似51单片机总线的方式控制吗?
额。。。没有用过51单片机。。。有懂51的介绍介绍。。。 这是我写的,不知道有没有错误,我现在没有板子void loop()
{
byte i,j;
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
{
if(1==seven_seg_digits)
digitalWrite((j+4),HIGH);
else
digitalWrite((j+4),LOW);
}
delay(1000);
}
delay(2000);
} 弘毅 发表于 2011-10-15 22:53 static/image/common/back.gif
额。。。没有用过51单片机。。。有懂51的介绍介绍。。。
求助!为什么总有个 unsigned char j??为什么要这样定义变量 j 啊 弘毅 发表于 2011-10-15 22:53 static/image/common/back.gif
额。。。没有用过51单片机。。。有懂51的介绍介绍。。。void sevenSegWrite(byte digit) {//设置通过数组控制引脚开关,顺序为4-11号端口
byte pin = 4;
for (byte segCount = 0; segCount < 8; ++segCount) {
digitalWrite(pin, seven_seg_digits);
++pin;
}
}求助。。这段代码不明白诶。。。。 不知道能不能用总线来控制管脚呢? 勇! 发表于 2012-2-1 09:58 static/image/common/back.gif
不知道能不能用总线来控制管脚呢?
加上对应的IIC或者SPI总线的芯片,就可以,直接控制貌似不行~ 25.void sevenSegWrite(byte digit) {//设置通过数组控制引脚开关,顺序为4-11号端口
26.byte pin = 4;
27.for (byte segCount = 0; segCount < 8; ++segCount) {
28. digitalWrite(pin, seven_seg_digits);
29. ++pin;
30.}
31.}
求助这段代码怎么解析?
它们控制的原理相同,但引脚和所用的函数有些不同,所以写的程序不能完全通用 为什么我接3.3V没用,接GND就可以了 diamondliu 发表于 2012-3-17 21:45 static/image/common/back.gif
为什么我接3.3V没用,接GND就可以了
数码管分共阴和共阳。。。你的应该和实验里面所用的,刚好是反的。 知道了,我的高低电平也是反的 不过觉得控制数码管没有51的好懂