1.任务需求
基于MS16F3211芯片实现功能一个按键通过长按可以控制当前处于亮状态的灯的亮度,当灯从最亮达到最暗时,所用时为3s。现有三盏颜色分别为红绿蓝的灯,在处于关机状态时红灯亮,处于开机状态时红灯灭。点按第一次仅绿灯亮,点按第二次仅蓝灯亮,点按第三次绿灯和蓝灯齐亮,点按第四次回到初始状态。
实现效果:当仅绿灯亮时,第一次长按按键绿灯状态改变,再次长按按键绿灯会往相反的方向变化,并且在达到极点时,停止调节。蓝灯与绿灯的亮度相互独立,互不影响。在两灯均亮的时候,此时长按按键依旧会造成亮度的改变,但是会由于亮度在前面单独调节不同导致调节所到极点的时间不一样。但是共同点在调节到极点时如果不松开按键亮度均不发生变化。直至双灯亮度均达到极点,此时系统亮度恒定。
2.系统流程拆分
2.1从 芯片原理图选择合适的IO口
2.2实现短按按键控i制灯的亮灭
判断按键按下或者释放主要使用的是基于触摸库衍生出来的用户函数
基于这个初步对GPIO初始化,并且在按键执行函数内进行对GPIO的高低电平进行翻转就可以实现了
2.3 实现长按按键控制灯的亮度变化
因为要需要根据按键按下的时间长短来控制亮度值变化的大小,所以采用TP0定时器进行PWM波的输出。按下的时间越久,进入定时器中断的次数越多,此时亮度就会相较初始值变化得越大。
当配置好TP0寄存器时,然后将INTEN中的bit4置1,那么在定时器计数溢出时INTFLAG寄存器的中断标志位bit4TP0IF会置1。根据这个原理我们就可以在按键按下时将TPOIE置1,开启定时器中断,对亮度进行控制。在松开按键时将TPOIE置0.此时停止对亮度的控制
当TP0在计数值达里将FFF时会溢出,此时溢出标志位会置1。
此时在定时器中断里对TP0IF这个标志位进行软件复位,那么就可以达到每发生一次定时器中断就可以进行一次亮度调节。
ps:提供每个 PWM 周期溢出中断,但中断共用同一个向量入口
2.4实现2s控制灯的亮度可以由一个极点达到另一个极点
如果需要更改不同的占空比也是一样原理。
在程序中采用的定时器为12位定时位定时器,最大值为FFF,采用定时的方法是每触发一次定时器中断数值减1。所以占空比数值选择在0到2000。当占空比为0时此时PWM占空比的数值应该为2095。据此,把周期寄存器的值也设定为2095。具体的流程就是1s内PWM溢出1000次,而溢出的话需要计数次数为4095-2095=2000次。所以1s内的计数次数为1000乘2000等于2M次。此时在软件上设置内部时钟频率为8MHZ,再设置起始的分频为2分频,再通过寄存器进行二分频。那么就可以达到8/2/2=2MHZ。
2.5 实现短按控制灯的状态切换
其实第一步通过GPIO来控制的置1或者0来控制灯的亮灭是可行的,但是在控制灯的亮灭的同时需要控制在灯亮灭亮的变化的同时还需要保持灯的亮度不变。这个时候就需要通过PWM来控制了。
其实主要也是通过寄存器来控制PWM的使能和失能
2.6实现根据当前灯的状态来控制当前灯的亮度,也就是分隔开来
,
在中断服务函数内进行对灯状态的判断来执行相应的操作
2.7 实现长按时两次长按会让灯的亮度往不同方向变化
其实也就是在下一次接收到按键按下的数据的时候判断上一次按键是否释放来判断是否完成了一次按键的的长按操作。如果完成了的话就对标志位进行改变
2.8 分隔长按和短按
在检测到按键按下使对一个变量累加,然后根据变量的数值来判断是长按还是短按。
3.订正修改功能
3.1 在处于关机状态时需要处于休眠状态
此时需要对