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 }
使用函数,优化代码
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 }
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 }
浙公网安备 33010602011771号