共陰極是指所有發(fā)光二極管陰極連接在一起,這個共陰極可以用來做片選。 如圖,這里有8個發(fā)光二極管,到底哪個亮需要進行片選。 段選:8段數(shù)碼管每一段的控制段叫段選 位選:就是進行哪個8段數(shù)碼管亮的選擇 TX-1C使用兩片鎖存器74HC573實現(xiàn)位選和段選 這里的D0"7是連在單片機的I/O口上,當(dāng)為高電平時,Q與D中的數(shù)據(jù)一致,遇到負(fù)跳變沿時Q中的 數(shù)據(jù)保持住,D中的數(shù)據(jù)即使變化也不會影響Q。 MCU Version2使用的是74HC245和38譯碼器74HC138 74HC245有一個緩沖和驅(qū)動的作用,這樣可以使led顯示的更加穩(wěn)定, 數(shù)碼管顯示分動態(tài)顯示和靜態(tài)顯示,每個數(shù)碼管的狀態(tài)都是被不斷更新的,利用的人的視覺暫留, 使看上去數(shù)值保持在一個固定的位置上,人的視覺是有延續(xù)性的,當(dāng)一個東西不斷變化時,變化 的時間小于人眼的視覺暫留時間的話,人的眼睛會以為這個東西是連續(xù)的。靜態(tài)顯示是一幅畫面 放在那看上去是不動的而它確實是不動的。動態(tài)掃描顯示即輪流向各位數(shù)碼管送出字型碼和相應(yīng) 位選,利用發(fā)光管的余暉和視覺暫留作用,使人的感覺好像各位數(shù)碼管同時都在顯示。 靜態(tài)顯示: 數(shù)碼管從左向右依次點亮: #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(); } } } 想讓哪個數(shù)碼管亮多少就亮多少: #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); } } 動態(tài)顯示: 3個數(shù)碼管從0"999計數(shù)。 #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); //少延時一些數(shù)碼管更亮,如果延時很大就 P1 = 0x1; //變成靜態(tài)的了 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){ //每一秒計數(shù)增加1 num = 0; if(sum == 1000) sum = 0; //用3位數(shù)碼管顯示,當(dāng)達到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++; } 李萬鵬 |