数码管静态显示和动态显示
静态数码管是共阳,动态数码管是共阴???
数码管
共阳和共阴
分为:共阴极数码管和共阳极数码管,其中共阳极数码管更为经常使用。
缘由:
由于数码管的非公共端每每接 在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
spa
单位数码管:内部有8个发光二极管 ,有10个引脚 ,第3和第8引脚链接在一块儿code
代码实现
为何不须要消隐???blog
/************静态数码管——流动显示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;
消隐 若是不消隐就会显示模糊
class
消隐与不消隐的区别:(以下图)
变量
#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、一、二、三、四、五、六、七、八、九、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;//消隐 若是不消隐就会模糊 } }
方法二:38译码器
38译码器——3通道输入,三通道输出
原理
原理与上面基本类似,P0接数码管段选,不一样的是位选是由38译码器的3个端口来决定(再也不由数码管位选的端口来决定)
经过A B C这三个端口来控制哪个数码管起做用。
A B C就是38译码器的3个输入端
原理