历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2019年10月12日 | 51单片机----16*16LED点阵

2019-10-12 来源:eefocus

一、LED点阵发光原理

想要点亮点阵中的某一个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的小点阵组成起来的。


其中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 }

49 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

50

51 //显示数字07

52 for(c=i;c>0;c--)

53 for(j=0;j<16;j++)

54 {

55 HC595Pro(~tab4[2*j+1],~tab4[2*j],tab0[2*j],tab0[2*j+1]);

56 }

57 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

58

59 //显示数字06

60 for(c=i;c>0;c--)

61 for(j=0;j<16;j++)

62 {

63 HC595Pro(~tab5[2*j+1],~tab5[2*j],tab0[2*j],tab0[2*j+1]);

64 }

65 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

66

67 //显示数字05

68 for(c=i;c>0;c--)

69 for(j=0;j<16;j++)

70 {

71 HC595Pro(~tab6[2*j+1],~tab6[2*j],tab0[2*j],tab0[2*j+1]);

72 }

73 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

74

75 //显示数字04

76 for(c=i;c>0;c--)

77 for(j=0;j<16;j++)

78 {

79 HC595Pro(~tab7[2*j+1],~tab7[2*j],tab0[2*j],tab0[2*j+1]);

80 }

81 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

82

83 //显示数字03

84 for(c=i;c>0;c--)

85 for(j=0;j<16;j++)

86 {

87 HC595Pro(~tab8[2*j+1],~tab8[2*j],tab0[2*j],tab0[2*j+1]);

88 }

89 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

90

91 //显示数字02

92 for(c=i;c>0;c--)

93 for(j=0;j<16;j++)

94 {

95 HC595Pro(~tab9[2*j+1],~tab9[2*j],tab0[2*j],tab0[2*j+1]);

96 }

97 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

98

99 //显示数字01

100 for(c=i;c>0;c--)

101 for(j=0;j<16;j++)

102 {

103 HC595Pro(~tab10[2*j+1],~tab10[2*j],tab0[2*j],tab0[2*j+1]);

104 }

105 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

106

107 //显示数字00

108 for(c=i;c>0;c--)

109 for(j=0;j<16;j++)

110 {

111 HC595Pro(~tab11[2*j+1],~tab11[2*j],tab0[2*j],tab0[2*j+1]);

112 }

113 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

114

115 //显示字母GO

116 for(c=i;c>0;c--)

117 for(j=0;j<16;j++)

118 {

119 HC595Pro(~tab12[2*j+1],~tab12[2*j],tab0[2*j],tab0[2*j+1]);

120 }

121 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

122 }

123 }

124

125 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0)

126 {

127 uchar i;

128 //先移入的会被后面移入的数据推移到后面的595中,所以需要先移入data3

129 for(i=0;i<8;i++)

130 {

131 //先移入高位再移入低位,移位寄存器移入的第一位就是输出的最高位

132 MOSIO = data3 >> 7;

133 data3 <<= 1;

134 S_CLK = 0;//给一个上升沿,移位

135 S_CLK = 1;

136 }

137 for(i=0;i<8;i++)

138 {

139 MOSIO = data2 >> 7;

140 data2 <<= 1;

141 S_CLK = 0;

142 S_CLK = 1;

143 }

144 for(i=0;i<8;i++)

145 {

146 MOSIO = data1 >> 7;

147 data1 <<= 1;

148 S_CLK = 0;

149 S_CLK = 1;

150 }

151 for(i=0;i<8;i++)

152 {

153 MOSIO = data0 >> 7;

154 data0 <<= 1;

155 S_CLK = 0;

156 S_CLK = 1;

157 }

158

159 //上升沿时将移位寄存器数据移到锁存器中用于显示,平时保持低电平,数据不变

160 R_CLK = 0;

161 R_CLK = 1;

162 R_CLK = 0;

163 }


array.h头文件如下:

1 //点阵显示数组

2 //用于行扫描

3 unsigned char code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,

4 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};

5 //1数字10的字模

6 unsigned char code tab1[] = {0, 0, 0, 0, 0, 0, 8, 24, 14, 36, 8, 66, 8, 66, 8, 66,

7 8, 66, 8, 66, 8, 66, 8, 36, 62, 24, 0, 0, 0, 0, 0, 0};

8 //数字09的字模

9 unsigned char code tab2[] = {0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66,

10 66, 66, 100, 66, 88, 66, 64, 66, 64, 36, 36, 24, 28, 0, 0, 0, 0} ;

11 //数字08的字模

12 unsigned char code tab3[] = {0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 36,

13 66, 24, 66, 36, 66, 66, 66, 66, 36, 66, 24, 60, 0, 0, 0, 0};

14 //数字07的字模

15 unsigned char code tab4[] = {0, 0, 0, 0, 0, 0, 24, 126, 36, 34, 66, 34, 66, 16, 66, 16,

16 66, 8, 66, 8, 66, 8, 66, 8, 36, 8, 24, 8, 0, 0, 0, 0};

17 //数字06的字模

18 unsigned char code tab5[] = {0, 0, 0, 0, 0, 0, 24, 56, 36, 36, 66, 2, 66, 2, 66, 26, 66,

19 38, 66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};

20 //数字05的字模

21 unsigned char code tab6[] = {0, 0, 0, 0, 0, 0, 24, 126, 36, 2, 66, 2, 66, 2, 66, 26, 66,

22 38, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};

23 //数字04的字模

24 unsigned char code tab7[] = {0, 0, 0, 0, 0, 0, 24, 32, 36, 48, 66, 40, 66, 36, 66, 36, 66,

25 34, 66, 34, 66, 126, 66, 32, 36, 32, 24, 120, 0, 0, 0, 0};

26 //数字03的字模

27 unsigned char code tab8[] = {0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 32, 66, 24, 66,

28 32, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};

29 //数字02的字模

30 unsigned char code tab9[] = {0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 32, 66,

31 32, 66, 16, 66, 8, 66, 4, 36, 66, 24, 126, 0, 0, 0, 0};

32 //数字01的字模

33 unsigned char code tab10[] = {0, 0, 0, 0, 0, 0, 24, 8, 36, 14, 66, 8, 66, 8, 66, 8, 66, 8, 66,

34 8, 66, 8, 66, 8, 36, 8, 24, 62, 0, 0, 0, 0};

35 //数字00的字模

36 unsigned char code tab11[] = {0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66, 66, 66, 66,

37 66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};

38 //数字GO的字模

39 unsigned char code tab12[] = {0, 0, 0, 0, 0, 0, 60, 28, 34, 34, 34, 65, 1, 65, 1, 65, 1, 65, 113,

40 65, 33, 65, 34, 65, 34, 34, 28, 28, 0, 0, 0, 0};


头文件的数据是通过字模软件得出的。字模软件的工作原理就是对于一个点阵,你想要什么样的图像,然后就在相应位置数据为1。然后再通过从左到右,从上到下的顺序,组成一个个8位数据。


这些8位数据就是头文件的内容。


由此我们就可以知道,通过字模取出来的数据,而我们实际运用过程中对于列来说是相反的。


因为我们想要点亮对应的LED灯是将它所在行输出高电平,所在列输出低电平。所以取出来的字模数据作为列的值的话是相反的。所以这里用了取反。


四、显示汉字


1 #include

2 #include

3

4 #define uchar unsigned char

5 #define uint unsigned int

6

7 sbit MOSIO = P3^4;

8 sbit R_CLK = P3^5;

9 sbit S_CLK = P3^6;

10

11 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0);

12

13 void main()

14 {

15 uint i,c;

16 uchar j;

17 i = 100;

18

19 while(1)

20 {

21 //显示“我”

22 for(c=i;c>0;c--)//延时

23 for(j=0;j<16;j++)

24 {

25 //字模取出来的数据是跟实际实际所需数据相反的,所以要取反。

26 //函数对应的参数分别表示列2,列1,行2,行1

27 HC595Pro(~tab1[2*j+1],~tab1[2*j],tab0[2*j],tab0[2*j+1]);

28 }

29 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

30

31 //显示“叫”

32 for(c=i;c>0;c--)

33 for(j=0;j<16;j++)

34 {

35 HC595Pro(~tab2[2*j+1],~tab2[2*j],tab0[2*j],tab0[2*j+1]);

36 }

37 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

38

39 //显示“做”

40 for(c=i;c>0;c--)

41 for(j=0;j<16;j++)

42 {

43 HC595Pro(~tab3[2*j+1],~tab3[2*j],tab0[2*j],tab0[2*j+1]);

44 }

45 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

46

47 //显示“大”

48 for(c=i;c>0;c--)

49 for(j=0;j<16;j++)

50 {

51 HC595Pro(~tab4[2*j+1],~tab4[2*j],tab0[2*j],tab0[2*j+1]);

52 }

53 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

54

55 //显示“熙”

56 for(c=i;c>0;c--)

57 for(j=0;j<16;j++)

58 {

59 HC595Pro(~tab5[2*j+1],~tab5[2*j],tab0[2*j],tab0[2*j+1]);

60 }

61 for(c=i;c>0;c--)

62 {

63 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

64 }

65

66 //显示“熙”

67 for(c=i;c>0;c--)

68 for(j=0;j<16;j++)

69 {

70 HC595Pro(~tab6[2*j+1],~tab6[2*j],tab0[2*j],tab0[2*j+1]);

71 }

72 HC595Pro(0xFF,0xFF,0x00,0x00);//清屏

73 }

74 }

75

76 void HC595Pro(uchar data3,uchar data2,uchar data1,uchar data0)

77 {

78 uchar i;

79 //先移入的会被后面移入的数据推移到后面的595中,所以需要先移入data3

80 for(i=0;i<8;i++)

81 {

82 //先移入高位再移入低位,移位寄存器移入的第一位就是输出的最高位

83 MOSIO = data3 >> 7;

84 data3 <<= 1;

85 S_CLK = 0;//给一个上升沿,移位

86 S_CLK = 1;

87 }

88 for(i=0;i<8;i++)

89 {

90 MOSIO = data2 >> 7;

91 data2 <<= 1;

92 S_CLK = 0;

93 S_CLK = 1;

94 }

95 for(i=0;i<8;i++)

96 {

97 MOSIO = data1 >> 7;

推荐阅读

史海拾趣

固驰(GUERTE)公司的发展小趣事

在快速发展的同时,固驰电子始终不忘履行社会责任。公司积极参与公益事业,关注环境保护和可持续发展。通过采用环保材料和节能技术,固驰电子努力降低生产过程中的能耗和排放,为构建绿色、低碳的生态环境贡献力量。此外,公司还注重员工培训和职业发展,为员工提供良好的工作环境和晋升机会,实现了企业与员工的共同成长。

雅特力(Artery)公司的发展小趣事

雅特力公司自成立以来,始终致力于技术创新和产品升级。在早期的发展阶段,公司便推出了一系列具有竞争力的电子产品,通过不断的技术突破,逐渐在市场中占据了一席之地。特别是在集成电路设计领域,雅特力凭借其高效能、低能耗的产品特性,赢得了众多客户的青睐。随着技术的不断进步,雅特力逐渐成为了电子行业的佼佼者,引领着市场的发展方向。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

在发展过程中,雅特力积极寻求与其他企业的战略合作,以实现共赢发展。通过与上下游企业建立紧密的合作关系,雅特力不仅确保了供应链的稳定性和高效性,还获得了更多的技术支持和市场资源。同时,雅特力还注重与同行业企业的交流与合作,共同推动电子行业的进步与发展。这些战略合作不仅增强了雅特力的综合实力和市场竞争力,也为整个电子行业的繁荣做出了积极贡献。

综上所述,雅特力公司通过技术创新、全球市场布局、企业社会责任、人才培养和战略合作等多个方面的努力,实现了从初创企业到行业领军者的华丽转身。这些故事不仅展现了雅特力的发展历程和成就,也揭示了其在电子行业中的重要地位和影响力。

Cantherm公司的发展小趣事

Cantherm公司在电子行业中以其技术创新而著称。在一次重要的研发项目中,公司团队成功开发了一种新型的散热技术,该技术能有效降低电子设备在工作时产生的热量,从而提高设备的性能和稳定性。这一突破不仅为公司带来了大量的专利和知识产权,还吸引了众多知名电子产品制造商的合作意向,使Cantherm在行业中崭露头角。

台湾第一电阻(Firstohm)公司的发展小趣事
压缩机不启动可能由电源故障、启动继电器故障、压缩机本身故障等原因引起。首先检查电源是否正常,然后检查启动继电器是否损坏。如果启动继电器正常,可能是压缩机内部故障,如电机绕组短路、断路或转子卡死等,需要请专业人员进行检查和维修。
佰宏(BHFUSE)公司的发展小趣事

BHFUSE佰宏实业成立于2013年,创立之初,公司便确立了专注于大电流、高电压、低内阻的PPTC自恢复保险丝的研发与生产。面对激烈的市场竞争,佰宏团队凭借对技术的深刻理解和对市场的敏锐洞察,逐步赢得了客户的认可。在创立初期,佰宏便与多家知名代工厂建立了合作关系,为其提供优质的保护器件,逐步在行业中树立了良好的口碑。

问答坊 | AI 解惑

TI 的单电源运放中文培训(入门提高的好资料)

本帖最后由 dontium 于 2015-1-23 11:36 编辑 TI 的单电源运放中文培训(入门提高的好资料) …

查看全部问答>

deviceList

编了一段程序,需要用到DeviceList。请问DeviceList.h和DeviceList.cppcpp在哪里可以下载到,谢谢!!…

查看全部问答>

二个和尚(有感于一个老工程师的十大忠告)

有感于一个老工程师的十大忠告,贴一个小故事      有二个和尚住在隔壁;所谓隔壁是:隔壁那座山。他们分别在相邻的二座山上的庙里。   这二座山之间有一条溪。于是这二个和尚,每天都会在同一时间下山去溪边挑水。久 ...…

查看全部问答>

大家有没有用过CORTEX-R系列的片子的?

RT!~   说下具体的应用吧和案例吧!~   这个实时系列的好像不用的不是很多?还是主要运用在军工业?…

查看全部问答>

求助:430怎样实现c语言和汇编的混合编程?

430怎样实现c语言和汇编的混合编程?…

查看全部问答>

还没有放假的筒子们举个手吧

大家报报放假的时间,我是18号…

查看全部问答>

全通滤波器的设计

对去图中,设计过程中各个参数的单位是什么?还有,C和Q一般选取什么值? …

查看全部问答>

参加设计大赛心情好

很高兴又有机会动手制作创意电子,心情甚好 …

查看全部问答>

模拟电路设计方法大全

很全的模拟电路设计方法介绍 …

查看全部问答>