赞
踩
分为:共阴极数码管和共阳极数码管,其中共阳极数码管更为常用。
原因:
因为数码管的非公共端往往接 在IC 芯片的IO上,而IC 芯片的驱动能力
往往是比较小的,如果采用共阴极数码 管,它的驱动端在非公共端,就有可能受限于IC芯片输出电流不够而显示昏
暗(比 如51单片机),要外加上拉电阻或者是三极管加大驱动能力。所以使用共阳数码59
管的好处是:将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电 源的功率自然要比加
大IC芯片IO口的驱动电流简单许多。另一方面,这样也能减 轻MCU的负担。
段选:可以理解为数码管内部有八个发光二极管,段选就是让选中的那一段发光二极管发光。
位选:针对一排数码管,位选就是让选中的数码管起作用。
显示原理:靠点亮内部的发光二极管来发光。本器材为共阳极数码管。与之连接的JP3端口需要处于低电平(0),才会让对应的发光二极管亮。
a,b,c,d,e,f,g,DP八个发光二极管对应JP3的八个端口,当与之对应的端口处于低电平0时,这个发光二极管就会亮。
例如:当a,b,c,d,e,f为0时,数码管就会显示0
单位数码管:内部有8个发光二极管 ,有10个引脚 ,第3和第8引脚连接在一起
为什么不需要消隐???
/************静态数码管——流动显示0——9***********/ #include <reg52.h> //数组1按位取反之后就是数组2 ~按位取反符号 //此数组流动显示数字0——9 unsigned char code DIG_CODE_1[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F};//此数组需每位取反后才能成功显示 unsigned char code DIG_CODE_2[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90}; //被调函数原型说明 void delay(unsigned int t); //主函数 void main() { unsigned int i; while(1) { for(i=0;i<=9;i++) { P0=DIG_CODE_2[i]; // P0=~DIG_CODE_1[i]; //如果要用1数组来个P0赋值那么就需要按位取反 delay(30); } i=0; } } //被调函数 //延时函数delay(),时间与t有关。当t=50时,延时10ms void delay(unsigned int t) { int a, b; for (;t>0;t--) // t已经在传递过来的时候已经赋值了,// //所以在for语句第一句就不用赋值了--// { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } }
一排数码管同时亮也是利用动态效应,一次只能亮一个数码管,当间隔小了,人眼就会看成这一排数码管都亮了。
P0接数码管段选,P1接数码管位选
P1控制哪个数码管能亮,P0控制亮的数码管显示什么数字。
例如:P1=1111 1110,那么就是对应的第一个数码管能亮(最左边的那个),P0=0x3f,这个数码管显示的数字为0.
这段代码是让一排数码管都显示数字
j=10;while(j–);
这段代码的作用时短暂延时,假设没有这段代码,每个数码管就会瞬间熄灭,这一排看到的亮度就会比较暗,效果差。
如果加了这个延时,这一排数码管的亮度就会比较亮。
如果继续延长这个时间,例如j=10000那么看到的效果就会是一个个数码管分别亮,因为间隔时间过长,动态效应就无法起作用了。
P0 = 0x00;
消隐 如果不消隐就会显示模糊
消隐与不消隐的区别:(如下图)
#include<reg51.h> //--定义全局变量--// unsigned char code DIG_PLACE[8] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制 unsigned char code DIG_CODE[17] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 //共阴极,高电平有效 unsigned char DisplayData[8]; //用来存放要显示的8位数的值 //--声明全局函数--// void DigDisplay(); //动态显示函数 void main(void) { unsigned char i; for(i=0; i<8; i++) { DisplayData[i] = DIG_CODE[i]; } while(1) { DigDisplay(); } } void DigDisplay() { unsigned char i; unsigned int j; for(i=0; i<8; i++) { P1 = DIG_PLACE[i]; //发送位选 P0 = DisplayData[i]; //发送段码 //如果没有这个延时就会瞬间熄灭,看到的就比较暗 j = 10; //扫描间隔时间设定 如果改成10000就能看到一个一个数码管亮了 while(j--); P0 = 0x00;//消隐 如果不消隐就会模糊 } }
原理与上面基本相似,P0接数码管段选,不同的是位选是由38译码器的3个端口来决定(不再由数码管位选的端口来决定)
通过A B C这三个端口来控制哪一个数码管起作用。
A B C就是38译码器的3个输入端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。