测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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 { } }
上一题 下一题