A35664. 主题:串口交互数字滚动循环显示器件:ESP32主控板1块,四位数码管1个,74HC595移位寄存器芯片(或模块)及相应辅件。以上模块也可使用分立器件结合面包板搭建。任务要求: 使用74HC595移位寄存器芯片控制四位数码管实现数字的滚动循环显示,通过串口输入报文来设置显示的内容及其滚动显示的时间间隔。报文的格式为:xxxx:yyy,其中,xxxx为显示的内容,范围1000~9999,yyy为时间…
题目描述
主题:串口交互数字滚动循环显示
器件:
ESP32主控板1块,四位数码管1个,74HC595移位寄存器芯片(或模块)及相应辅件。以上模块也可使用分立器件结合面包板搭建。
任务要求:
使用74HC595移位寄存器芯片控制四位数码管实现数字的滚动循环显示,通过串口输入报文来设置显示的内容及其滚动显示的时间间隔。
报文的格式为:xxxx:yyy,其中,xxxx为显示的内容,范围1000~9999,yyy为时间间隔。示例报文为:4567:400,其中:4567为数码管显示的数字;400表示所输入数字循环显示的时间间隔,数字自右向左循环动态显示,如下图所示。

具体任务要求如下:
(1) 装置通电启动后,在四位数码管上显示今天的日期:0914;
(2) 在串口监视器中输入相应的报文,并点击发送按键。将解析后的报文内容输出到串口监视器。以报文4567:400为例,串口监视器窗口输出的内容为Data:4567 -- Interval:400;
(3) 在四位数码管上显示解析后的内容,并以指定的时间间隔,实现自右向左循环动态显示。直至输入新的报文数据;
(4)程序采用C代码编写,不得使用外部库调用;
(5)未作规定处可自行处理,无明显与事实违背即可。
说明:请考生在考试结束前,按照如下要求提交相关文件。
(1)将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS5_身份证号,大小5M以下;
(2)将程序文件通过“上传附件”按钮进行上传;
(3)程序编写过程中不得打开其它示例程序,如发现,实操成绩按照0分处理。
参考资料:
数组NUM[] 保存的是0~9十六进制形式的数码管显示的段位信息。编程时可参考使用。
// 保存0~9
byte NUM[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6};
参考答案
//参考代码
const int datapin = 23; //DS
const int clockpin = 18; //SH_CP
const int latchpin = 5; //ST_CP
const byte NUM[] = {
0b11111100, //0
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11110110, //9
0b00000001 //.
};
unsigned int ShowData = 0; //显示是数值
void specialDigitDisplay(int digit,int number) //数码管位digit,number显示是数字,0~9
{
byte val = 0;
val = bitSet(val,digit - 1); //将digit对应位号置位
shiftOut(datapin,clockpin,MSBFIRST,val); //串行移位函数
shiftOut(datapin,clockpin,LSBFIRST,~NUM[number]);
digitalWrite(latchpin,HIGH); //更新数据
digitalWrite(latchpin,LOW);
}
void Display_Num(int value) //4位数字
{
specialDigitDisplay(1,value/1000); //千位
specialDigitDisplay(2,value%1000/100); //百位
specialDigitDisplay(3,value%100/10); //十位
specialDigitDisplay(4,value%10); //个位
}
void setup() {
// put your setup code here, to run once:
pinMode(datapin,OUTPUT);
pinMode(clockpin,OUTPUT);
pinMode(latchpin,OUTPUT); //配置为输出模式
digitalWrite(clockpin,LOW); //设置为低电平状态
digitalWrite(latchpin,LOW); //设置为低电平状态
Serial.begin(9600); //设置波特率为9600
}
void loop() {
// put your main code here, to run repeatedly:
Display_Num(ShowData);
USART_GET_Data(); //串口接收数据
}
void USART_GET_Data(void)
{
if(Serial.available()>0) //是否有数据
{
int i=0;
unsigned temp[4];
while(Serial.available()>0)
{
temp[i] = Serial.read();
i++;
if(i>4)
{
Serial.write("error data,too long"); //错误数据,数据太长了
Serial.println('\r');
return;
}
}
if(i==4)
{
for(char j=0;j<4;j++) //数据范围限制。
{
if((temp[j]<0x30)||(temp[j]>0x39))
{
Serial.write("error data,it is not a number"); //错误数据
Serial.println('\r');
return;
}
}
ShowData = (temp[0]-0x30)*1000+(temp[1]-0x30)*100+(temp[2]-0x30)*10+(temp[3]-0x30)*1;
Serial.write("data recieved ok"); //接收到的数据ok
Serial.println('\r');
}
else
{
Serial.write("error data,too short"); //do nothing
Serial.println('\r');
}
}
else
{
}
}