PRJ - Led595#

2024-05-29

/* 595 Segment LED 


From: 模块自带
*/

unsigned char LED_0F[] = {  
  // 0	 1	  2	    3	    4	    5	    6	    7	    8	    9	    A	    b	    C     d	    E      F    -
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x8C, 0xBF, 0xC6, 0xA1, 0x86, 0xFF, 0xbf
};
unsigned char LED[4];  //用于LED的4位显示缓存
// int SCLK = 2;
// int RCLK = 1;
// int DIO = 0; 
int SCLK = 6;  //SFT Clock
int RCLK = 7;  //Latch Clock
int DIO = 8;   // data

void setup() {
  pinMode(SCLK, OUTPUT);
  pinMode(RCLK, OUTPUT);
  pinMode(DIO, OUTPUT);  //让三个脚都是输出状态
}

void loop() {
  LED[0] = 1;
  LED[1] = 2;
  LED[2] = 3;
  LED[3] = 5;

  while (1) {
    LED4_Display();
  }
}

void LED4_Display(void) {
  unsigned char *led_table;  // 查表指针
  unsigned char i;
  //显示第1位
  led_table = LED_0F + LED[0];  // 首地址 + 偏移量
  i = *led_table;
  LED_OUT(i);            // 1 output digit
  LED_OUT(0x01);         // 通道值
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
  //显示第2位
  led_table = LED_0F + LED[1];
  i = *led_table;
  LED_OUT(i);
  LED_OUT(0x02);
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
  //显示第3位
  led_table = LED_0F + LED[2];
  i = *led_table;
  LED_OUT(i);
  LED_OUT(0x04);
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
  //显示第4位
  led_table = LED_0F + LED[3];
  i = *led_table;
  LED_OUT(i);
  LED_OUT(0x08);
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
}


// 这就是 Shift Out (MSBFirst) 的自定义版本吗?
void LED_OUT(unsigned char X) {
  unsigned char i;
  for (i = 8; i >= 1; i--) {
    if (X & 0x80) {
      digitalWrite(DIO, HIGH);
    } else {
      digitalWrite(DIO, LOW);
    }
    X <<= 1;
    digitalWrite(SCLK, LOW);
    digitalWrite(SCLK, HIGH);
  }
}