C51 動態數碼管 個人筆記
阿新 • • 發佈:2018-11-09
pla pre switch oid ++ efi 開發 led 數字
8段led管構成一個數字。
開發板上共有8個數字。
每個數字有一個使能端(段選引腳)
每個數字的位選端(選擇8段led管哪些亮,即構成什麽圖案)並聯在一起
輪流點亮不同數字,速度很快,視覺暫留,從而形成8個數字同時亮的效果
#include <reg51.h> typedef unsigned int u16; typedef unsigned char u8; #define DIG P0 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; //共陰的表 u8 code ledSegment [9] = { 0x3f , 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0xe6 }; void delay(u16 i) { while(i--); } void DigDisplay() { u8 i; for(i=0;i<8;i++) { //段選,使能8個數碼管中的某一個 //38譯碼器輸出端和動態數碼管段選端短接 switch(i) { case (0): //段選選中第一個動態數碼管,(共陰,J16^1是公共陰極,輸出低電平) LSA = 0; //J15(38譯碼器輸出)和J16(數碼管輸入)用短接片短接 LSB = 0; //故J15^1即38譯碼器輸出端Y0與J16^1相同,為低電平 LSC = 0; //因此38譯碼器輸入端為000(由真值表知A0是低位,A2是高位) break; case (1): LSC = 0;LSB = 0;LSA = 1;break; case (2): LSC = 0;LSB = 1;LSA = 0;break; case (3): LSC = 0;LSB = 1;LSA = 1;break; case (4): LSC = 1;LSB = 0;LSA = 0;break; case (5): LSC = 1;LSB = 0;LSA = 1;break; case (6): LSC = 1;LSB = 1;LSA = 0;break; case (7): LSC = 1;LSB = 1;LSA = 1;break; } //--位選,選擇被使能的數碼管中,哪幾段點亮,(顯示什麽數字) //P0端口控制動態數碼管的8個位選引腳J12 DIG = ledSegment[i]; // 共陰,高電平有效 delay(200); //短暫延時1ms (去掉或改變時間長度可能會變亮變暗) DIG = 0x00; } } void main(void) { while(1) { DigDisplay(); } }
C51 動態數碼管 個人筆記