[51单片机学习笔记FOUR]----16*16LED点阵
扫描二维码
随时随地手机看文章
一、LED点阵发光原理
8*8单色单片机结构图如下:
从电路图中很简单的就可以看出来,想要点亮点阵中的某一个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:右边半块列数据;data2:左边半块列数据
17 //data1:下边半块行数据;data0:上边半块行数据
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); //循环左移
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 //先移入的会被后面移入的数据推移到后面的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 //上升沿时将移位寄存器数据移到锁存器中用于显示,平时保持低电平,数据不变
122 R_CLK = 0;
123 R_CLK = 1;
124 R_CLK = 0;
125
126 }
这里我用到的是16*16的点阵。其实也就是4个8*8的小点阵组成起来的。其结构图如下:
1234这里只是简单示意一下。。。其中4个小块都是与一个相对应的74HC595相连。每个74HC595又是级联的,入口只有一个,我们需要输入相对应的行,列电平情况来控制LED灯的亮灭。
根据74HC595的结构可以知道,输入的数据是8位8位的输入的。最开始输入的8位数据会被后面的输入数据推移到第四个74HC595中。
所以实际输入时,是先输入2和4的列数据,再输入1和3的列数据,然后再是3和4的行数据,最后才是1和2的行数据。
三、16*16点阵倒计时
1 /***********************************************************************
2 实验名称: 16*16点阵数字倒计时
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 //显示数字10
26 for(c=i;c>0;c--)//延时
27 for(j=0;j<16;j++)
28 {
29 //字模取出来的数据是跟实际实际所需数据相反的,所以要取反。
30 //函数对应的参数分别表示列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 //显示数字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 //显示数字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