4.1.數(shù)碼管顯示原理
(來源:CSDN,原文鏈接:[https://blog.csdn.net/qq_42189951/article/details/133347707]
數(shù)碼管的顯示原理是由多個發(fā)光的二極管共陰極或者共陽極組成的成“8”字形的顯示器件。數(shù)碼管通過不同的組合可用來顯示數(shù)字0~9、字符A ~ F及小數(shù)點“.”。數(shù)碼管的工作原理是通過控制外部的I/O端口進行驅(qū)動數(shù)碼管的各個段碼,使用不同的段碼從而形成字符顯示出我們要的數(shù)字。數(shù)碼管實際上是由七個發(fā)光管組成8字形構(gòu)成的,加上小數(shù)點就是8個。這些段分別由字母A、B、C、D、E、F、G、DP來表示。
當數(shù)碼管特定的引腳加上高電平后,這些特定的發(fā)光二極管就會發(fā)亮,以形成我們眼睛看到的字樣了。如:在一個共陰極數(shù)碼管上顯示一個“8”字,那么就對A、B、C、D、E、F、G對應(yīng)的引腳置高電平。發(fā)光二極管的陽極共同連接至電源的正極稱為共陽極數(shù)碼管,這種類型的數(shù)碼管點亮需要對引腳置低電平;發(fā)光二極管的陰極共同連接到電源的負極稱為共陰極數(shù)碼管,點亮共陰極數(shù)碼管需要對相應(yīng)的引腳置高電平。常用LED數(shù)碼管顯示的數(shù)字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
圖4-1 數(shù)碼管模型圖
共陽極數(shù)碼管的8個發(fā)光二極管的陽極(二極管正端)連接在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅(qū)動電路輸出端。當某段驅(qū)動電路的輸出端為低電平時,則該端所連接的字段導通并點亮。根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時,要求段驅(qū)動電路能吸收額定的段導通電流,還需根據(jù)外接電源及額定段導通電流來確定相應(yīng)的限流電阻。
共陰極數(shù)碼管的8個發(fā)光二極管的陰極(二極管負端)連接在一起。通常,公共陰極接低電平(一般接地),其它管腳接段驅(qū)動電路輸出端。當某段驅(qū)動電路的輸出端為高電平時,則該端所連接的字段導通并點亮,根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時,要求段驅(qū)動電路能提供額定的段導通電流,還需根據(jù)外接電源及額定段導通電流來確定相應(yīng)的限流電阻。
4.2.數(shù)碼管原理圖與實物圖
如果數(shù)碼管可以顯示多位數(shù)字,如我們的電壓電流表所示。那么除了控制段碼來選擇要顯示的內(nèi)容,還要選擇位碼來控制某一個數(shù)碼管的亮滅。
圖4-2 電壓電流表三位數(shù)碼管
數(shù)碼管的原理圖如下,可以看出除了上述的段碼引腳之外,還有COM1、COM2、COM3的位碼引腳,三個位碼引腳分別控制三個數(shù)碼管的亮滅情況,且低電平有效。
圖4-3 三位數(shù)碼管原理圖
4.3.數(shù)碼管驅(qū)動顯示
驅(qū)動顯示數(shù)碼管的思路是:先將A、B、C、D、E、F、G所代表的引腳從低到高編號,列出數(shù)碼要顯示數(shù)字的段碼值。比如要顯示數(shù)字5,則段碼值為0x6d,二進制表示為01101101,這說明G置1,F(xiàn)置1,E置0,D置1,C置1,B置0,A置1,最高位則是DP的值。將要顯示的數(shù)字以段碼值的方式儲存在數(shù)組里以供調(diào)用,可以簡化程序。接著以循環(huán)的方式結(jié)合switch語句對A、B、C、D、E、F、G的亮滅情況進行單獨計算,先將段碼值確定后再進行位碼的選擇,可以避免因單片機執(zhí)行程序的時間而造成顯示效果的不足。
具體程序如下,將所有與數(shù)碼管顯示相關(guān)的函數(shù)保存在新建的 Seg_Reg.c 文件
/* 共陰數(shù)碼管編碼表:
0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
0 1 2 3 4 5 6 7 8 9
0xbf 0x86 0xdb 0xcf 0xe6 0xed 0xfd 0x87 0xff 0xef
0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */
uint8_t Seg_Table[20] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};
/*對段碼值進行存儲*/
void Seg_Init(void) //查找原理圖對數(shù)碼管相關(guān)引腳進行初始化
{
__RCC_GPIOA_CLK_ENABLE();//打開GPIOA的時鐘
__RCC_GPIOB_CLK_ENABLE();//打開GPIOB的時鐘
__RCC_GPIOC_CLK_ENABLE();//打開GPIOC的時鐘
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pins = GPIO_PIN_0 | GPIO_PIN_4; //PA00,E;PA04,G
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pins = GPIO_PIN_6 | GPIO_PIN_4 | GPIO_PIN_2 | GPIO_PIN_0 | GPIO_PIN_3 | GPIO_PIN_7; //PB06,B;PB04,C;PB02,D;PB00,F;PB03,DP //PB07,COM1
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pins = GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2; //PC04,A; //PC03,COM2;PC02,COM3
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
}
void Seg_Dis(uint8_t Pos,uint8_t Num) //Pos表示指定哪一個數(shù)碼管亮,Num表示要顯示的數(shù)字
{
int i;
uint8_t Dis_Value,Location;
Location = Pos;
Dis_Value = Seg_Table[Num];
for(i = 0; i < 8; i++) //通過循環(huán)確定每一個段碼引腳的亮滅情況
{
switch(i)
{
/*將Dis_Value右移i位,再和0x01(00000001)相與消除其他位的影響,可以確定該位的寫入值,
學員可以自己用一個實例比如0x6d(01101101)進行分析*/
case 0:
GPIO_WritePin(CW_GPIOC,GPIO_PIN_4,(Dis_Value > > i) & 0x01); //PC04,A
break;
case 1:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_6,(Dis_Value > > i) & 0x01); //PB06,B
break;
case 2:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_4,(Dis_Value > > i) & 0x01); //PB04,C
break;
case 3:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,(Dis_Value > > i) & 0x01); //PB02,D
break;
case 4:
GPIO_WritePin(CW_GPIOA,GPIO_PIN_0,(Dis_Value > > i) & 0x01); //PA00,E
break;
case 5:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_0,(Dis_Value > > i) & 0x01); //PB00,F
break;
case 6:
GPIO_WritePin(CW_GPIOA,GPIO_PIN_4,(Dis_Value > > i) & 0x01); //PA04,G
break;
case 7:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,(Dis_Value > > i) & 0x01); //PB03,DP
break;
default:
break;
}
}
switch(Location) //確定段碼后再選擇位碼
{
case 0:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_RESET); //PB07,COM1
GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET); //PC03,COM2
GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET); //PC02,COM3
break;
case 1:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET); //PB07,COM1
GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_RESET); //PC03,COM2
GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET); //PC02,COM3
break;
case 2:
GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET); //PB07,COM1
GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET); //PC03,COM2
GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_RESET); //PC02,COM3
break;
default:
break;
}
}
在主函數(shù)里調(diào)用Seg_Dis函數(shù)即可在對應(yīng)位置顯示相應(yīng)數(shù)字(別忘了初始化),各位學員熟練之后可以通過define定義每個引腳的寫入,使代碼更加簡潔美觀。程序下載接線如圖4-4所示:
圖4-4 電壓電流表程序下載接線
4.4.實驗效果
最終的實驗效果如下圖所示:
圖4-5 數(shù)碼管顯示實驗效果
審核編輯 黃宇
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1889瀏覽量
92288 -
電壓電流表
+關(guān)注
關(guān)注
0文章
25瀏覽量
2172 -
驅(qū)動顯示
+關(guān)注
關(guān)注
1文章
4瀏覽量
3581 -
CW32
+關(guān)注
關(guān)注
1文章
242瀏覽量
1124
發(fā)布評論請先 登錄
CW32數(shù)字電壓電流表-產(chǎn)品硬件設(shè)計要點

CW32數(shù)字電壓電流表軟件教程(三):數(shù)碼管顯示數(shù)字

CW32數(shù)字電壓電流表軟件教程(五):ADC采樣及顯示

數(shù)字電壓表設(shè)計實驗(并行AD 數(shù)據(jù)采集與顯示)

數(shù)碼管流動顯示數(shù)字3
數(shù)碼管閃爍顯示數(shù)字
CW32數(shù)字電壓電流表-產(chǎn)品制作注意事項

CW32數(shù)字電壓電流表軟件教程-實驗四:數(shù)碼管動態(tài)顯示

CW32數(shù)字電壓電流表軟件教程-實驗五:ADC采樣及顯示

CW32數(shù)字電壓電流表軟件教程-實驗七:基本數(shù)據(jù)處理算法(均值濾波)
CW32數(shù)字電壓電流表軟件進階教程-2.電壓電流值做均值濾波
CW32數(shù)字電壓電流表軟件進階教程-3.電壓電流標定

基于CW32F003E4P7的數(shù)字電壓電流表產(chǎn)品方案

評論