NB-IoT模块显示屏逻辑显示
一、最终按键控制文字滚动效果:
NB-IOT模块显示屏文字滚动
二、实验要求:
三、实现部分代码剖析:
1、对需要显示的汉字按要求进行取模并加入字库中
- 从上到下循环滚动时,需要将汉字旋转90度
- 把数据添加到字库中,并做好注释
/*取模汉字添加到字库中,大小统一为16*16像素*/
{
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},/*"预",52*/
{
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},/*"祝",53*/
{
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},/*"顺",54*/
{
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},/*"利",55*/
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",56*/
//把需要显示的汉字旋转90度,从上到下显示
{
0x00,0xFE,0x20,0x40,0xFC,0x04,0x24,0x24,0x24,0x24,0x24,0x44,0x50,0x88,0x04,0x02},
{
0x00,0xF9,0x08,0x50,0x21,0x11,0xFD,0x25,0x29,0x21,0x21,0x21,0x20,0x20,0xA1,0x42},/*"预",57*/
{
0x00,0xFC,0x04,0x04,0x04,0x04,0xFC,0x90,0x90,0x90,0x90,0x12,0x12,0x12,0x0E,0x00},
{
0x20,0x13,0x12,0xFA,0x0A,0x12,0x13,0x38,0x54,0x94,0x10,0x11,0x11,0x12,0x14,0x18},/*"祝",58*/
{
0x00,0xFE,0x20,0x40,0xFC,0x04,0x24,0x24,0x24,0x24,0x24,0x44,0x50,0x88,0x04,0x02},
{
0x04,0x45,0x54,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x54,0x85,0x06},/*"顺",59*/
{
0x04,0x84,0x04,0x24,0x24,0x24,0xA4,0x24,0x24,0x24,0xA4,0x24,0x04,0x04,0x14,0x08},
{
0x01,0x07,0x7C,0x04,0x04,0x04,0xFF,0x0C,0x16,0x15,0x24,0x24,0x44,0x84,0x04,0x04},/*"利",60*/
- 添加了横屏和竖屏的汉字,并添加一个空白的汉字擦除汉字;
2、初始化OLED外设
//初始化部分外设
OLED_Init();
OLED_Clear();
3、进行按钮事件监听
KeyDownHandler(); //进行按钮事件监听
4、对Key2进行算法搭建
//点击Key2按键
if(isKey2Pressed()){
resetKey2();
//从右向左逐渐刷新显示汉字
for(int i=0;i<12;i++){
//i<12跳过调试确定汉字返回到右端,也可推导4+(64/16)*2
if(i ==0){
OLED_ShowCHinese(112-i*16,3,52); //显示1个汉字“预”
}
if(i ==1){
OLED_ShowCHinese(112-i*16,3,52);
OLED_ShowCHinese(112-((i-1)*16),3,53); //显示2个汉字“预祝”
}
if(i ==2){
OLED_ShowCHinese(112-i*16,3,52);
OLED_ShowCHinese(112-((i-1)*16),3,53);
OLED_ShowCHinese(112-((i-2)*16),3,54); //显示3个汉字“预祝顺”
}
if(i ==3){
OLED_ShowCHinese(112-i*16,3,52);
OLED_ShowCHinese(112-((i-1)*16),3,53);
OLED_ShowCHinese(112-((i-2)*16),3,54);
OLED_ShowCHinese(112-((i-3)*16),3,55); //显示4个汉字“预祝顺利”
}
if(i >=4 && i<=7){
for(int j=0;j<=4;j++){
OLED_ShowCHinese(112-(i-j)*16,3,52+j); //4个汉字向左滚动,可把该for循环单独封装成函数调用,优化算法
}
/*
OLED_ShowCHinese(112-i*16,3,52); //可以通过for循环优化算法,通过调用函数减少代码量
OLED_ShowCHinese(112-((i-1)*16),3,53);
OLED_ShowCHinese(112-((i-2)*16),3,54);
OLED_ShowCHinese(112-((i-3)*16),3,55);
OLED_ShowCHinese(112-((i-4)*16),3,56);*/
}
if(i>=8){
OLED_ShowCHinese(((i-7)*16),3,52);
OLED_ShowCHinese(((i-6)*16),3,53);
OLED_ShowCHinese(((i-5)*16),3,54);
OLED_ShowCHinese(((i-4)*16),3,55);
OLED_ShowCHinese(((i-8)*16),3,56); //4个汉字向右滚动
}
if(i ==11)
{
i=3; //汉字到达最右边框,重复滚动
}
HAL_Delay(1000); //每1秒滚动一次
if(isKey3Pressed() || isKey4Pressed()){
//点击Key3或者Key4清空屏幕,跳出该滚动循环
OLED_Clear();
break;
}
}
}
- 当汉字滚动到左边框时,需要添加向右滚动的算法;
- 当到达右边框时,可以改变 i 的值使汉字重新向左滚动,实现循环;
- 点击Key3或者Key4时,跳出该循环,文字按照key2和key3的要求实现滚动;
- 可对for循环封装成一个函数供调用,优化代码;
5、Key3和Key4可以根据Key2的逻辑直接套娃就行
三、实现总结:
- 先重点把Key2文字的滚动的算法,把滚动的算法弄明白后,把算法套在Key3和Key4按键上,改变一下坐标;
- 对于小编(新手)很难直接把滚动的算法写出来,只能通过一个界面调试好,然后调试第二个界面…然后梳理程序,把各个模块的程序总结到一起;
- 没有什么逻辑问题是if判断解决不了的,如果有,那就添加几个if判断;没有什么简单重复事件是for循环解决不了的,如果有,那再来几个for循环解决不了的;没有什么算法问题是if和for解决不了的,如果有,说明还没很好结合if和for。