第讲LED显示-
LED 数码显示器的应用
LED 数码显示器是单片机嵌入式系统中经常使用的显示器件。一个“8”字型的显示模块用“a、b、c、d、e、f、g、h” 8 个发光二极管组合而成,如图6-12a 所示。每个发光二极管称为一第讲LED显示-
LED 数码显示器的应用
LED 数码显示器是单片机嵌入式系统中经常使用的显示器件。一个“8”字型的显示模块用“a、b、c、d、e、f、g、h” 8 个发光二极管组合而成,如图6-12a 所示。每个发光二极管称为一字段。LED 数码显示器有共阳极和共阴极两种结构形式,电路设计时不要混淆。
2
3
单个LED 数码管字符显示控制
我们以共阴极的数码管为例,先介绍如何控制一个8 段数码管显示“0”-“F”16 个十六进制的数字。
1) 硬件电路设计:
很明显,用AVR 的一个I/O 口控制共阴极数码管的8 个段位,分别置“1”或“0”,让某些段的LED 发光,其它的熄灭,就可以显示不同的字符和图符号,硬件电路如图6-13。
4
5
6
在单片机嵌入式系统软件设计中,经常要考虑二进制、十六进制、十进制、BCD 码、压缩BCD 码、八段码、ASCII 码之间的相互转换问题。人们计数习惯采用十进制,而单片机的计算、存储则为二进制形式最方便。此外传送字符用ASCII码,LED 数码显示要转化成相应的7 段码等等。因此对与各种不同数制的使用和相互转换在软件设计中尤其重要,设计使用得当,可以简化程序设计和优化程序代码。
7
#include <>
#include <>
flash char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
bit point_on = 0;
void main(void)
{
char i = 0;
PORTA=0xFF;
DDRA=0xFF;
while (1)
{
for (i=0;i<=15;i++)
{
PORTA = led_7[i];
if (point_on) PORTA |= 0x80;
delay_ms(1000);
}
point_on = ~point_on;
};
}
8
多位LED 数码管的显示
多位LED 数码管显示电路按驱动方式可分为静态显示和动态显示两种方法。
一个数码管要使用AVR 的8 个I/O 口线输出段码(共公端接GND)。当使用多个数码管时,显然采用这样的控制方式有些问题,因为AVR 是不能提供太多的I/O 控制引脚的。
9
为了保证各个数码管的显示的效果不产生闪烁情况,表象上全部点亮的话,则首先必须在1 秒中内循环扫描6 个数码管的次数应大于25 次,这里是利用了人眼的影像滞留效应。
本例中我们选择40 次,既每隔1000/40=25ms 将6 个数码管循环扫描一遍。第二要考虑的是,在25ms 时间间隔中,要逐一轮流点亮6 个数码管,那么每个数码管点亮的持续时间要相同,这样亮度才能均匀。第三个要考虑的要点为每个数码管点亮的持续时间,这个时间长一些的话,数码管的亮度高一些,反之则暗一些。
15
#include <>
#include <>
flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char time[3]; // 时、分、秒计数
char dis_buff[6]; // 显示缓冲区,存放要显示的6 个字符的段码值
char time_counter; // 1 秒计数器
bit point_on; // 秒显示标志
void display(void) // 扫描显示函数,执行时间12ms
{
char i;
for(i=0;i<=5;i++)
{
16
PORTA = led_7[dis_buff[i]];
if (point_on && ( i==2 || i==4 )) PORTA |= 0x80; // (1)
PORTC = position[i];
delay_ms(2); // (2)
PORTC = 0xff; // (3)
}
}
void time_to_disbuffer(void) // 时间值送显示缓冲区函数
{
char i,j=0;
for (i=0;i<=2;i++)
{
第讲LED显示- 来自淘豆网m.daumloan.com转载请标明出处.