1482 字
7 分钟
【蓝桥杯】02 - 第九届省赛题
题目要求

题目分析(思路)
-
首先,定义按键所控制的相关变量
-
编写数码管显示的逻辑,以”设置状态为准“,测试按键是否能正常控制相关参数(工作模式、流转间隔)
- 因为一共有四个工作模式,流转间隔定义为一个数组,存放各个元素的流转时长
-
将工作模式1的相关逻辑(LED流转方式)编写出来
- 这里使用一个指针用于LED的点亮(LED_OFF),另一个用于LED的熄灭(LED_ON)
-
将工作模式,流转间隔的逻辑与LED工作模式1关联,测试按键功能是否正常,LED是否能被流转间隔控制
-
如果以上程序测试正确,编写其他三个工作模式的LED模块
- 此时进行程序测试,功能正常,但是切换其他流转模式会有上一个模式的LED”残留“ (如双LED模式切换到单LED模式时),因此需要进行LED的复位(在按键控制模块中编写)
-
修改完毕后,编写亮度控制,此时注意到,一个定时器0无法满足对LED扫描的同时进行亮度控制,因此再调用定时器1,用于LED的扫描指针偏移,以及LED的PWM控制亮度。
- 这里修改完程序后,发现数码管闪烁,这是因为定时器1的频率较高,会打断主函数中数码管显示模块,因此将Nixie_Proc()函数放入定时器1中进行运行
-
当以上各个功能全部测试完毕后,调用EEPROM模块,保存流转间隔
程序部分
//头文件引用#include <Key.h>#include <Nixie.h>#include <LED.h>#include <Timer0.h>#include <Init.h>#include <iic.h>
unsigned char Nixie_Buf[8]={10,10,10,10,10,10,10,10};//数码管显示数据unsigned char Nixie_Pos;//数码管数据数组位下标unsigned char Nixie_Point[8]={0,0,0,0,0,0,0,0};//数码管每一段的“点”数据
unsigned char Key;//键值unsigned char Key_Up,Key_Down,Key_Val,Key_Old;//按键扫描变量
unsigned char ucLED[8]={0,0,0,0,0,0,0,0};//LED显示数据
unsigned int Nixie_Timer;//数码管定时更新unsigned int Key_Timer;//按键定时扫描
unsigned char Work_Mode;//工作模式参数 0-模式1 1-模式2 2-模式3 3-模式4unsigned char Set_Mode;// 0-数码管熄灭 1-模式编号 2-流转间隔unsigned char Nixie_FlashFlag;//闪烁标志位unsigned int Timer_800ms;//0.8s定时(闪烁用)
/**/unsigned int LED_Flow_Timer_Set[]={400,400,400,400};//流转间隔参数,控制流转速度unsigned int LED_Flow_Timer;//流转定时bit LED_Enable=0;//LED流转使能位,1时LED流转使能,默认LED流转启动unsigned char LED_Level_ShowFlag;//按下按键4显示LED亮度等级unsigned char LED_ON=0;//LED点亮指针unsigned char LED_OFF=7;//LED熄灭指针/*LED亮度控制相关参数*/unsigned char LED_Count;//LED显示周期unsigned char LED_Level;//LED等级unsigned char LED_Pos;//LED扫描位
void Key_Proc(void)//按键检测程序{ if(Key_Timer) return;//Key_Timer=0时执行下面的语句 Key_Timer=1;
/*按键扫描模块*/ Key_Val=Key_Read(); Key_Down=Key_Val & (Key_Old ^ Key_Val); Key_Up=~Key_Val & (Key_Old ^ Key_Val); Key_Old=Key_Val;
/*按键4按下*/ if(Key_Old 【蓝桥杯】02 - 第九届省赛题
http://www.turinblog.cn/posts/蓝桥杯02---第九届省赛题/