电子说
简介
时钟收音机,录像机,微波炉,玩具和许多其他家用物品中经常发现七段LED显示屏。它们主要用于显示十进制数字,但也可以显示一些字母和其他字符。该实验描述了将七段式LED显示器连接到PIC16F688单片机的方法。您将创建一个从0(00h)到15(0Fh)的十六进制计数器,并在七段LED显示屏上显示该值。
要求的理论
七段式LED显示屏是由7个LED元件组成的特殊布置,在每侧使用两个垂直段,在顶部,中部和底部使用一个水平段来形成矩形。通过分别打开或关闭分段,可以显示0到9之间的数字和一些字母。有时七段显示也有第八段显示小数点。因此,一个七段显示器将需要微控制器的七个输出来显示一个数字,如果还要显示小数点,则还需要一个输出。
这些段用非大写字母标记: a,b,c,d,e,f,g和dp,其中dp是小数点。显示器内部的8个LED可以配置为共阴极或共阳极配置。对于公共阴极显示器,所有分段LED的阴极都绑在一起,并且该公共点必须接地。然后,通过向其阳极施加逻辑1来打开所需的LED段。在公共阳极显示器中,所有阳极连接在一起,并且公共阳极连接到电源电压Vcc。通过将逻辑0施加到其阴极来打开各个段。
当使用七个以上的段显示时,将使用一种多路复用技术来最大限度地减少所需的微控制器引脚数。
在此实验中,将使用LT543模型共阴极七段显示器。分段LED指示灯亮起时呈红色。该模块有10个引脚,其配置如下所示。
所有阴极都连接在一起,并且公共阴极点在引脚3和8处可用。阳极通过带有限流电阻器的微控制器的I/O引脚驱动。要显示数字,需要打开和关闭适当的段LED。例如,要显示数字7,仅应打开段a,b和c。
电路图
用于连接的电路图PIC16F688单片机端口的共阴极七段LED显示屏如下所示。微控制器的I/O引脚提供段LED所需的电流。串联在微控制器pina和段LED之间的限流电阻为330Ω。每。段a-f通过RC0-RC5驱动,段g由RA2驱动。不使用小数点。请检查制造商的数据表以标识您的七段显示模块的段引脚。
七段显示接口电路图
电路板上的电路设置
软件
分段LED通过PORTC和PORTA驱动,因此它们被定义为数字输出。这些引脚上的任何比较器功能也必须禁用。程序从0到15计数,间隔为1秒,然后再次翻转为0。计数值在七段显示器上显示为0、1、2、3、4、5、6、7、8、9,A,B,C,D,E和F。使用以下命令编译以下程序来自MikroElektronika的用于PIC编译器的MikroC Pro,并将HEX文件加载到PIC16F688微控制器中。阅读第一个实验会话, 实验1:使LED闪烁 ,以了解微控制器的时钟和配置位设置。
/*
Lab 6: Seven segment display
Copyright @ Rajendra Bhatt
November 13, 2010
*/
// Define seven segment connections
sbit seg_a at RC0_bit;
sbit seg_b at RC1_bit;
sbit seg_c at RC2_bit;
sbit seg_d at RC3_bit;
sbit seg_e at RC4_bit;
sbit seg_f at RC5_bit;
sbit seg_g at RA0_bit;
unsigned short count=0;
void main() {
ANSEL = 0b00000000; //All I/O pins are configured as digital
CMCON0 = 0x07 ; // Disbale comparators
TRISC = 0b00000000; // PORTC All Outputs
TRISA = 0b00001000; // PORTA All Outputs, Except RA3
do {
switch (count) {
case 0 : seg_a=1; seg_b=1; seg_c=1;
seg_d=1; seg_e=1; seg_f=1; seg_g=0;
break;
case 1 : seg_a=0; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=0; seg_g=0;
break;
case 2 : seg_a=1; seg_b=1; seg_c=0; seg_d=1;
seg_e=1; seg_f=0; seg_g=1;
break;
case 3 : seg_a=1; seg_b=1; seg_c=1; seg_d=1;
seg_e=0; seg_f=0; seg_g=1;
break;
case 4 : seg_a=0; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=1; seg_g=1;
break;
case 5 : seg_a=1; seg_b=0; seg_c=1; seg_d=1;
seg_e=0; seg_f=1; seg_g=1;
break;
case 6 : seg_a=1; seg_b=0; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 7 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=0; seg_g=0;
break;
case 8 : seg_a=1; seg_b=1; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 9 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=1; seg_g=1;
break;
case 10 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=1; seg_f=1; seg_g=1;
break;
case 11 : seg_a=0; seg_b=0; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 12 : seg_a=1; seg_b=0; seg_c=0; seg_d=1;
seg_e=1; seg_f=1; seg_g=0;
break;
case 13 : seg_a=0; seg_b=1; seg_c=1; seg_d=1;
seg_e=1; seg_f=0; seg_g=1;
break;
case 14 : seg_a=1; seg_b=0; seg_c=0; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 15 : seg_a=1; seg_b=0; seg_c=0; seg_d=0;
seg_e=1; seg_f=1; seg_g=1;
break;
} //case end
count ++;
if(count ==16) count =0;
Delay_ms(1000); // Wait for 1 sec before updating the display
} while(1); // Infinite Loop
}
下载十六进制文件
输出
将程序加载到微控制器后,打开电源并查看十六进制计数器的计数从0到F。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !