这次做项目时需要实现OLED屏幕上字符滚动的功能,从网上找到一个参考:https://blog.csdn.net/tbmmagic/article/details/111999673

int main(void)

{

delay_init(); //延时函数初始化

NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

OLED_Init(); //初始化OLED

OLED_Clear(0); //清屏(全黑)

OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动

OLED_WR_Byte(0x26,OLED_CMD); //水平向左或者右滚动 26/27

OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

OLED_WR_Byte(0x00,OLED_CMD); //起始页 0

OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔

OLED_WR_Byte(0x07,OLED_CMD); //终止页 7

OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节

TEST_MainPage(); //主界面显示测试

OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

}

void TEST_MainPage(void)

{

GUI_ShowString(28,0,"HELLO",16,1);

GUI_ShowCHinese(12,16,16,"欢迎来到重庆交通大学",1);

delay_ms(1500);

delay_ms(1500);

}

需要调用按键对切换屏幕上的菜单显示,修改数据。长时间未操作,切换到休眠页面,休眠时屏幕滚动显示时间,发生动作时解除休眠。

找到参考代码后,需要解决的一个问题时在while(1)循环里调用屏幕滚动的函数,出现字符无法滚动的现象。我使用了标志位解决了这个问题。

下面是我进行的改动

1 char row2[22]={0};2 u8 weakup_flag=1; //唤醒标志初始为1,3 //屏幕滚动函数

4 voidOLED_SleepShow()5 {6 OLED_Init(); //初始化OLED

7 OLED_Clear(); //清屏(全黑)

8 OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动

9 OLED_WR_Byte(0x26,OLED_CMD); //水平向左或者右滚动 26/27

10 OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

11 OLED_WR_Byte(0x00,OLED_CMD); //起始页 0

12 OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔

13 OLED_WR_Byte(0x07,OLED_CMD); //终止页 7

14 OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节

15 OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节16

17 //使用snprintf需要#include " " #include "stdio.h"或者#include "string.h" 忘了,百度一下

//这个语句太复杂了,作用就是将转换得到的str写入row2,之后显示在OLED屏幕上

18 snprintf(row2,22,"20%s-%s-%s %s:%s:%s",convert(tmp_time.year, 2, 0, 1, str),convert(tmp_time.mon, 2, 0, 1, str1),19 convert(tmp_time.day, 2, 0, 1, str2),convert(tmp_time.hour, 2, 0, 1, str3),convert(tmp_time.min, 2, 0, 1, str4)20 ,convert(tmp_time.sec, 2, 0, 1, str5));21 OLED_Print(0,2,row2,24); //调用相关的显示字符函数

22 delay_ms(1500);23 delay_ms(1500);24

25 OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

26 }27

28 ///*29 //* [convert 浮点型输出为字符串]30 //* @Author WC31 //* @DateTime 2019-06-2932 //* @param data [浮点数]33 //* @param digit [总位数]34 //* @param dec_digit [小数位数]35 //* @param mode [0:空格占位符 1:0占位符]36 //* @param buf [缓存区]37 //* @return [字符串]38 //*/

39 char* convert(float data, u8 digit, u8 dec_digit, u8 mode , char*buf)40 {41 if (mode == 0)42 {43 sprintf(strformat, "%%%d.%df", digit, dec_digit);44 }45 else if (mode == 1)46 {47 sprintf(strformat, "%%0%d.%df", digit, dec_digit);48 }49 sprintf(buf, strformat, data);50 returnbuf;51 }52

53 /*

54 屏幕唤醒判断55 按键按下或者档位发生变化 唤醒屏幕56 当前屏幕为主菜单且57 */

58 void WeakupScreen(Menu *menu,u8 key)59 {60 if((key!=0)||(gearposition!=0)) //按键按下或者档位变化

61 {62 time_flag=0;63 weakup_flag=1; //唤醒标志

64

65 }66 //当前是主菜单并且达到休眠时间,我这里是调用了TIM3定时器,一个溢出中断立一个time_flag.

67 if((menu->current==0)&&(time_flag>=dp.sleep_time))68 {69 time_flag=0;70 weakup_flag=0;71 }72 }73

74

75 intmain()76 {77 while(1)78 { //如果处于唤醒状态,就执行主要的功能函数,长时间未操作,休眠,切换标志位

79 if(weakup_flag==1)80 {81 //gearposition =GearPostion_Collect();

82 key_value=KEY_Scan(0);83 WeakupScreen(&menu,key_value); //通过键值得到Weakup标志位的值84 //key_control(&menu,key_value);85 //MenuSwitch(&menu,key_value);86 //ScreenSleepDect(&menu);

87 key_value=0; //清除标志位

88 }89 //休眠了,

90 if(weakup_flag==0)91 {92 OLED_SleepShow(); //滚动屏幕93 //如果没有这个while,会因为外面的while(1),导致一直刷新,无法滚动屏幕

94 while(!weakup_flag)95 {96 key_value=KEY_Scan(0);97 WeakupScreen(&menu,key_value);//判断是否被唤醒

98 key_value=0;99 }100 }101 }

stm32单片机屏幕一直闪_基于STM32单片机实现屏幕休眠后OLED屏幕滚动效果相关推荐

  1. stm32单片机屏幕一直闪_用STM32做一个微型掌上示波器项目——终于鼓起在大牛前献丑的无比勇气...

    这是我第一次在这个论坛上发表东西,其实本人进入芯片的世界的时间并不长,从接触51单片机到现在还不到一年,所以可以算是小白啦~想了很久,总算拿出在论坛大牛前献丑的无比勇气,写起该帖:dizzy::diz ...

  2. stm32中用到的实时系统_基于STM32平台的实时操作系统

    基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux.μC/OS-II.eCos.FreeRTOS和都江堰操作系统(djyos). 下面分别介绍这五种嵌入式操作系 ...

  3. stm32中用到的实时系统_基于STM32的实时语音处理系统设计

    基于 STM32 的实时语音处理系统设计 [摘要]设计一个基于 STM32 的实时语音处理系统.硬件模块通过放大. 除杂完成将语音信号转换成处理器能够进行高效处理的有效数字信号, 软件部分 主要涉及到 ...

  4. 单片机位寻址举例_基于80C51单片机位寻址编程

    80C51单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式.所谓位寻址,就是对内部RAM或可位寻址的特殊功能寄存器SFR内的某个位,直接加以置位为1或复位为0. 位寻址的范围,也就是 ...

  5. STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用

    STM32固件库(标准外设库)入门学习 第四章OLED屏幕使用 本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6. 文章目录 STM32固件库(标准外设库)入门学习 第 ...

  6. 检测噪声大小的c语言程序,单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计.doc...

    单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计 摘 要 本文以AT89S52 单片机为控制核心,通过播音判断电路寻找广播间歇时段,实时采集噪声环境内的噪音信 号,根据A/ D 转换 ...

  7. 单片机多功能电子琴课设_基于51单片机的多功能电子琴设计.doc

    基于51单片机的多功能电子琴设计 基于51单片机的多功能电子琴的设计 摘要 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器.它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编 ...

  8. 《电子DIY》之《单片机实践项目》之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解

    <电子DIY>之<单片机实践项目>之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解 添加链接描述

  9. 基于51单片机的太阳能追光系统 基于51单片机的锂电池太阳能充电器

    基于51单片机的太阳能追光系统 基于51单片机的锂电池太阳能充电器 基于51单片机的锂电池追光充电系统 具体功能:根据太阳光照方向改变光板朝向,利用太阳能给锂离子电池充电,实时显示上下左右四个方向不同 ...

最新文章

  1. Spring JdbcTemplate的queryForList(String sql , ClassT elementType)易错使用--转载
  2. 大S变汪太!与汪小菲注册结婚
  3. 俞军:产品经理必备的2个模型
  4. poj 3469(最小割)
  5. spark任务shell运行_《Spark快速大数据分析》- 根据简单例子理解RDD
  6. python基础3——运算符
  7. Linux运行脚手架vue,Linux Nodejs与vue脚手架详解
  8. 关于QQ非会员发图限制
  9. C#性能优化考虑的几个方向
  10. 移动端判断触摸的方向
  11. 分布式跟踪系统:Zipkin
  12. 给datalist加自动编号(解决博客的第XX楼)
  13. Java中级工程师面试题
  14. 【正点原子STM32连载】 第三十三章 光敏传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  15. 设置导航栏字体大小,颜色和加粗字体的方法
  16. Matlab顶级期刊配色工具Rggsci
  17. 高通挥刀 | 一点财经
  18. 统计学中的标准差(SD)和 平均值的标准误差(SEM)的区别
  19. 专业数据恢复,还是选择迷你兔
  20. 万字长文,助你掌握数据库排序算法

热门文章

  1. 微信群服务器失败是什么原因,为什么微信群转让群主失败?微信群转让群主方法是什么?...
  2. aps是什么意思_APS系统是什么意思?起什么作用
  3. 改造vue-quill-editor: 结合element-ui上传图片到服务器
  4. 中国科学院大学(国科大)未选课程加入课程网站(旁听蹭课专用!!!)
  5. 申宝策略-沪指放量上行
  6. 大连化物所周雍进组PNAS|改造毕赤酵母实现甲醇高效合成脂肪酸衍生物
  7. 文明5美丽新世界神系信条作用及评价
  8. SVN入门及配置使用(多平台)
  9. 【java】奇数双阶乘计算
  10. 添加 “Microsoft Word 97 - 2003 文档” 右键功能菜单