共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。 如图,这里有8个发光二极管,到底哪个亮需要进行片选。 段选:8段数码管每一段的控制段叫段选 位选:就是进行哪个8段数码管亮的选择 TX-1C使用两片锁存器74HC573实现位选和段选 这里的D0"7是连在单片机的I/O口上,当为高电平时,Q与D中的数据一致,遇到负跳变沿时Q中的 数据保持住,D中的数据即使变化也不会影响Q。 MCU Version2使用的是74HC245和38译码器74HC138 74HC245有一个缓冲和驱动的作用,这样可以使led显示的更加稳定, 数码管显示分动态显示和静态显示,每个数码管的状态都是被不断更新的,利用的人的视觉暂留, 使看上去数值保持在一个固定的位置上,人的视觉是有延续性的,当一个东西不断变化时,变化 的时间小于人眼的视觉暂留时间的话,人的眼睛会以为这个东西是连续的。静态显示是一幅画面 放在那看上去是不动的而它确实是不动的。动态扫描显示即轮流向各位数码管送出字型码和相应 位选,利用发光管的余晖和视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 静态显示: 数码管从左向右依次点亮: #include <reg52.h> void delay(){ int i,j; for(i = 0; i < 0xff; i++) for(j = 0; j < 0xff; j++) ; } unsigned int code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07}; unsigned int code wei[]={ 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; void main(){ while(1){ int i; P2 = 0x39; for(i = 0; i < 8; i++){ P2 = duan[ i]; P1 = wei[ i]; delay(); } } } 想让哪个数码管亮多少就亮多少: #include <reg52.h> void delay(){ int i,j; for(i = 0; i < 0xff; i++) for(j = 0; j < 0xff; j++) ; } unsigned char code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char code wei[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void show(unsigned char we,unsigned char du){ P1 = wei[we]; P2 = duan[du]; delay(); } void main(){ while(1){ show(1,5); } } 动态显示: 3个数码管从0"999计数。 #include <reg52.h> unsigned int code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; unsigned int code wei[]={ 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; unsigned int num,sum; void delay(int k){ int i,j; for(i = 0; i < k; i++) for(j = 0; j < 0xff; j++) ; } void display(unsigned int bai, unsigned int shi, unsigned int ge){ P1 = 0x0; P2 = duan[bai]; delay(1); //少延时一些数码管更亮,如果延时很大就 P1 = 0x1; //变成静态的了 P2 = duan[shi]; delay(1); P1 = 0x2; P2 = duan[ge]; delay(1); } void main(){ EA = 1; ET1 = 1; TMOD = 0x10; TR1 = 1; num = 0; sum = 0; TH1 = (65535 - 50000) / 256; TL1 = (65535 - 50000) % 256; while(1){ if(num == 20){ //每一秒计数增加1 num = 0; if(sum == 1000) sum = 0; //用3位数码管显示,当达到1000时从头显示 sum++; } display(sum/100,sum%100/10,sum%10); } } void time1() interrupt 3{ TH1 = (65535 - 50000) / 256; TL1 = (65535 - 50000) % 256; num++; } #include <reg52.h> unsigned char code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D}; void delay(int k){ int i,j; for(i = 0; i < k; i++) for(j = 0; j < 0xff; j++) ; } void display(){ int i; for(i = 1; i < 7; i++){ P1 = i-1; P2 = duan[7-i]; delay(1); } } void main(){ while(1){ display(); } } #include <reg52.h> unsigned int num,sum; unsigned int code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f}; void delay(int m){ int i,j; for(i = 0; i < m; i++) for(j = 0; j < 0xff; j++) ; } void display(int n1,int n2,int n3){ P1 = 0; P2 = duan[n1]; delay(1); P1 = 1; P2 = duan[n2]; delay(1); P1 = 2; P2 = duan[n3]; delay(1); } void main(){ EA = 1; ET1 = 1; TMOD = 0x10; TR1 = 1; sum = 0; num = 0; TH1 = (65535 - 50000) / 256; TL1 = (65535 - 50000) % 256; while(1){ if(num == 1){ num = 0; sum++; } if(sum == 1000) sum = 0; display(sum/100,sum%100/10,sum%10); } } void time1() interrupt 3{ TH1 = (65535 - 10000) / 256; TL1 = (65535 - 10000) % 256; num++; } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |