今天学习了用串口把数据传递给寄存器595扩展IO口,同时控制4个七段数码管。
核心思想:
1.每个D触发器能存储1位数据,
2.D端数据输入端,Q数据输出端.当脉冲信号来时。这里脉冲取反。下降沿触发,D端数据被存储进触发器。
3.8位数据依次从低位或最高位存入左边的8个触发器。当右边LATCH CLOCK触发器触发,左边8个触发器传递给右边8个触发器。形成一次输出。
4.R触发器时,全部置零。
下午编写了电压表程序。
#define DATA_PIN 2 //74HC595的14脚 数据输入引脚SI
#define SCLK_PIN 5 //74hc595的11脚 时钟线 SCK
#define LATCH_PIN 4 //74hc595的12脚 输出存储器锁存线RCK
const uint8_t decode[] = {~0x3f, ~0x06, ~0x5b, ~0x4f, ~0x66, ~0x6d, ~0x7d, ~0x07, ~0x7f, ~0x6f, ~0x77, ~0x7c, ~0x39, ~0x5e, ~0x79, ~0x71}; //共阳极译码值
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(SCLK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
float dian=analogRead(A0);
Serial.println(dian);
int temp=dian*500 /1024;
int a=temp/100;
int b=(temp-a*100)/10;
int c=(temp-a*100-b*10);
digitalWrite(LATCH_PIN, LOW);
display(0xff);
display(decode[a]&0b01111111);
display(decode[b]);
display(decode[c]);
digitalWrite(LATCH_PIN, HIGH);
}
void display(uint8_t val) {
// digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, SCLK_PIN, MSBFIRST, val);// **串行数据输出,高位在先
// digitalWrite(LATCH_PIN, HIGH); //上沿锁存
}
网友评论