共陽極數組0~9:display[]={0xC0,0xF9,0xA4,0xB0,0x91,0xA2,0x82,0xF8,0x80,0x90}
共陽極數組A~F:display[]={0x88,0x83,0xA6,0xC1,0x86,0x8E}
共陰極數組0~9:display[]={0x3F,0x06,0x5B,0x4F,0x6E,0x6D,0x7D,0x07,0x7F,0x6F}
共陰極數組A~F:display[]={0x77,0x7C,0x59,0x3E,0x79,0x71}
共陰、兩組四位一體數碼管,位選接74LS138譯碼器,輸入(位選)CBA接P20,P21,P22。段選通過74573后接P1口。
若不使用譯碼器,可直接將位選段接IO口,賦值改變。
/*******************************************************************************
2 * 實 驗 名 : 動態(tài)數碼管顯示
3 * 實驗說明 : 8位數碼管依次顯示0~7
*******************************************************************************/
8 #include
9
10 #define GPIO_DIG P1 //Digitron 數碼管
11 sbit LSA= P2^0;
12 sbit LSB= P2^1;
13 sbit LSC= P2^2;
14
15 unsigned char code DIG_CODE[10]={
16 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的顯示碼
17 void DigDisplay();
18
19 void main(void)
20 {
21 while(1)
22 DigDisplay();
23 }
24
25
26 void DigDisplay()
27 {
28 unsigned char i;
29 unsigned int j;
30 for(i=0;i<8;i++)
31 {
32 switch(i) //位選,選擇點亮的數碼管,
33 {
34 case(0):
35 LSA=0;LSB=0;LSC=0; break;//顯示第0位
36 case(1):
37 LSA=1;LSB=0;LSC=0; break;//顯示第1位
38 case(2):
39 LSA=0;LSB=1;LSC=0; break;//顯示第2位
40 case(3):
41 LSA=1;LSB=1;LSC=0; break;//顯示第3位
42 case(4):
43 LSA=0;LSB=0;LSC=1; break;//顯示第4位
44 case(5):
45 LSA=1;LSB=0;LSC=1; break;//顯示第5位
46 case(6):
47 LSA=0;LSB=1;LSC=1; break;//顯示第6位
48 case(7):
49 LSA=1;LSB=1;LSC=1; break;//顯示第7位
50 }
51 GPIO_DIG=DIG_CODE[i];//發(fā)送段碼
52 j=10000; //掃描間隔時間設定,若減少j,可觀察到穩(wěn)定顯示的0~7 (掃描速度太快,人眼識別不了)
53 while(j--);
54 GPIO_DIG=0x00;//消隱
55 }
56 }
1 /*******************************************************************************
2 * 實 驗 名 : 數碼管秒表顯示
3 * 實驗說明 : 0~59依次顯示
*******************************************************************************/
8 #include
9
10 #define GPIO_DIG P1 //Digitron 數碼管
11 #define uchar unsigned char
12 #define uint unsigned int
13 sbit LSA= P2^0;
14 sbit LSB= P2^1;
15 sbit LSC= P2^2;
16
17 uchar shi,ge,num1=0,num=0;
18 uchar code DIG_CODE[10]={
19 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的顯示碼
20 void Delay5ms();
21 void DigDisplay(uchar shi,uchar ge);
22
23
24 void main()
25 { //200微秒@20MHz
26 TMOD = 0x01; //設置定時器模式
27 TL0 = 0xA8; //設置定時初值
28 TH0 = 0xFD; //設置定時初值
29 EA = 1; // 開總中斷
30 TF0 = 0; //清除TF0標志
31 ET0 = 1; // 開定時器0中斷
32 TR0 = 1; //定時器0開始計時
33 while(1)
34 {
35 DigDisplay(shi,ge);
36 }
37 }
38
39 void DigDisplay(uchar shi,uchar ge)
40 {
41 GPIO_DIG=DIG_CODE[shi]; //段選
42 LSA=0;LSB=0;LSC=0;
43 Delay5ms();
44 GPIO_DIG=DIG_CODE[ge];
45 LSA=1;LSB=0;LSC=0;
46 Delay5ms();
47 }
48
49 void Timer0Init(void) interrupt 1
50 {
51 TL0 = 0xA8; //重裝初
52 TH0 = 0xFD;
53 num1++;
54 if(num1==200) //5次200ms即為1s到
55 {
56 num1=0;
57 num++;
58 if(num==60)
59 num=0;
60 shi=num/10;
61 ge = num%10;
62 }
63 }
64
65
66 void Delay5ms() //@12.000MHz
67 {
68 unsigned char i, j;
69
70 i = 59;
71 j = 90;
72 do
73 {
74 while (--j);
75 } while (--i);
76 }