4.1.數(shù)碼管顯示原理
(來源:CSDN,原文鏈接:[https://blog.csdn.net/qq_42189951/article/details/133347707]
數(shù)碼管的顯示原理是由多個(gè)發(fā)光的二極管共陰極或者共陽極組成的成“8”字形的顯示器件。數(shù)碼管通過不同的組合可用來顯示數(shù)字0~9、字符A ~ F及小數(shù)點(diǎn)“.”。數(shù)碼管的工作原理是通過控制外部的I/O端口進(jìn)行驅(qū)動(dòng)數(shù)碼管的各個(gè)段碼,使用不同的段碼從而形成字符顯示出我們要的數(shù)字。數(shù)碼管實(shí)際上是由七個(gè)發(fā)光管組成8字形構(gòu)成的,加上小數(shù)點(diǎn)就是8個(gè)。這些段分別由字母A、B、C、D、E、F、G、DP來表示。
當(dāng)數(shù)碼管特定的引腳加上高電平后,這些特定的發(fā)光二極管就會(huì)發(fā)亮,以形成我們眼睛看到的字樣了。如:在一個(gè)共陰極數(shù)碼管上顯示一個(gè)“8”字,那么就對(duì)A、B、C、D、E、F、G對(duì)應(yīng)的引腳置高電平。發(fā)光二極管的陽極共同連接至電源的正極稱為共陽極數(shù)碼管,這種類型的數(shù)碼管點(diǎn)亮需要對(duì)引腳置低電平;發(fā)光二極管的陰極共同連接到電源的負(fù)極稱為共陰極數(shù)碼管,點(diǎn)亮共陰極數(shù)碼管需要對(duì)相應(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個(gè)發(fā)光二極管的陽極(二極管正端)連接在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸出端為低電平時(shí),則該端所連接的字段導(dǎo)通并點(diǎn)亮。根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能吸收額定的段導(dǎo)通電流,還需根據(jù)外接電源及額定段導(dǎo)通電流來確定相應(yīng)的限流電阻。
共陰極數(shù)碼管的8個(gè)發(fā)光二極管的陰極(二極管負(fù)端)連接在一起。通常,公共陰極接低電平(一般接地),其它管腳接段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸出端為高電平時(shí),則該端所連接的字段導(dǎo)通并點(diǎn)亮,根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能提供額定的段導(dǎo)通電流,還需根據(jù)外接電源及額定段導(dǎo)通電流來確定相應(yīng)的限流電阻。
4.2.數(shù)碼管原理圖與實(shí)物圖
如果數(shù)碼管可以顯示多位數(shù)字,如我們的電壓電流表所示。那么除了控制段碼來選擇要顯示的內(nèi)容,還要選擇位碼來控制某一個(gè)數(shù)碼管的亮滅。
圖4-2 電壓電流表三位數(shù)碼管
數(shù)碼管的原理圖如下,可以看出除了上述的段碼引腳之外,還有COM1、COM2、COM3的位碼引腳,三個(gè)位碼引腳分別控制三個(gè)數(shù)碼管的亮滅情況,且低電平有效。
圖4-3 三位數(shù)碼管原理圖
4.3.數(shù)碼管驅(qū)動(dòng)顯示
驅(qū)動(dòng)顯示數(shù)碼管的思路是:先將A、B、C、D、E、F、G所代表的引腳從低到高編號(hào),列出數(shù)碼要顯示數(shù)字的段碼值。比如要顯示數(shù)字5,則段碼值為0x6d,二進(jìn)制表示為01101101,這說明G置1,F(xiàn)置1,E置0,D置1,C置1,B置0,A置1,最高位則是DP的值。將要顯示的數(shù)字以段碼值的方式儲(chǔ)存在數(shù)組里以供調(diào)用,可以簡化程序。接著以循環(huán)的方式結(jié)合switch語句對(duì)A、B、C、D、E、F、G的亮滅情況進(jìn)行單獨(dú)計(jì)算,先將段碼值確定后再進(jìn)行位碼的選擇,可以避免因單片機(jī)執(zhí)行程序的時(shí)間而造成顯示效果的不足。
具體程序如下,將所有與數(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};
/*對(duì)段碼值進(jìn)行存儲(chǔ)*/
void Seg_Init(void) //查找原理圖對(duì)數(shù)碼管相關(guān)引腳進(jìn)行初始化
{
__RCC_GPIOA_CLK_ENABLE();//打開GPIOA的時(shí)鐘
__RCC_GPIOB_CLK_ENABLE();//打開GPIOB的時(shí)鐘
__RCC_GPIOC_CLK_ENABLE();//打開GPIOC的時(shí)鐘
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表示指定哪一個(gè)數(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)確定每一個(gè)段碼引腳的亮滅情況
{
switch(i)
{
/*將Dis_Value右移i位,再和0x01(00000001)相與消除其他位的影響,可以確定該位的寫入值,
學(xué)員可以自己用一個(gè)實(shí)例比如0x6d(01101101)進(jìn)行分析*/
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ù)即可在對(duì)應(yīng)位置顯示相應(yīng)數(shù)字(別忘了初始化),各位學(xué)員熟練之后可以通過define定義每個(gè)引腳的寫入,使代碼更加簡潔美觀。程序下載接線如圖4-4所示:
圖4-4 電壓電流表程序下載接線
4.4.實(shí)驗(yàn)效果
最終的實(shí)驗(yàn)效果如下圖所示:
圖4-5 數(shù)碼管顯示實(shí)驗(yàn)效果
審核編輯 黃宇
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1883瀏覽量
91364 -
電壓電流表
+關(guān)注
關(guān)注
0文章
25瀏覽量
2095 -
驅(qū)動(dòng)顯示
+關(guān)注
關(guān)注
1文章
4瀏覽量
3535 -
CW32
+關(guān)注
關(guān)注
1文章
218瀏覽量
722
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論