四位共阳极数码管显示函数_【项目8-任务10-小组13】利用四位数码管实现动态扫描显示...
學習任務
1、四位數碼管的電路結構與顯示原理
(什么是位選、什么是段選、共陰與共陽的區別、顯示4位數字,需要多少條口線?顯示n位數字呢?)
2、Arduino直接連接四位數碼管實現四位阿拉伯數字顯示
(Friting繪制電路圖(注意每個段都要加470歐姆限流電阻),程序原理說明,包含完整注釋的源代碼)
首先主要是介紹要完成四位數碼管的動態掃描顯示所需要了解并掌握的四位數碼管的電路結構與顯示原理。
一、位選與段選
圖1.jpg
以一位的7段數碼管為例,如圖1所示,一位的數碼管加上小數點一共是8個需要控制的發光管,分別是a、b、c、d、e、f、g、dp,由8個引腳分別控制他們的亮滅,也就是說一個引腳控制一個發光管,那么這就是段選。發光的二極管是有兩端的,那么這8個發光的二極管有一個公共端,這樣就可以控制一位數碼管整體,這就是位選。
圖2.jpg
由一位數碼管延伸到四位數碼管時,如圖2所示,每一個發光管都有相應的引腳控制,每一位的數碼管都有自己的公共端,通過公共端來控制哪一位的數碼管亮或者是滅,這就是位選。
二、共陰與共陽的區別
一位的數碼管相當于是由8個發光二極管拼成的,二極管有兩個極,也就是陰極和陽極。
圖3.jpg
圖4.jpg
共陰數碼管(如圖4),也就是把所有組成這一位數碼管的二極管的陰極都接在一起,想要點亮數碼管中的某一段,就將com段(所有段的共同的陰極)接地,也就是低電平,然后把相應的陽極(a、b、c…….)接高電平,這樣這一段就會被點亮。
圖5.jpg
共陽數碼管(如圖5),也就是把所有組成這一位數碼管的二極管的陽極都接在一起,想要點亮數碼管中的某一段,就將com段(所有段的共同的陽極)接高電平,然后把相應的陰極(a、b、c…….)接地或者是低電平,這樣這一段就會被點亮。
當然,如果拿到一個數碼管不知道是共陽還是共陰,可以用萬用表的蜂鳴檔測試一下或者高低電平接一下即可知道。
三、顯示N位數字的口線數量規律
那么要想使四位數碼管顯示4位數字,需要多少條口線?顯示n位數字呢?能總結出一個規律么?
圖6.jpg
以兩位的共陰數碼管為例(如圖6),先觀察段選,每一位數碼管的相同的段并聯在一起,最后由一個引腳控制,那么每一位有8個二極管,也就是需要并聯8次,最后需要8個口線。對于位選,因為一共是兩位數碼管,所以需要兩個公共端去控制每一位數碼管。這樣就是(8+2)條口線。
圖7.jpg
延伸到四位數碼管(如圖7),同理,對于段選,仍然是每一位數碼管的相同的段并聯在一起,最后由一個引腳控制,那么每一位有8個二極管,也就是需要并聯8次,最后需要8個引腳。對于位選,因為一共是四位數碼管,所以需要四個公共端去控制每一位數碼管。這樣就是(8+4)條口線。
可以看到,N位數碼管,對于段選,不管是多少位的數碼管,由于每一位相同的段都是并聯,都是需要8個口線去控制段;對于位選,有幾位數碼管,就需要幾個公共端去控制。所以N位數碼管顯示N位數字需要(8+N)條口線。
接下來介紹一下我們所使用的四位數碼管主要會有哪些類型,并且他們之間有什么不同。
一、12個引腳的四位數碼管
類型一
圖1.jpg
圖2.jpg
如圖1,2所示,這種四位數碼管是最常見的也是最簡單的,每一位數碼管中相同的段彼此并聯,由8個引腳控制段選,其余4個引腳分別控制四個位選。
類型二
圖3.jpg
圖4.jpg
如圖3,4所示,這種四位數碼管在第二三位中間多了兩點,這是屬于時鐘數碼管,可以用它來顯示時間。以共陰為例,這種的不同之處在于,它將增加的時鐘點的陽極與其他四位的小數點(dp段)的陽極相并聯,然后陰極也就是公共端,與第二位的數碼管的公共端共享。也就是說可以看成是將這兩個時鐘點加入到了第二位的數碼管中,成為它的一部分,這樣使得四位數碼管的引腳數量仍然不發生改變。
二、14個引腳的四位數碼管
圖5.png
圖6.jpg
圖7.jpg
如圖5,6,7,所示,以共陰極為例,這是我們所使用的四位數碼管,也同樣是屬于時鐘數碼管,它之所以會增加兩個引腳是因為它將兩個時鐘點單獨拿出來,陽極并聯使用一個引腳,再使用一個公共端,這個就可以看成是兩個時鐘點的一個位選。
在之前的四位數碼管的顯示原理學習的基礎上,介紹的是利用Arduino直接連接四位數碼管從而實現四位阿拉伯數字顯示。以四位共陰數碼管為例,顯示數字1234。
一、實驗器材
Nano開發板
配套USB數據線
一個四位數碼管
8個470Ω的電阻
若干導線
二、電路連接圖
電路連接圖.jpg
分析:四位數碼管一共有8個引腳控制段選,所以需要每一個引腳串聯一個電阻保證電流的正常流通,使得二極管正常顯示。根據數碼管的引腳圖可對應段選和位選的引腳號,從而通過導線將引腳與nano板相連接,與電腦連接之后,在arduino中編寫代碼即可控制四位數碼管。
三、編寫代碼
#define SEG_B 3 //Arduino Pin3--->SegLed Pin7
#define SEG_C 4 //Arduino Pin4--->SegLed Pin4
#define SEG_D 5 //Arduino Pin5--->SegLed Pin2
#define SEG_E 6 //Arduino Pin6--->SegLed Pin1
#define SEG_F 7 //Arduino Pin7--->SegLed Pin10
#define SEG_G 8 //Arduino Pin8--->SegLed Pin5
#define SEG_H 9 //Arduino Pin9--->SegLed Pin3
#define COM1 13 //Arduino Pin10--->SegLed Pin12
#define COM2 12 //Arduino Pin11--->SegLed Pin9
#define COM3 11 //Arduino Pin12--->SegLed Pin8
#define COM4 10 //Arduino Pin13--->SegLed Pin6
unsigned char table[10][8] =
{
{0, 0, 1, 1, 1, 1, 1, 1}, //0
{0, 0, 0, 0, 0, 1, 1, 0}, //1
{0, 1, 0, 1, 1, 0, 1, 1}, //2
{0, 1, 0, 0, 1, 1, 1, 1}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{0, 1, 1, 0, 1, 1, 0, 1}, //5
{0, 1, 1, 1, 1, 1, 0, 1}, //6
{0, 0, 0, 0, 0, 1, 1, 1}, //7
{0, 1, 1, 1, 1, 1, 1, 1}, //8
{0, 1, 1, 0, 1, 1, 1, 1} //9
};
void setup()
{
pinMode(SEG_A,OUTPUT); //設置為輸出引腳
pinMode(SEG_B,OUTPUT);
pinMode(SEG_C,OUTPUT);
pinMode(SEG_D,OUTPUT);
pinMode(SEG_E,OUTPUT);
pinMode(SEG_F,OUTPUT);
pinMode(SEG_G,OUTPUT);
pinMode(SEG_H,OUTPUT);
pinMode(COM1,OUTPUT);
pinMode(COM2,OUTPUT);
pinMode(COM3,OUTPUT);
pinMode(COM4,OUTPUT);
}
void loop()
{
Display(1,1); //第1位顯示1
Delay(10);
Display(2,2); //第2位顯示2
Delay(10);
Display(3,3); //第3位顯示3
Delay(10);
Display(4,4); //第4位顯示4
Delay(10);
}
void Display(unsigned char com, unsigned char num)
{
digitalWrite(SEG_A,LOW);
digitalWrite(SEG_B,LOW);
digitalWrite(SEG_C,LOW);
digitalWrite(SEG_D,LOW);
digitalWrite(SEG_E,LOW);
digitalWrite(SEG_F,LOW);
digitalWrite(SEG_G,LOW);
digitalWrite(SEG_H,LOW);
switch(com) //選通位選
{
case 1:
digitalWrite(COM1,LOW); //選擇位1
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 2:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,LOW); //選擇位2
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 3:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,LOW); //選擇位3
digitalWrite(COM4,HIGH);
break;
case 4:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,LOW); //選擇位4
break;
default:break;
}
digitalWrite(SEG_A,table[num][7]); //a查詢碼值表
digitalWrite(SEG_B,table[num][6]);
digitalWrite(SEG_C,table[num][5]);
digitalWrite(SEG_D,table[num][4]);
digitalWrite(SEG_E,table[num][3]);
digitalWrite(SEG_F,table[num][2]);
digitalWrite(SEG_G,table[num][1]);
digitalWrite(SEG_H,table[num][0]);
}
四、代碼分析
首先,定義數碼管a段是接引腳2,b段是接引腳3……以此類推定義完段選,之后再定義位選,1位數碼管的公共端接13……同樣以此類推。
#define SEG_A 2 //Arduino Pin2--->SegLed Pin11
#define SEG_B 3 //Arduino Pin3--->SegLed Pin7
#define SEG_C 4 //Arduino Pin4--->SegLed Pin4
#define SEG_D 5 //Arduino Pin5--->SegLed Pin2
#define SEG_E 6 //Arduino Pin6--->SegLed Pin1
#define SEG_F 7 //Arduino Pin7--->SegLed Pin10
#define SEG_G 8 //Arduino Pin8--->SegLed Pin5
#define SEG_H 9 //Arduino Pin9--->SegLed Pin3
#define COM1 13 //Arduino Pin10--->SegLed Pin12
#define COM2 12 //Arduino Pin11--->SegLed Pin9
#define COM3 11 //Arduino Pin12--->SegLed Pin8
#define COM4 10 //Arduino Pin13--->SegLed Pin6
定義一個可以查詢的碼值表,因為使用的是共陰四位數碼管,用0表示低電平,用1表示高電平,從而將0~9這10個數字顯示時,數碼管的陽極的一端的高低電平的狀態表示出來。例如,當想要顯示數字1時,那么a段與b段的陽極是高電平,那么a段與b段的二極管將會點亮,其余的是熄滅狀態,那么就會顯示數字1。
unsigned char table[10][8] =
{
{0, 0, 1, 1, 1, 1, 1, 1}, //0
{0, 0, 0, 0, 0, 1, 1, 0}, //1
{0, 1, 0, 1, 1, 0, 1, 1}, //2
{0, 1, 0, 0, 1, 1, 1, 1}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{0, 1, 1, 0, 1, 1, 0, 1}, //5
{0, 1, 1, 1, 1, 1, 0, 1}, //6
{0, 0, 0, 0, 0, 1, 1, 1}, //7
{0, 1, 1, 1, 1, 1, 1, 1}, //8
{0, 1, 1, 0, 1, 1, 1, 1} //9
};
利用setup函數定義所連接的引腳為輸出引腳
void setup()
{
pinMode(SEG_A,OUTPUT); //設置為輸出引腳
pinMode(SEG_B,OUTPUT);
pinMode(SEG_C,OUTPUT);
pinMode(SEG_D,OUTPUT);
pinMode(SEG_E,OUTPUT);
pinMode(SEG_F,OUTPUT);
pinMode(SEG_G,OUTPUT);
pinMode(SEG_H,OUTPUT);
pinMode(COM1,OUTPUT);
pinMode(COM2,OUTPUT);
pinMode(COM3,OUTPUT);
pinMode(COM4,OUTPUT);
}
4.用loop函數來定義第一位顯示1,第二位顯示2,第三位顯示3,第四位顯示4,每一個顯示后面都加了一個delay,用來表示顯示延時10秒鐘。又因為loop函數是一個死循環體,那么它會一直循環執行函數里面的內容。
void loop()
{
Display(1,1); //第1位顯示1
Delay(10);
Display(2,2); //第2位顯示2
Delay(10);
Display(3,3); //第3位顯示3
Delay(10);
Display(4,4); //第4位顯示4
Delay(10);
}
定義display這個函數,首先利用digitalWrite函數將共陰數碼管的8個段的陽極設置為低電平,作用是為了將所有的二極管熄滅,起到置零的作用。
之后利用switch函數來定義位選,因為是以顯示1234為例,那么當只讓第一位亮起數字1時,就將第一位的公共端(com端)設置為低電平,其余設置為高電平;當只讓第二位亮起數字2時,就將第二位的公共端(com端)設置為低電平……
最后,定義完位選后,用digitalWrite來定義段選,利用之前定義好的碼值表,當顯示數字1時,查詢碼值表找到相應的每一個段(a、b、c……)分別是高電平還是低電平,然后將這個信號發送到每一個段的對應的引腳上來控制二極管的亮滅狀態。
void Display(unsigned char com, unsigned char num)
{
digitalWrite(SEG_A,LOW);
digitalWrite(SEG_B,LOW);
digitalWrite(SEG_C,LOW);
digitalWrite(SEG_D,LOW);
digitalWrite(SEG_E,LOW);
digitalWrite(SEG_F,LOW);
digitalWrite(SEG_G,LOW);
digitalWrite(SEG_H,LOW);
switch(com) //選通位選
{
case 1:
digitalWrite(COM1,LOW); //選擇位1
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 2:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,LOW); //選擇位2
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 3:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,LOW); //選擇位3
digitalWrite(COM4,HIGH);
break;
case 4:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,LOW); //選擇位4
break;
default:break;
}
digitalWrite(SEG_A,table[num][7]); //a查詢碼值表
digitalWrite(SEG_B,table[num][6]);
digitalWrite(SEG_C,table[num][5]);
digitalWrite(SEG_D,table[num][4]);
digitalWrite(SEG_E,table[num][3]);
digitalWrite(SEG_F,table[num][2]);
digitalWrite(SEG_G,table[num][1]);
digitalWrite(SEG_H,table[num][0]);
}
五、實驗現象
實物連接圖.jpg
實物連接圖2.jpg
輸入代碼之后,觀察四位數碼管,先第一位10秒顯示數字1,第二位10秒顯示數字2,第三位10秒顯示數字3,第一位10秒顯示數字4,之后一次再循環點亮數字1,2,3,4……
六、實驗總結
為什么不是直接顯示數字1234的靜態顯示,而是數字循環出現?
首先,根據四位數碼管的引腳圖可以知道,每一位相同的段是并聯在一起然后連到一個相同的引腳,信號會發送到每一個段的引腳上來控制段的點亮還是熄滅。假如是同時顯示四位數字的話,那么引腳一次只能傳遞高電平和低電平的其中一種,會使每一位相同的段具有相同的電平,但是顯示不同的數字,段的狀態是不同的,這就產生了矛盾。所以四位數碼管在顯示的時候,是先將第一位的數碼管的所有段的信號通過引腳傳送之后,在傳送第二位需要的信號,一直到第四位。
其次,要注意代碼中使用loop函數來定義第一位顯示1,第二位顯示2,第三位顯示3,第四位顯示4,每一個顯示后面都加了一個delay,用來表示顯示延時10秒鐘。又因為loop函數是一個死循環體,那么它會一直循環執行函數里面的內容。假如將delay去掉,實驗的現象是看上去數字1234是同時顯示的,其實仍是1234在循環顯示,只是速度太快,產生視覺暫留效應給我們的眼睛產生了錯覺。
總結
以上是生活随笔為你收集整理的四位共阳极数码管显示函数_【项目8-任务10-小组13】利用四位数码管实现动态扫描显示...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle tabe unlock_O
- 下一篇: python查找指定文件路径_Pytho