4.1.數碼管顯示原理
(來源:CSDN,原文鏈接:[https://blog.csdn.net/qq_42189951/article/details/133347707]
數碼管的顯示原理是由多個發光的二極管共陰極或者共陽極組成的成“8”字形的顯示器件。數碼管通過不同的組合可用來顯示數字0~9、字符A ~ F及小數點“.”。數碼管的工作原理是通過控制外部的I/O端口進行驅動數碼管的各個段碼,使用不同的段碼從而形成字符顯示出我們要的數字。數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個。這些段分別由字母A、B、C、D、E、F、G、DP來表示。
當數碼管特定的引腳加上高電平后,這些特定的發光二極管就會發亮,以形成我們眼睛看到的字樣了。如:在一個共陰極數碼管上顯示一個“8”字,那么就對A、B、C、D、E、F、G對應的引腳置高電平。發光二極管的陽極共同連接至電源的正極稱為共陽極數碼管,這種類型的數碼管點亮需要對引腳置低電平;發光二極管的陰極共同連接到電源的負極稱為共陰極數碼管,點亮共陰極數碼管需要對相應的引腳置高電平。常用LED數碼管顯示的數字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
圖4-1 數碼管模型圖
共陽極數碼管的8個發光二極管的陽極(二極管正端)連接在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅動電路輸出端。當某段驅動電路的輸出端為低電平時,則該端所連接的字段導通并點亮。根據發光字段的不同組合可顯示出各種數字或字符。此時,要求段驅動電路能吸收額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。
共陰極數碼管的8個發光二極管的陰極(二極管負端)連接在一起。通常,公共陰極接低電平(一般接地),其它管腳接段驅動電路輸出端。當某段驅動電路的輸出端為高電平時,則該端所連接的字段導通并點亮,根據發光字段的不同組合可顯示出各種數字或字符。此時,要求段驅動電路能提供額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。
4.2.數碼管原理圖與實物圖
如果數碼管可以顯示多位數字,如我們的電壓電流表所示。那么除了控制段碼來選擇要顯示的內容,還要選擇位碼來控制某一個數碼管的亮滅。
圖4-2 電壓電流表三位數碼管
數碼管的原理圖如下,可以看出除了上述的段碼引腳之外,還有COM1、COM2、COM3的位碼引腳,三個位碼引腳分別控制三個數碼管的亮滅情況,且低電平有效。
圖4-3 三位數碼管原理圖
4.3.數碼管驅動顯示
驅動顯示數碼管的思路是:先將A、B、C、D、E、F、G所代表的引腳從低到高編號,列出數碼要顯示數字的段碼值。比如要顯示數字5,則段碼值為0x6d,二進制表示為01101101,這說明G置1,F置1,E置0,D置1,C置1,B置0,A置1,最高位則是DP的值。將要顯示的數字以段碼值的方式儲存在數組里以供調用,可以簡化程序。接著以循環的方式結合switch語句對A、B、C、D、E、F、G的亮滅情況進行單獨計算,先將段碼值確定后再進行位碼的選擇,可以避免因單片機執行程序的時間而造成顯示效果的不足。
具體程序如下,將所有與數碼管顯示相關的函數保存在新建的 Seg_Reg.c 文件
/* 共陰數碼管編碼表:
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) //查找原理圖對數碼管相關引腳進行初始化
{
__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表示指定哪一個數碼管亮,Num表示要顯示的數字
{
int i;
uint8_t Dis_Value,Location;
Location = Pos;
Dis_Value = Seg_Table[Num];
for(i = 0; i < 8; i++) //通過循環確定每一個段碼引腳的亮滅情況
{
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;
}
}
在主函數里調用Seg_Dis函數即可在對應位置顯示相應數字(別忘了初始化),各位學員熟練之后可以通過define定義每個引腳的寫入,使代碼更加簡潔美觀。程序下載接線如圖4-4所示:
圖4-4 電壓電流表程序下載接線
4.4.實驗效果
最終的實驗效果如下圖所示:
圖4-5 數碼管顯示實驗效果
審核編輯 黃宇
-
數碼管
+關注
關注
32文章
1882瀏覽量
91122 -
電壓電流表
+關注
關注
0文章
25瀏覽量
2078 -
驅動顯示
+關注
關注
1文章
4瀏覽量
3525 -
CW32
+關注
關注
1文章
203瀏覽量
641
發布評論請先 登錄
相關推薦
評論