在单片机编程中如何记住led的状态(亮度),只靠标志位

tianqi911 2018-06-13 12:47:40
有一个单片机问题,单按键,短按就是开,然后短按一次进入一个状态(一种亮度);长按2秒或以上就关机;

问题来了,再短按,开机还是长按结束之前的状态(亮度是之前的)。不使用rom,flash什么的,就是靠程序。

高人指点下吧,给点思路也是好的。
搞了一天了,没实现。


...全文
1190 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianqi911 2018-06-25
  • 打赏
  • 举报
回复
用case if-else 加标志位实现了。就是状态机。不用存储功能。就到哪一档了,靠标志位记住pwm的参数。
of123 2018-06-15
  • 打赏
  • 举报
回复
如果你坚持不能用 Flash 或 EPROM 这一类非易失性存储器的话,那就在关机时不要使芯片下电,仅仅关掉 LED 等显示性外设。 常见的设备关机时是使芯片下电的,轻触开机仅仅是采用上电自锁机制,保持供电。
of123 2018-06-15
  • 打赏
  • 举报
回复
看了好多遍,总算把楼主的问题看明白了。 楼主讨论的,实际上是关机(下电)后信息的保留问题。从信息论的角度看,其实他要保留的只不过是 1 bit 信息。 但是,这信息必须保留在非易失性存储器中。因为重新上点后,无论易失性存储器、寄存器还是程序状态,全都复位了。也就是说,无法保持原有的信息。你必须借助 Flash 或 EEPROM 这一类非易失性存储器保存最新的状态。 你可以在长按 2 秒的事件处理流程中,加入信息保存的操作。 如果你的芯片中集成的是 NOR Flash,那它是块擦除、字节写的。你可以用 2 比特表示当前的状态。 11 Null,也就是尚未写入信息。 01 初始状态。 00 高亮状态。 使用 2-bit,是因为我们需要附加的信息,即最后写入信息的位置。 每次写入时,找到 2-bit 序列的第一个 11,写入你的当前状态。当一块已经写满时,擦除块,在最低地址的最前 2-bit 写入状态。 上电后,查找最后一个不是 11 的 2-bit 单元。这就是你要找到的最新的关机前状态。 当然,你也可以选择每次都可能需要擦除块的方案,记录永远写在块的固定位置,例如开头。这样,你可以用 1-bit 信息:1 表示初始状态,0 表示高亮状态。 当你要写入时,如果新状态与原来写入的状态相同,就什么都不做。(其实上一个方案也可以这样做。) 如果原来是 1,现在要写 0,就直接写入。 如果原来是 0,现在要写 1,就擦除块。不用写,擦后就是 1。 此方案擦除的概率较高,会缩短 Flash 的寿命,同时也会使完成保存关机的时间加长。
笨狗先飞 2018-06-14
  • 打赏
  • 举报
回复
如果关机只是休眠模式的话,状态记在内存里就可以了, 如果关机会掉电的话,没有eeprom flashrom这些存储器的话,记忆肯定是丢失了.
of123 2018-06-14
  • 打赏
  • 举报
回复
我控制循环切换的方法,就是与 1 异或,自动从 1 变 1,再从 1 变 0。都不用标志变量,直接对控制寄存器中的位异或。
dceacho 2018-06-14
  • 打赏
  • 举报
回复
楼主问题没说明白 两个问题,你现在想要解决哪一个? 1. PWM控制LED亮度 2.掉电存储
tianqi911 2018-06-14
  • 打赏
  • 举报
回复
使用PWM做。
ckc 2018-06-13
  • 打赏
  • 举报
回复
关机的时候单片机是什么状态?如果是掉电之类的状态ram不丢数据的,那就用一个状态标记一下就行了 如果关机的时候ram丢 数据,那就只能写到eeprom之类的东西里
fly 100% 2018-06-13
  • 打赏
  • 举报
回复
用pwm控制的亮度?

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧