一、LED點陣發(fā)光原理
8*8單色單片機(jī)結(jié)構(gòu)圖如下:
從電路圖中很簡單的就可以看出來,想要點亮點陣中的某一個LED燈。只要使得那個燈所在的行輸出高電平,所在列輸出低電平就好。
二、點陣掃描實驗
1 /***********************************************
2 實驗名稱: 點陣掃描
3 實驗說明: 掃描每個LED燈,檢查點陣是否完好
4 實驗時間: 2014/12/24
5 ***********************************************/
6 #include
7 #include
8
9 #define uchar unsigned char
10 #define uint unsigned int
11
12 sbit MOSIO = P3^4;//輸入口
13 sbit R_CLK = P3^5;//鎖存器時鐘
14 sbit S_CLK = P3^6;//移位寄存器時鐘
15
16 //data3:右邊半塊列數(shù)據(jù);data2:左邊半塊列數(shù)據(jù)
17 //data1:下邊半塊行數(shù)據(jù);data0:上邊半塊行數(shù)據(jù)
18 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0);
19
20 void main()
21 {
22 uint i,j;
23 uchar d;
24
25 while(1)
26 {
27 //全亮
28 HC595Pro(0x00,0x00,0xFF,0xFF);
29 for(i=0;i<40000;i++); //延時40ms
30
31 /*行掃描*/
32 //上半塊行掃描
33 d = 0x01;
34 for(i=0;i<8;i++)
35 {
36 HC595Pro(0x00,0x00,0x00,d);
37 d <<= 1;
38 for(j=0;j<20000;j++); //延時20ms
39 }
40 //下半塊行掃描
41 d = 0x01;
42 for(i=0;i<8;i++)
43 {
44 HC595Pro(0x00,0x00,d,0x00);
45 d <<= 1;
46 for(j=0;j<20000;j++); //延時20ms
47 }
48
49 /*列掃描*/
50 //左半快列掃描
51 d = 0xFE;
52 for(i=0;i<8;i++)
53 {
54 HC595Pro(0xFF,d,0xFF,0xFF);
55 //如果還想用跟行掃描一樣的形式,看main()最下面注釋行
56 d = _crol_(d,1); //循環(huán)左移
57 for(j=0;j<20000;j++); //延時20ms
58 }
59 //右半塊列掃描
60 d = 0xFE;
61 for(i=0;i<8;i++)
62 {
63 HC595Pro(d,0xFF,0xFF,0xFF);
64 d = _crol_(d,1);
65 for(j=0;j<20000;j++); //延時20ms
66 }
67 /******************************************************
68 b1 = 0x01;
69 for(i = 0; i<8; i++)
70 {
71 HC595Pro(0xFF, ~b1, 0xFF, 0xFF);
72 b1 <<= 1;
73 for(j=0; j<20000; j++);
74 }
75
76 b1 = 0x01;
77 for(i = 0; i<8; i++)
78 {
79 HC595Pro(~b1, 0xFF, 0xFF, 0xFF);
80 b1 <<= 1;
81 for(j=0; j<20000; j++);
82 }
83 ******************************************************/
84 }
85 }
86
87 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0)
88 {
89 uchar i;
90 //先移入的會被后面移入的數(shù)據(jù)推移到后面的595中,所以需要先移入data3
91 for(i=0;i<8;i++)
92 {
93 //先移入高位再移入低位,移位寄存器移入的第一位就是輸出的最高位
94 MOSIO = data3 >> 7;
95 data3 <<= 1;
96 S_CLK = 0;//給一個上升沿,移位
97 S_CLK = 1;
98 }
99 for(i=0;i<8;i++)
100 {
101 MOSIO = data2 >> 7;
102 data2 <<= 1;
103 S_CLK = 0;
104 S_CLK = 1;
105 }
106 for(i=0;i<8;i++)
107 {
108 MOSIO = data1 >> 7;
109 data1 <<= 1;
110 S_CLK = 0;
111 S_CLK = 1;
112 }
113 for(i=0;i<8;i++)
114 {
115 MOSIO = data0 >> 7;
116 data0 <<= 1;
117 S_CLK = 0;
118 S_CLK = 1;
119 }
120
121 //上升沿時將移位寄存器數(shù)據(jù)移到鎖存器中用于顯示,平時保持低電平,數(shù)據(jù)不變
122 R_CLK = 0;
123 R_CLK = 1;
124 R_CLK = 0;
125
126 }
這里我用到的是16*16的點陣。其實也就是4個8*8的小點陣組成起來的。其結(jié)構(gòu)圖如下:
1 | 2 |
3 | 4 |
這里只是簡單示意一下。。。其中4個小塊都是與一個相對應(yīng)的74HC595相連。每個74HC595又是級聯(lián)的,入口只有一個,我們需要輸入相對應(yīng)的行,列電平情況來控制LED燈的亮滅。
根據(jù)74HC595的結(jié)構(gòu)可以知道,輸入的數(shù)據(jù)是8位8位的輸入的。最開始輸入的8位數(shù)據(jù)會被后面的輸入數(shù)據(jù)推移到第四個74HC595中。
所以實際輸入時,是先輸入2和4的列數(shù)據(jù),再輸入1和3的列數(shù)據(jù),然后再是3和4的行數(shù)據(jù),最后才是1和2的行數(shù)據(jù)。
三、16*16點陣倒計時
1 /***********************************************************************
2 實驗名稱: 16*16點陣數(shù)字倒計時
3 實驗時間: 2014/12/26
4 ***********************************************************************/
5 #include
6 #include
7
8 #define uchar unsigned char
9 #define uint unsigned int
10
11 sbit MOSIO = P3^4;
12 sbit R_CLK = P3^5;
13 sbit S_CLK = P3^6;
14
15 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0);
16
17 void main()
18 {
19 uint i,c;
20 uchar j;
21 i = 100;
22
23 while(1)
24 {
25 //顯示數(shù)字10
26 for(c=i;c>0;c--)//延時
27 for(j=0;j<16;j++)
28 {
29 //字模取出來的數(shù)據(jù)是跟實際實際所需數(shù)據(jù)相反的,所以要取反。
30 //函數(shù)對應(yīng)的參數(shù)分別表示列2,列1,行2,行1
31 HC595Pro(~tab1[2*j+1],~tab1[2*j],tab0[2*j],tab0[2*j+1]);
32 }
33 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏
34
35 //顯示數(shù)字09
36 for(c=i;c>0;c--)
37 for(j=0;j<16;j++)
38 {
39 HC595Pro(~tab2[2*j+1],~tab2[2*j],tab0[2*j],tab0[2*j+1]);
40 }
41 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏
42
43 //顯示數(shù)字08
44 for(c=i;c>0;c--)
45 for(j=0;j<16;j++)
46 {
47 HC595Pro(~tab3[2*j+1],~tab3[2*j],tab0[2*j],tab0[2*j+1]);
48
聯(lián)系客服