const int dataPin = 35;
const int clockPin = 37;
const int latchPin = 36;
const int keyPin = 18; //将改成端口4,编程用4,不然程序下载有问题
int preKeyVal = 0;
int keyState = 1;
int preKeyState = 1;
boolean keyFlag= false;
boolean countFlag = false;
unsigned int preTime = 0;
int debounceDelay = 10;
unsigned int number = 0;
unsigned int currentTime = 0; //一定声明为全局变量,不然该变量每进一次loop都会清零
const byte num[]={
0xC0, //0 共阳 0b11000000
0xF9, //1
0xA4,
0xB0,
0x99,
0x92,
0x82,
0xF8,
0x80,
0x90,
0x7F //小数点
};
void setup() {
// put your setup code here, to run once:
//设置dataPin为输出模式
//设置clockPin为输出模式
//设置latchPin为输出模式
//设置keyPin为输入模式
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(latchPin,OUTPUT);
pinMode(keyPin,INPUT);
//clocPin输出低电平
//latchPin输出低电平
digitalWrite(clockPin,LOW);
digitalWrite(latchPin,LOW);
Serial.begin(115200);
}
void getKeyState()
//获取按键状态
{
int keyVal = digitalRead(keyPin);
if(keyVal != preKeyVal)
//看看什么时候按键状态有变化,把这时候的时间点取出来
//如果按键值不等于0,即如果按键值为1
//取主板开始运行到现在的时间值(ms)
//变量preKeyVal等于keyVal的值,即获取当前时间点的按键状态写入preKeyVal
{
preTime = millis();
preKeyVal = keyVal;
}
if((millis()-preTime) > debounceDelay)
//10ms 扫描一次
//如果当前时间与按键变化时间点大于10
//如果按键值不等于1,即如果按键值等于0
//按键状态值存储变量keyVal等于按键值keyVal
{
if(keyVal != preKeyState)
{
preKeyState = keyVal;
if(HIGH == keyVal)
//如果按键值等于高电位
{
keyFlag = !keyFlag;
//按键状态变量keyFlag取反
}
}
}
}
void displayNum(int number)
{
if(number > 1234)
{
number = 1234;
}
int ge = 0;
int shi = 0;
int bai = 0;
int qian = 0;
qian = int(number/1000);
shiftOut(dataPin,clockPin,MSBFIRST,0b00000001);
shiftOut(dataPin,clockPin,MSBFIRST,num[qian]);
digitalWrite(latchPin,HIGH);
delay(50);
digitalWrite(latchPin,LOW);
number = number%1000;
bai = int(number/100);
shiftOut(dataPin,clockPin,MSBFIRST,0b00000010);
shiftOut(dataPin,clockPin,MSBFIRST,num[bai]);
digitalWrite(latchPin,HIGH);
delay(50);
digitalWrite(latchPin,LOW);
number = number % 100;
shi = int(number/10);
shiftOut(dataPin,clockPin,MSBFIRST,0b00000100);
shiftOut(dataPin,clockPin,MSBFIRST,num[shi]);
digitalWrite(latchPin,HIGH);
delay(50);
digitalWrite(latchPin,LOW);
ge = number % 10;
shiftOut(dataPin,clockPin,MSBFIRST,0b00001000);
shiftOut(dataPin,clockPin,MSBFIRST,num[ge]);
digitalWrite(latchPin,HIGH);
delay(50);
digitalWrite(latchPin,LOW);
}
void loop() {
getKeyState();
if(true) //keyFlag = true
{
if(countFlag == true)
{
currentTime = millis();
countFlag = false;
}
number = millis() - currentTime;
}
else
{
countFlag = true;
}
displayNum(number);
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1