/*
1.主题:抢答器
器件:ESP32主控板1块,按键模块2个(A键和B键),四位数码管1个,74HC595移位寄存器芯片(或模块)及相应辅件。以上模块也可使
用分立器件结合面包板搭建。
任务要求:
抢答器由A、B双方组成,分别位于左右两侧,A方对应A键,B方对应B键,四位数码管位于双方的中间位置,用于显示抢答结果。抢答采用
3局2胜制。具体任务说明及要求如下:
(1)装置通电启动后,在四位数码管第2位倒计时依次显示5、4、3、2、1,间隔时间为1秒;
(2)倒计时显示完毕,四位数码管显示比分“0-0”,如下图所示:
A方
B方
(3)抢答开始后,率先按下按键一方的比分加L,另一方的比分保持不变:
(4)双方释放按键后,开始下一轮抢答:
(5)当A、B双方中一方比分率先达到2分时,抢答结束,此时四位数码管闪烁显示比分,再次点击按键比分不再改变;
(6)四位数码管必须使用74HC595移位寄存器芯片驱动显示。如采用其他方式,本实操成绩得0分:
(7)程序采用C代码编写,不得使用外部库调用;
(8)未作规定处可自行处理,无明显与事实违背即可。
说明:请考生在考试结束前,按照如下要求提交相关文件。
(1)将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DjKS5_身份证号,大小5M以下;
(2)将程序文件通过“上传附件”按钮进行上传;
(3)程序编写过程中不得打开其它示例程序,如发现,实操成绩按照0分处理。
参考资料:
数组NUM0保存的是0~9十六进制形式的数码管显示的段位信息。编程时可参考使用。
∥保存0~9
byte NUM[]=[0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,OxE0,0xFE,0xF6];
*/
const int dataPin = 2; //Ds(D)
const int clockPin = 4; //SH_CP(C)
const int latchPin = 16; //ST_CP(L)
const byte NUM[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; //保存0~9和!.
int digit = 2;
//在4位数码管第2位显示
//显示的具体数字'2',number 值为10时显示!
int n=914,interval=1000;
unsigned long oldtime=0;
void setup() {
Serial.begin(115200);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
digitalWrite(clockPin, LOW);
digitalWrite(latchPin, LOW);
//初始化引脚为低电平状态
//初始化引脚为低电平状态
}
void loop(){
// if(millis()-oldtime>=interval){
// n=(n%1000)*10+n/1000;
// oldtime=millis();
// }
if (Serial.available()) {
n=Serial.parseInt();
interval=Serial.parseInt();
Serial.printf("data:%d",n);
Serial.printf("-Interval::%d",interval);
Serial.read();
}
int t=n;
for(int i=0;i<4;i++){
specialDigitDisplay(4-i,t%10);//调用位数据显示函数
t/=10;
}
//=======================
// 在指定位上显示指定的数字
// digit:数码管的位号,从左到右依次为1~4
//num:显示的数字
//=======================
}
void specialDigitDisplay(int digit, int num){
byte val = 0;
val= bitSet(val, digit - 1);
shiftOut(dataPin, clockPin, MSBFIRST, val);
//将digit对应位号置位①
//串行移位函数②
shiftOut(dataPin, clockPin, LSBFIRST,~NUM[num]);//0
digitalWrite(latchPin, HIGH);
digitalWrite(latchPin, LOW);
}