05_单片机_点阵初识_74HC595

1. 单片机点阵接线(Positive:正极;negative:负极)


2. 74HC595 (链接:https://www.mouser.cn/ProductDetail/Texas-Instruments/SN74HC595NE4?qs=AgY10sKTvDK0jki9CKjSwg%3D%3D)

2.1. 查询datasheet,如下设备功能模式(Device Functional Modes

2.2. 时序图


3. 实现点亮LED点阵

 根据上述,SRCLK 上升沿(低电平转高电平)会移位SER的数据到移位寄存器中;RCLK 上升沿(low to high)移位寄存器的数据存储在存储寄存器中

3.1. 点亮所有LED

  发现个问题,使用教程P3^4,P3^5,P3^6可以点亮所有LED,P1^0,P1^1,P1^2也可以,但是使用Port0端口,有两列LED无法点亮,未发现问题,求解?

 1 #include <REG51.H>
 2 
 3 
 4 sbit SER         = P1^0;
 5 sbit RCLK     = P1^1;
 6 sbit SRCLK     = P1^2;
 7 
 8 void main(void)
 9 {
10     unsigned char i = 0;
11     unsigned char pos1, pos2, neg1, neg2;
12     
13     RCLK = 0;
14     SRCLK = 0;
15     
16     pos1 = 0xff;
17     pos2 = 0xff;
18     neg1 = 0x00;
19     neg2 = 0x00;
20     
21     for(i=0; i<8; i++)
22     {
23         SER = neg2>>7;    // 获取最高位传递给SER
24         SRCLK = 0;
25         SRCLK = 1;
26         neg2 = neg2<<1;
27     }
28     
29     for(i=0; i<8; i++)
30     {
31         SER = neg1>>7;    
32         SRCLK = 0;
33         SRCLK = 1;
34         neg1 = neg1<<1;
35     }
36     
37     for(i=0; i<8; i++)
38     {
39         SER = pos2>>7;    
40         SRCLK = 0;
41         SRCLK = 1;
42         pos2 = pos2<<1;
43     }
44     
45     for(i=0; i<8; i++)
46     {
47         SER = pos1>>7;    
48         SRCLK = 0;
49         SRCLK = 1;
50         pos1 = pos1<<1;
51     }
52     
53     RCLK = 0;
54     RCLK = 1;
55 }
View Code

  使用函数,优化代码

 1 #include <REG51.H>
 2 
 3 
 4 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2);
 5 
 6 sbit SER         = P1^0;
 7 sbit RCLK     = P1^1;
 8 sbit SRCLK     = P1^2;
 9 
10 void main(void)
11 {
12     HC595SendBytes(0xff, 0xff, 0x00, 0x00);
13 }
14 
15 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2)
16 {
17     unsigned char i = 0;
18     
19     RCLK = 0;
20     SRCLK = 0;
21     
22     for(i=0; i<8; i++)
23     {
24         SER = neg2>>7;    // 获取最高位传递给SER
25         SRCLK = 0;
26         SRCLK = 1;
27         neg2 = neg2<<1;
28     }
29     
30     for(i=0; i<8; i++)
31     {
32         SER = neg1>>7;    
33         SRCLK = 0;
34         SRCLK = 1;
35         neg1 = neg1<<1;
36     }
37     
38     for(i=0; i<8; i++)
39     {
40         SER = pos2>>7;    
41         SRCLK = 0;
42         SRCLK = 1;
43         pos2 = pos2<<1;
44     }
45     
46     for(i=0; i<8; i++)
47     {
48         SER = pos1>>7;    
49         SRCLK = 0;
50         SRCLK = 1;
51         pos1 = pos1<<1;
52     }
53     
54     RCLK = 0;
55     RCLK = 1;
56 }
View Code

4.习题:

1. 点亮最上面1排;函数代码如上

1 void main(void)
2 {
3     HC595SendBytes(0x01, 0x00, 0x00, 0x00);
4 }

2. 点亮最下面1排

1 void main(void)
2 {
3     HC595SendBytes(0x00, 0x80, 0x00, 0x00);
4 }

3. 最左边1列

1 void main(void)
2 {
3     HC595SendBytes(0xff, 0xff, 0xfe, 0xff);
4 }

4. 点亮左上角1颗

1 void main(void)
2 {
3     HC595SendBytes(0x01, 0x00, 0xfe, 0xff);
4 }

5. 点亮角上4颗

1 void main(void)
2 {
3     HC595SendBytes(0x01, 0x80, 0xfe, 0x7f);
4 }

 

posted on 2023-04-05 20:58  Ivan2023  阅读(32)  评论(0)    收藏  举报