高职物联网文字滚动
高职物联网文字滚动
题目
要求编写一个显示屏显示控制程序,可以实现显示屏上显示内容的控制功能。选手需要找到 1 个NB-IoT模块在提供的工程项目中完成相关功能开发,并发布程序到NB-IoT模块中,通上电源等待裁判评判。
任务要求 :
Ø 程序界面如下

Ø 程序要求在显示屏上文字“预祝顺利”以间隔1秒的频率实现文字从右往左滚动,当文字滚动抵达左侧以后,再向右侧滚动。当文字滚动抵达右侧以后,再向左滚动,形成左右滚动显示文字的效果。具体的显示效果如图上编号所示(重复从④到⑩)。
Ø 当点击Key2按键后,文字要求从右往左循环滚动。
Ø 当点击Key3按键后,文字要求从左往右循环滚动。
当点击Key4按键后,文字要求从上到下循环滚动
分析
- 初始化屏幕后设置文字移动
代码
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
*/
#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
uint8_t arr[][32] = {
/*-- 文字: 预 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x42,0x4A,0xD2,0x6A,0x46,0xC0,0x00,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,
0x40,0x80,0x7F,0x00,0x01,0x00,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00,
/*-- 文字: 祝 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x08,0x89,0xEE,0x98,0x00,0x7E,0x42,0xC2,0x42,0x42,0xC2,0x42,0x7E,0x00,0x00,
0x02,0x01,0x00,0xFF,0x80,0x43,0x20,0x18,0x07,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,
/*-- 文字: 顺 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFE,0x00,0xFC,0x00,0xFF,0x00,0xF2,0x12,0x1A,0xD6,0x12,0x12,0xF2,0x02,0x00,
0x40,0x3F,0x00,0x3F,0x00,0xFF,0x80,0x4F,0x20,0x18,0x07,0x10,0x20,0x4F,0x80,0x00,
/*-- 文字: 利 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x44,0x44,0x44,0xC4,0xFE,0x42,0x43,0x42,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x20,0x10,0x0C,0x03,0x00,0xFF,0x01,0x02,0x04,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
};
uint8_t State = 0;//状态
/**********************************************************************************************
*函数:void Init( void )
*功能:平台初始化
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void Init() {
// 开发板平台初始化
BoardInitMcu();
BoardInitPeriph();
keys_init();//按键初始化
setTimer2Callback(Time2Handler);
Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}
/**********************************************************************************************
*函数:void KeyDownHandler( void )
*功能:按钮事件监听
*输入:无
*输出:无
*特殊说明:无
**********************************************************************************************/
void KeyDownHandler(void) {//按键检测状态
if(isKey2Pressed()){
OLED_Clear();
State = 2;
resetKey2();
}
if(isKey3Pressed()){
OLED_Clear();
State = 3;
resetKey3();
}
if(isKey4Pressed()){
OLED_Clear();
State = 4;
resetKey4();
}
}
/**********************************************************************************************
*函数:void handlerPre10Ms( void )
*功能:10毫秒循环
*输入:无
*输出:无
*特殊说明:循环处理总时长300ms
**********************************************************************************************/
void handlerPre10Ms(void) {
for (int delay = 0; delay < 30; delay++) {
HAL_Delay(10);
}
}
//显示内容
void WZ(uint8_t x,uint8_t y){
OLED_ShowCHineseArray(x,y,arr[0]);
OLED_ShowCHineseArray(x+16,y,arr[1]);
OLED_ShowCHineseArray(x+32,y,arr[2]);
OLED_ShowCHineseArray(x+48,y,arr[3]);
}
/**
* Main application entry point.
*/
int main( void )
{
uint8_t i = 0,F;
uint32_t t = 0;
uint8_t j = 2;
Init();
OLED_Init();
OLED_Clear();
while( 1 )
{
S1: if(State == 0){
OLED_Clear();
OLED_ShowCHineseArray(127-16-i,j,arr[0]);
if(i > 16){
OLED_ShowCHineseArray(127-16-i+16,j,arr[1]);
}
if(i > 32){
OLED_ShowCHineseArray(127-16-i+32,j,arr[2]);
}
if(i > 48){
OLED_ShowCHineseArray(127-16-i+48,j,arr[3]);
}
HAL_Delay(10);
i++;
if(i < 127-16)goto S1;
State = 1;只执行一次
}
S2: if(State == 1){
OLED_Clear();
if(i < 64){
WZ(i,j);
}else{
WZ(127-i,j);
}
HAL_Delay(10);
i++;
if(i < 127) goto S2;
i = 0;
}
S3: if(State == 2){
OLED_Clear();
WZ(127-i,j);
i++;
HAL_Delay(10);
if(i > 128)
goto S3;
//i = 0;
}
S4: if(State == 3){
OLED_Clear();
WZ(i,j);
i++;
HAL_Delay(10);
if(i < 128)
goto S4;
//i = 0;
}
S5: if(State == 4){
OLED_Clear();
WZ(i,j);//文字位置
j++;
HAL_Delay(80);//延时相应时间
if(j < 8)
goto S5;
j = 0;//再次赋初值
}
//i = 0; //给i = 0打开会修复开头撞墙一下的bug,但是会有上下移动一直撞墙的bug
}
}

浙公网安备 33010602011771号