串口屏抽签,类似抽奖,物理按键选中和清除,mcu是stm32
1、项目简介
2、实现逻辑
#屏幕页面放58个图标控件,每个图标控件上显示一个人名,控件下面位置再放一个控件,可在语数外物化生6个字(6个字不同颜色)之间选择
#按下随机选择按键,人名背景随机变深,20次后,最后一个背景变深的为选中者
#通过如下图的下或者右按键,选中要选择的人,图标开始闪烁,点击确认后,再通过按键选择这个人下面的学科
#点击清屏按键,页面所有带深色背景的人及学科字都被清除
3、应用场景
#商场随机抽奖
#课堂随机选人签到或者答题
#课堂记录学生哪一科没有交作业或者需要课后找老师
4、核心代码梳理
void setup(void)
{
//USART
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(KEY1, INPUT);
pinMode(KEY1, INPUT_PULLUP);
pinMode(KEY2, INPUT);
pinMode(KEY2, INPUT_PULLUP);
pinMode(KEY3, INPUT);
pinMode(KEY3, INPUT_PULLUP);
pinMode(KEY4, INPUT);
pinMode(KEY4, INPUT_PULLUP);
pinMode(KEY5, INPUT);
pinMode(KEY5, INPUT_PULLUP);
Serial.print("START");
}
void loop(void)
{
//LED
digitalWrite(LED_BUILTIN, HIGH);
delay(300);
digitalWrite(LED_BUILTIN, LOW);
delay(300);
right = digitalRead(KEY1);
down = digitalRead(KEY2);
ok = digitalRead(KEY3);
clear = digitalRead(KEY4);
randomDraw = digitalRead(KEY5);
//check///
if(right == 0)
{
if(ok_flag)
{
right_sub_num++;
right_sub_num = right_sub_num % 7;
}
else right_num++;
}
if(down == 0)
{
down_num++;
}
if(ok == 0)
{
ok_num = 1;
}
if(ok_num)
{
if(ok == 1)
{
ok_num = 0;
ok_flag++;
ok_flag = ok_flag % 2;
right_sub_num = 0;
}
}
if(clear == 0)
{
clear_flag = 1;
}
//clear///
if((down_flag || right_flag) && clear_flag)
{
clear_flag = 0;
right_num = 1;
down_num = 0;
}
if(clear_flag == 1)
{
clear_flag = 2;
ok_flag = 0;
right_num = 0;
down_num = 0;
for(uint8_t i=0; i<8; i++)
{
tx_data[7] = 0;
Serial.printf("%c", tx_data[i]);
}
//clear
for(uint8_t j=0x3A; j<0x73; j++)
{
delay(50);
for(uint8_t i=0; i<8; i++)
{
tx_data_sub[5] = j;
tx_data_sub[7] = 0;
Serial.printf("%c", tx_data_sub[i]);
}
}
}
//select///
if(!ok_flag)//name
{
if(down_num == 6)
{
if(right_num >= 4)
right_num = 1;
}
else if(down_num == 7)
down_num = 0;
if(right_num >= 10)
right_num = 1;
for(uint8_t i=0; i<8; i++)
{
tx_data[7] = 0;
Serial.printf("%c", tx_data[i]);
}
delay(100);
tx_data[5] = down_num*9 + right_num;
for(uint8_t i=0; i<8; i++)
{
tx_data[7] = 1;
Serial.printf("%c", tx_data[i]);
}
}
else//subject
{
for(uint8_t i=0; i<8; i++)
{
tx_data_sub[5] = tx_data[5] + 0x39;
if(right_sub_num == 6)
tx_data_sub[7] = 0;
else tx_data_sub[7] = 8 - right_sub_num;
Serial.printf("%c", tx_data_sub[i]);
}
}
//random select ///
if(randomDraw == 0)
{
//random
for(uint8_t j=0; j<20; j++)
{
delay(500);
for(uint8_t i=0; i<8; i++)
{
tx_data[7] = 0;
Serial.printf("%c", tx_data[i]);
}
delay(500);
randomDraw_num = random(1,57);
//Serial.println(randomDraw_num);
right_num = randomDraw_num % 9;
down_num = randomDraw_num / 9;
for(uint8_t i=0; i<8; i++)
{
tx_data[5] = randomDraw_num; //random num
tx_data[7] = 1;
Serial.printf("%c", tx_data[i]);
}
}
}
//Serial.printf("KEY: %d,%d,%d,%d,%d",right, down, ok, clear, randomDraw);
}
5、部分参考资料
#显示屏官网:www.viewtech.cn/ 型号SDWB070T84N
6、注意事项
#串口屏固件使用sd卡下载
#串口屏连线参考HardwareConnection.pdf
#串口屏开发工具是VGUS2021开发工具.exe
#图标生成使用自带的icon生成工具
#nodemcu注意连线