PRJ - Led595 2#

2024-05-29

/* HC595 4位共阳级7段数码管

## Key points

- 这是 SPI 吗?
- 重点是移位锁存寄存器 595 的用法。另外,还可以用 MAX7221

## Reference

[码表与资料](https://www.cnblogs.com/prosim/articles/17447891.html)

驱动改编自多功能 Arduino Shield 带的例子

*/

// int analogPin = A0; // potentiometer wiper (middle terminal) connected to 

int latchPin = 7;
int clockPin = 6;
int dataPin = 8; 

int ave = 0;
// 数字的编码, 共阳级码表
unsigned char Dis_table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90,0x00};	//LED状态显示的变量
// unsigned char Dis_buf[] = {0xF1,0xF2,0xF4,0xF8};  // 这个是多功能版的位选连线
unsigned char Dis_buf[] = {0xF8,0xF4,0xF2,0xF1};     // 与上一个是逆序排列
void setup ()
{
  Serial.begin(9600);  
  pinMode(latchPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(dataPin,OUTPUT);   //让三个脚都是输出状态


}
void loop()
{
  // int var = analogRead(analogPin);  // read the input pin
  int temp = 1357;

  int d[4];
  for(int i=0; i<4; i++){
     int r = temp % 10;
     d[4-i-1] = r;
     temp = temp/10;   
     Serial.println(r);
  }  

print4digits(d[0], d[1], d[2], d[3]);

}

//打印1个4位数


//打印4个数字
void print4digits(int a, int b, int c, int d)
{
  print1digit(0, a);
  print1digit(1, b);
  print1digit(2, c);
  print1digit(3, d);  
}

// 在指定位上打字一个数字
// chan: 数字位,从左边开始记数
// 和 SPI 的协议是相同的?
void print1digit(int chan, int number)
{
  digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
  shiftOut(dataPin,clockPin,MSBFIRST,Dis_table[number]); //发送显示的数值编码 
  shiftOut(dataPin,clockPin,MSBFIRST,Dis_buf[chan] );    //发送通值	0-3	
  digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
  delay(2);				//延时2ms 
}